ActiveMQ Message properties

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
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
打開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"

使用的方法和步驟:
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方法來得到具體的信息對象,如:
if (message instanceof ActiveMQMessage) {
    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(); }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章