ActiveMQ順序消費消息+消息分組

簡介

Queue中的消息是按照順序發送給Consumers的。然而,當你有多個Consumer同時從相同的Queue提取消息時,順序將不能得到保證。因爲這些消息時被多個線程併發的處理。但是,有時候保證消息的順序是很重要的。例如,你可能不希望插入訂單操作結束之前執行更新訂單的操作。那麼我們可以通過Exclusive Consumer和Message Groups來實現這一目的。

獨有消費者

從ActiveMQ4.X版本開始支持ExclusiveConsumer(或者說是Exclusive Queues)。Broker會從多個Consumer中挑選一個Consumer來處理所有的消息,從而保證消息的有序處理。如果這個Consumer失效,那麼Broker會自動切換到其他的Consumer。

可以通過Destination的Option來創建一個Exclusive Consumer,如下:

queue = new ActiveMQQueue("Test.Queue?consumer.exclusive=true");
consumer = session.createConsumer(queue);

另外,還可以給Consumer設置優先級,以便針對網絡情況進行優化。如下:

queue = new ActiveMQQueue("Test.Queue?consumer.exclusive=true&consumer.priority=10");

消息分組

從Apache官方文檔的話說,是Exclusive Consumer功能的增強。邏輯上,可以看成是一種併發的Exclusive Consumer。JMS消息屬性JMXGroupID被用來區分Message Group。Message Groups特性保證所有具有相同JMSGroupID的消息會被分發到相同的Consumer(只要這個Consumer保持Active)。另一方面,Message Groups也是一種負載均衡的機制。

在一個消息被分發到Consumer前,Broker會檢查消息的JMSGroupID屬性。如果存在,那麼broker會檢查是否有某個Consumer擁有這個Message Group。如果沒有,那麼broker會選擇一個Consumer,並將它關聯到這個Message Group。此後,這個Consumer會接收這個Message Group的所有消息。直到:

  • Consumer被關閉。
  • Message Group被關閉。通過發送一個消息,並設置這個消息的JMSXGroupSeq爲-1.

從4.1版本開始,ActiveMQ支持一個布爾字段JMSXGroupFirstForConsumer 。當某個message group的第一個消息被髮送到consumer的時候,這個字段被設置。如果客戶使用failover transport連接到broker。在由於網絡問題等造成客戶重新連接到broker的時候,相同message group的消息可能會被分發到不同與之前的consumer,因此JMSXGroupFirstForConsumer字段也會被重新設置。

創建一個Message Groups

創建一個Message Groups,只需要在Message對象上設置屬性即可。如下:

Message message = session.createTextMessage("hello,world");
message.setStringProperty("JMSXGroupID","GroupA");
...
producer.send(message);

關閉一個Message Groups

關閉一個Message Group,也只需要在Message對象上設置相應的屬性即可。如下:

message.setStringProperty("JMSXGroupID","GroupA");
message.setIntProperty("JMSXGroupSeq", -1);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章