建議訊息

功能 > 訊息功能 > 建議訊息

ActiveMQ Classic 支援建議訊息,讓您可以使用常規 JMS 訊息來監控系統。目前,我們提供的建議訊息支援:

  • 消費者、生產者和連線的啟動和停止
  • 暫時性目的地的建立和銷毀
  • 主題和佇列上訊息的過期
  • 代理程式將訊息傳送到沒有消費者的目的地。
  • 連線的啟動和停止

建議訊息可以被視為某種管理通道,您可以在此接收關於 JMS 提供程式上正在發生的事情,以及生產者、消費者和目的地的相關資訊。當您透過 JMX 查看代理程式時,您會看到建議主題的前綴為 ActiveMQ.Advisory.

每個建議訊息都有訊息類型 Advisory 和一些預定義的訊息屬性

屬性 類型 描述 版本
originBrokerId StringProperty 發出建議訊息的代理程式 ID。 5.x
originBrokerName StringProperty 發出建議訊息的代理程式名稱。 5.x
originBrokerURL StringProperty 發出建議訊息的代理程式的第一個 URL。 5.2

此外,有些訊息攜帶一個 Command 物件,其中包含關於建議訊息性質的額外資訊,例如,對每個目的地的訂閱都會返回一個 ActiveMQMessage。可以使用 ActiveMQMessage.getDataStructure() 來檢索特定的 DataStructure 物件,例如 ConsumerInfoProducerInfoConnectionInfo

例如:

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);
        }
    }
}

支援下列建議主題:

基於用戶端的建議訊息

提示

這些總是會產生。

建議主題 描述 屬性 資料結構
ActiveMQ.Advisory.Connection 連線啟動和停止訊息。   ConnectionInfoRemoveInfo
ActiveMQ.Advisory.Producer.Queue 佇列上的生產者啟動和停止訊息。 String='producerCount' - 生產者數量 ProducerInfo
ActiveMQ.Advisory.Producer.Topic 主題上的生產者啟動和停止訊息。 String='producerCount' - 生產者數量 ProducerInfo
ActiveMQ.Advisory.Consumer.Queue 佇列上的消費者啟動和停止訊息。 String='consumerCount' - 消費者數量 ConnectionInfoRemoveInfo
ActiveMQ.Advisory.Consumer.Topic 主題上的消費者啟動和停止訊息。 String='consumerCount' - 消費者數量 ConnectionInfoRemoveInfo

請注意,消費者啟動/停止建議訊息也具有 consumerCount 標頭,以指示在傳送建議訊息時目的地上的活動消費者數量。這表示您可以使用以下選取器來在給定目的地上沒有活動消費者時收到通知:

consumerCount = 0

基於目的地和訊息的建議訊息

建議主題 描述 屬性 資料結構 預設值 PolicyEntry 屬性
ActiveMQ.Advisory.Queue 佇列建立和銷毀。 null DestinationInfo true none
ActiveMQ.Advisory.Topic 主題建立和銷毀。 null DestinationInfo true none
ActiveMQ.Advisory.TempQueue 暫時性佇列建立和銷毀。 null DestinationInfo true none
ActiveMQ.Advisory.TempTopic 暫時性主題建立和銷毀。 null DestinationInfo true none
ActiveMQ.Advisory.Expired.Queue 佇列上已過期的訊息。 String='orignalMessageId' - 已過期的 ID 訊息 true none
ActiveMQ.Advisory.Expired.Topic 主題上已過期的訊息。 String='orignalMessageId' - 已過期的 ID 訊息 true none
ActiveMQ.Advisory.NoConsumer.Queue 沒有可用的消費者來處理在佇列上傳送的訊息。 null 訊息 false sendAdvisoryIfNoConsumers
ActiveMQ.Advisory.NoConsumer.Topic 沒有可用的消費者來處理在主題上傳送的訊息。 null 訊息 false sendAdvisoryIfNoConsumers

提示

NoConsumer 主題建議訊息僅針對非持久性訊息傳送。

5.2 版中的新建議訊息

建議主題 描述 屬性 資料結構 預設值 PolicyEntry 屬性
ActiveMQ.Advisory.SlowConsumer.Queue 慢速佇列消費者。 String='consumerId' - 消費者 ID ConsumerInfo false advisoryForSlowConsumers
ActiveMQ.Advisory.SlowConsumer.Topic 慢速主題消費者。 String='consumerId' - 消費者 ID ConsumerInfo false advisoryForSlowConsumers
ActiveMQ.Advisory.FastProducer.Queue 快速佇列生產者。 String='producerId' - 生產者 ID ProducerInfo false advisoryForFastProducers
ActiveMQ.Advisory.FastProducer.Topic 快速主題生產者。 String='consumerId'’ - 生產者 ID ProducerInfo false advisoryForFastProducers
ActiveMQ.Advisory.MessageDiscarded.Queue 訊息已捨棄。 String='orignalMessageId' - 已捨棄的 ID 訊息 false advisoryForDiscardingMessages
ActiveMQ.Advisory.MessageDiscarded.Topic 訊息已捨棄。 String='orignalMessageId' - 已捨棄的 ID 訊息 false advisoryForDiscardingMessages
ActiveMQ.Advisory.MessageDelivered.Queue 訊息已傳遞至代理程式。 String='orignalMessageId' - 已傳遞的 ID 訊息 false advisoryForDelivery
ActiveMQ.Advisory.MessageDelivered.Topic 訊息已傳遞至代理程式。 String='orignalMessageId' - 已傳遞的 ID 訊息 false advisoryForDelivery
ActiveMQ.Advisory.MessageConsumed.Queue 訊息由用戶端使用。 String='orignalMessageId' - 已傳遞的 ID 訊息 false advisoryForConsumed
ActiveMQ.Advisory.MessageConsumed.Topic 訊息由用戶端使用。 String='orignalMessageId' - 已傳遞的 ID 訊息 false advisoryForConsumed
ActiveMQ.Advisory.FULL Usage 資源已達其限制。 String='usageName' - Usage 資源的名稱 null false advisoryWhenFull
ActiveMQ.Advisory.MasterBroker 代理程式現在是主/從組態中的主節點。 null null true none

5.4 版中的新建議訊息

建議主題 描述 屬性 資料結構 預設值 PolicyEntry 屬性
ActiveMQ.Advisory.MessageDLQd.Queue 已傳送到 DLQ 的訊息。 String='orignalMessageId' - 已傳遞的 ID 訊息 總是開啟 advisoryForConsumed
ActiveMQ.Advisory.MessageDLQd.Topic 已傳送到 DLQ 的訊息。 String='orignalMessageId' - 已傳遞的 ID 訊息 總是開啟 advisoryForConsumed

網路橋接器建議訊息

從 ActiveMQ Classic 5.5 版開始,您可以監看與網路橋接器狀態相關事件的建議主題。您可以在網路橋接器啟動或停止時取得建議訊息。

建議主題 描述 屬性 資料結構 預設值
ActiveMQ.Advisory.NetworkBridge 網路橋接器正在停止或啟動。 Boolean="started" - 如果橋接器已啟動,則為 true;如果橋接器已停止,則為 falseBoolean="createdByDuplex" - 如果橋接器是由遠端網路連接器建立,則為 true BrokerInfo - 提供遠端代理程式的資料 總是開啟

啟用預設為停用的建議訊息

預設未開啟的建議訊息(請參閱最後一欄)可以在 ActiveMQ Classic 代理程式組態中的 PolicyEntry 上啟用,例如,若要啟用訊息已使用建議訊息,您可以設定以下內容:

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

提示

> 字元會符合所有主題 - 您可以使用萬用字元符合來設定目的地原則 - 請參閱 萬用字元

停用建議訊息

使用建議訊息會在記憶體和連線資源方面產生少量的額外負擔,這與系統中的目的地數量相關。在某些情況下,停用所有建議訊息可能是有意義的。

建議訊息需要在代理程式上透過 XML 組態停用:

<broker advisorySupport="false">

或是透過 Java 程式碼停用:

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

以及在您的 ActiveMQConnectionFactory 上(因為訂閱建議主題會自動建立它)透過 brokerUrl 停用:

tcp://127.0.0.1:61616?jms.watchTopicAdvisories=false

或是透過 Java 程式碼,使用 ActiveMQConnectionFactory 上的 watchTopicAdvisories 屬性停用。

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
factory.setWatchTopicAdvisories(false);

警告

建議訊息是 動態網路代理程式拓撲所必需的,因為 NetworkConnectors 會訂閱建議訊息。在沒有建議訊息的情況下,網路必須靜態設定。

使用目的地

上述所有目的地實際上都是前綴,附加了重要資訊(例如實際的主題或佇列、用戶端 ID、生產者 ID、消費者 ID 等)。這讓您可以重複使用發布/訂閱、萬用字元選取器的功能,以便根據您的需求篩選建議訊息。

例如,如果您想要訂閱主題 FOO.BAR 上已過期的訊息,您可以訂閱 ActiveMQ.Advisory.Expired.Topic.FOO.BAR。若要訂閱特定類型建議訊息的所有訊息,只需將 .> 附加至主題,例如,若要訂閱所有主題和佇列的消費者啟動和停止訊息,請訂閱 ActiveMQ.Advisory.Consumer..>

輔助方法

透過以下方法,可以在 AdvisorySupport 中取得建議目的地物件的方法。

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

// 版本 5.2 及以上

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

advisories套件中提供了一些用於處理通知訊息的輔助類別。

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛標誌和 Apache ActiveMQ 專案標誌是 The Apache Software Foundation 的商標。版權所有 © 2024,The Apache Software Foundation。授權條款為 Apache License 2.0