一、消息属性
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(); }