一、消息属性

ActiveMQ支持很多消息属性,具体可以参见


  http://activemq.apache.org/activemq-message-properties.html

常见的一些属性说明

 1:Queue的消息默认是持久化的

 2:消息的优先级默认是4

 3:消息发送时设置了时间戳

 4:消息的过期时间默认是永不过期,过期的消息进入DLQ,可以配置DLQ及其处理策略

 5:如果消息时重发的,将会标记出来

 6:JMSReplyTo标识响应消息发送到哪个Queue

 7:JMSCorelationID标识此消息相关联的消息id,可以用这个标识把多个消息连接起来

 8:JMS同时也记录了消息重发的次数,默认是6次

 9:如果有一组关联的消息需要处理,可以分组:只需要设置消息组的名字和这个消息是第几个消息

 10:如果消息中一个事务环境,则TXID将被设置

 11:此外ActiveMQ在服务器端额外设置了消息入列和出列的时间戳

 12:ActiveMQ里消息属性的值,不仅可以用基本类型,还可以用List或Map类型

二、自身的系统消息地址(Advisory Message)

2.1 简介

Advisory Message是ActiveMQ自身的系统消息地址,可以监听该地址来获取activemq的系统信息。

目前支持获取如下信息:

1:consumers, producers 和 connections的启动和停止

2:创建和销毁temporary destinations

3:topics 和 queues的消息过期

4:brokers 发送消息给 destinations,但是没有consumers

5:connections 启动和停止


几点说明:

 1:所有Advisory的topic,前缀是:ActiveMQ.Advisory

 2:所有Advisory的消息类型是:‘Advisory’ ,所有的Advisory都有的消息属性有:

    originBrokerId、originBrokerName、originBrokerURL

 3:具体支持的topic和queue,请参看http://activemq.apache.org/advisory-message.html 

2.2 配置使用

打开Advisories , 默认Advisory的功能是关闭的

<destinationPolicy>
    <policyMap>
        <policyEntries>
            <policyEntry topic=">" advisoryForConsumed="true" />
        </policyEntries>
    </policyMap>
</destinationPolicy>

关闭Advisories , 有好几种方法

1:<broker advisorySupport="false">

2:也可在Java中写

BrokerService broker = new BrokerService();
broker.setAdvisorySupport(false);
...
broker.start();

3:也可以在ActiveMQConnectionFactory上设置‘watchTopicAdvisories’ 属性

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();

factory.setWatchTopicAdvisories(false);

4:也可在ConnectionURl上写:

"tcp://localhost:61616?jms.watchTopicAdvisories=false"


2.3 使用的方法和步骤

1:要在配置文件里面开启Advisories

2:消息发送端没有变化

3:消息接收端:

(1)根据你要接收的信息类型,来设置不同的topic,当然也可以使用AdvisorySupport这个类来辅助创建,

   比如你想要得到消息生产者的信息,你可以:

    Topic d=session.createTopic("ActiveMQ.Advisory.Producer.Topic.MyTopic");

   也可以使用:

    Topic d = session.createTopic("MyTopic");

    Destination d2 = AdvisorySupport.getProducerAdvisoryTopic(destination);

(2)由于这个topic默认不是持久化的,所以应该先开启接收端,然后再发送topic信息

(3)接收消息的时候,接收到的消息类型是ActiveMQMessage,所以类型转换的时候,要转换成ActiveMQMessage,

   然后再通过getDataStructure方法来得到具体的信息对象,如:

    try {
        ActiveMQMessage aMsg = (ActiveMQMessage) message;
	ProducerInfo prod = (ProducerInfo) aMsg.getDataStructure();
	System.out.println("count==="+aMsg.getProperty("producerCount"));
	System.out.println("prodd==="+prod.getProducerId());
    } catch (Exception e) {
        e.printStackTrace();
    }