建議訊息
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
物件,例如 ConsumerInfo
、ProducerInfo
、ConnectionInfo
。
例如:
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 |
連線啟動和停止訊息。 | ConnectionInfo 、RemoveInfo |
|
ActiveMQ.Advisory.Producer.Queue |
佇列上的生產者啟動和停止訊息。 | String='producerCount' - 生產者數量 |
ProducerInfo |
ActiveMQ.Advisory.Producer.Topic |
主題上的生產者啟動和停止訊息。 | String='producerCount' - 生產者數量 |
ProducerInfo |
ActiveMQ.Advisory.Consumer.Queue |
佇列上的消費者啟動和停止訊息。 | String='consumerCount' - 消費者數量 |
ConnectionInfo 、RemoveInfo |
ActiveMQ.Advisory.Consumer.Topic |
主題上的消費者啟動和停止訊息。 | String='consumerCount' - 消費者數量 |
ConnectionInfo 、RemoveInfo |
請注意,消費者啟動/停止建議訊息也具有 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 ;如果橋接器已停止,則為 false 。Boolean="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套件中提供了一些用於處理通知訊息的輔助類別。