ActiveMQ supports advisory messages which allows you to watch the system using regular JMS messages. Currently we have advisory messages that support

  • consumers, producers and connections starting and stopping
  • temporary destinations being created and destroyed
  • messages expiring on topics and queues
  • brokers sending messages to destinations with no consumers.
  • connections starting and stopping

Advisory messages can be thought as some kind of administrative channel where you receive information regarding what is happening on your JMS provider along with whats happening with producers, consumers and destinations.

When you look at a broker via JMX you will see the advisory topics prefixed with ActiveMQ.Advisory..

Every Advisory has the message type 'Advisory' and some predefined message properties:

property name type description version
originBrokerId StringProperty the id of the broker where the advisory originated 5.x
originBrokerName StringProperty the name of the broker where the advisory originated 5.x
originBrokerURL StringProperty the first URL of the broker where the advisory originated 5.2

In addition, some messages carry a Command object - which carries more information for the advisory - e.g.

A subscription to each of the destination returns an ActiveMQMessage. Specific DataStructure objects (ie. ConsumerInfo, ProducerInfo,ConnectionInfo) can be retrieve via getDataStructure method of ActiveMQMessage.

For example:

...

    Destination advisoryDestination = AdvisorySupport.getProducerAdvisoryTopic(destination)
    MessageConsumer consumer = session.createConsumer(advisoryDestination);
    consumer.setMessageListener(this);
....
public void onMessage(Message msg){
    if (msg instanceof ActiveMQMessage){
        try {
             ActiveMQMessage aMsg =  (ActiveMQMessage)msg;
             ProducerInfo prod = (ProducerInfo) aMsg.getDataStructure();
        } catch (JMSException e) {
            log.error("Failed to process message: " + msg);
        }
    }
}

The following advisory topics are supported

Client based advisories

Advisory Topics Description properties Data Structure
ActiveMQ.Advisory.Connection Connection start & stop messages
ActiveMQ.Advisory.Producer.Queue Producer start & stop messages on a Queue String='producerCount' - the number of producers ProducerInfo
ActiveMQ.Advisory.Producer.Topic Producer start & stop messages on a Topic String='producerCount' - the number of producers ProducerInfo
ActiveMQ.Advisory.Consumer.Queue Consumer start & stop messages on a Queue String='consumerCount' - the number of Consumers ConsumerInfo
ActiveMQ.Advisory.Consumer.Topic Consumer start & stop messages on a Topic String='consumerCount' - the number of Consumers ConsumerInfo

Note that the consumer start/stop advisory messages also have a consumerCount header to indicate the number of active consumers on the destintation when the advisory message was sent. This means you can use the following selector to be notified when there are no active consumers on a given destination...

consumerCount = 0

Destination and Message based advisories

Advisory Topics Description properties Data Structure
ActiveMQ.Advisory.Queue Queue create & destroy null null
ActiveMQ.Advisory.Topic Topic create & destroy null null
ActiveMQ.Advisory.TempQueue Temporary Queue create & destroy null null
ActiveMQ.Advisory.TempTopic Temporary Topic create & destroy null null
ActiveMQ.Advisory.Expired.Queue Expired messages on a Queue String='orignalMessageId' - the expired id Message
ActiveMQ.Advisory.Expired.Topic Expired messages on a Topic String='orignalMessageId' - the expired id Message
ActiveMQ.Advisory.NoConsumer.Queue No consumer is available to process messages being sent on a Queue null null
ActiveMQ.Advisory.NoConsumer.Topic No consumer is available to process messages being sent on a Topic null null

New advisories in version 5.2

Advisory Topics Description properties Data Structure
ActiveMQ.Advisory.SlowConsumer.Queue Slow Queue Consumer String='consumerId' - the consumer id ConsumerInfo
ActiveMQ.Advisory.SlowConsumer.Topic Slow Topic Consumer String='consumerId' - the consumer id ConsumerInfo
ActiveMQ.Advisory.FastProducer.Queue Fast Queue producer String='producerId' - the producer id ProducerInfo
ActiveMQ.Advisory. FastProducer.Topic Fast Topic producer String='consumerId' - the producer id ProducerInfo
ActiveMQ.Advisory.MessageDiscarded.Queue Message discarded String='orignalMessageId' - the discarded id Message
ActiveMQ.Advisory.MessageDiscarded.Topic Message discarded String='orignalMessageId' - the discarded id Message
ActiveMQ.Advisory.MessageDelivered.Queue Message delivered to the broker String='orignalMessageId' - the delivered id Message
ActiveMQ.Advisory.MessageDelivered.Topic Message delivered to the broker String='orignalMessageId' - the delivered id Message
ActiveMQ.Advisory.MessageConsumed.Queue Message consumed by a client String='orignalMessageId' - the delivered id Message
ActiveMQ.Advisory.MessageConsumed.Topic Message consumed by a client String='orignalMessageId' - the delivered id Message
ActiveMQ.Advisory.FULL A Usage resource is at its limit String='usageName' - the name of Usage resource null
ActiveMQ.Advisory.MasterBroker A broker is now the master in a master/slave configuration null null

Using the destinations

All of the above destinations are really prefixes which are appended with important information (like the actual topic or queue, the client ID, producer ID, consumer ID etc). This allows you to reuse the power of publish/subscribe, Wildcards and Selectors to filter the advisory messages as you see fit.

For example if you want to subscribe to expired messages on a topic FOO.BAR you could subscribe to ActiveMQ.Advisory.Expired.Topic.FOO.BAR. To subscribe to all messages of a certain kind of advisory just append .> to the topic.

e.g. to subscribe to all the consumers starting and stopping to topics and queues subscribe to ActiveMQ.Advisory.Consumer..>.

Helper methods

Methods to get the advisory destination objects are available in AdvisorySupport through the following methods.

AdvisorySupport.getConsumerAdvisoryTopic()
AdvisorySupport.getProducerAdvisoryTopic()
AdvisorySupport.getExpiredTopicMessageAdvisoryTopic()
AdvisorySupport.getExpiredQueueMessageAdvisoryTopic()
AdvisorySupport.getNoTopicConsumersAdvisoryTopic()
AdvisorySupport.getNoQueueConsumersAdvisoryTopic()
AdvisorySupport.getDestinationAdvisoryTopic()
AdvisorySupport.getExpiredQueueMessageAdvisoryTopic()
AdvisorySupport.getExpiredTopicMessageAdvisoryTopic()
AdvisorySupport.getNoQueueConsumersAdvisoryTopic()
AdvisorySupport.getNoTopicConsumersAdvisoryTopic()

//Version 5.2 onwards


AdvisorySupport.getSlowConsumerAdvisoryTopic()
AdvisorySupport.getFastProducerAdvisoryTopic()
AdvisorySupport.getMessageDiscardedAdvisoryTopic()
AdvisorySupport.getMessageDeliveredAdvisoryTopic()
AdvisorySupport.getMessageConsumedAdvisoryTopic()
AdvisorySupport.getMasterBrokerAdvisoryTopic()
AdvisorySupport.getFullAdvisoryTopic()

Some helper classes to deal with advisory messages are available in the advisories package.

For users of previous releases see the Advisory Support in ActiveMQ 3

Graphic Design By Hiram