---
layout: default
title: ActiveMQ Connector
toc: false
---
[STOMP]: http://stomp.codehaus.org/
The ActiveMQ connector uses the [STOMP] rubygem to connect to ActiveMQ servers. It is specifically optimiszed for ActiveMQ
and uses features in ActiveMQ 5.5.0 and later.
This code will only work with version _1.1.8_ or newer of the Stomp gem.
## Differences between ActiveMQ connector and Stomp Connector
The ActiveMQ connector requires MCollective 2.0.0 or newer and introduce a new structure to the middleware messsages.
* Replies goes direct to clients using short lived queues
* Agent topics are called */topic/<collective>.<agent_name>.agent*
* Support for point to point messages are added by using _/queue/<collective>.nodes_ and using JMS selectors.
The use of short lived queues mean that replies are now going to go back only to the person who sent the request.
This has big impact on overall CPU usage by clients on busy networks but also optimize the traffic flow on
networks with many brokers.
Point to Point messages means each node has a unique subscription, the approach using JMS Selectors means
internally to ActiveMQ only a single thread will be dedicated to this rather than 1 per connected node.
Before using this plugin you will need to make appropriate adjustments to your ActiveMQ Access Control Lists.
## Configuring ActiveMQ
For best behavior there are a few settings you need in your _activemq.xml_
### Remove unused queues
We use uniquely named queues for replies. As queues will live forever we need to get ActiveMQ to remove
queues we are done with else they will just add up and grow forever.
{% highlight xml %}
{% endhighlight %}
The above policy will instruct ActiveMQ to remove dead queues after 5 minutes.
### Optimize network usage for direct requests in a network of brokers
If you are using a network of brokers you will need to make a big change to how that works.
At present we tend to have 1 bi-directional connection for everything, with direct requests
we dedicate a bi-directional connection for these queues leaving the other just for topics.
{% highlight xml %}
{% endhighlight %}
You will need to adjust the TTL for your network. Note the queue connection has a different
_conduitSubscriptions_ policy than the topic one, you have to create these different connections
and set this policy for everything to work correctly.
## Configuring MCollective
### Common Options
The most basic configuration method is supported in all versions of the gem:
### Failover Pools
A sample configuration can be seen below. Note this plugin does not support the old style config of the Stomp connector.
{% highlight ini %}
connector = activemq
plugin.activemq.pool.size = 2
plugin.activemq.pool.1.host = stomp1
plugin.activemq.pool.1.port = 6163
plugin.activemq.pool.1.user = me
plugin.activemq.pool.1.password = secret
plugin.activemq.pool.2.host = stomp2
plugin.activemq.pool.2.port = 6163
plugin.activemq.pool.2.user = me
plugin.activemq.pool.2.password = secret
{% endhighlight %}
This gives it 2 servers to attempt to connect to, if the first one fails it will use the second. Usernames and passwords can be set
with the environment variables STOMP_USER, STOMP_PASSWORD.
If you do not specify a port it will default to _61613_
You can also specify the following options for the Stomp gem, these are the defaults in the Stomp 1.1.6 gem:
{% highlight ini %}
plugin.activemq.initial_reconnect_delay = 0.01
plugin.activemq.max_reconnect_delay = 30.0
plugin.activemq.use_exponential_back_off = true
plugin.activemq.back_off_multiplier = 2
plugin.activemq.max_reconnect_attempts = 0
plugin.activemq.randomize = false
plugin.activemq.timeout = -1
{% endhighlight %}
### Message Priority
ActiveMQ messages support priorities, you can pass in the needed priority header by setting:
{% highlight ini %}
plugin.activemq.priority = 4
{% endhighlight %}