2013-04-30 59 views
0

有沒有更改排隊順序而不使用開箱即用的「resequencer」的選項?也許可以使用JMS客戶端來獲取隊列中的最後一條消息而不是第一條消息?ActiveMQ LIFO訂購?

回答

1

我認爲你應該提供更多關於你想要實現的內容的信息...... 無論如何,如果你閱讀一些像MQ這樣的JMS實現的規範,你會發現FIFO的順序不能保證在100% 。 這意味着,如果您按照收到的消息順序進行中繼,則可能很容易出現問題。 將漸進數字添加到消息標題並根據需要使用它來處理消息是一種很好的做法。如果您採用這種解決方案,您有兩種選擇來實現您的目標: 1)修改接收器業務邏輯以檢查消息的標題; 2)(可能更清潔的方法,如果你使用的是MQ)使用一種叫做的消息選擇器

消息選擇器允許使用SQL92查詢功能基於內容檢索特定消息。 MQ規範規定:

  • JMS消息提供了一種工具,以提供用戶定義的元數據 到JMS消息頭(該消息的實際身體外部)。

  • JMS程序可以利用這個工具的優勢,選擇一個子集的消息
    根據選擇標準,或者換句話說,一個JMS
    客戶可以只選擇那些它感興趣的消息。

這裏是一些關於這兩個方案的實施的詳細信息... 那你可能感興趣的,在此之前發送的消息是JMSCorrelationID將被設置爲1的第一條消息,你應該設置該屬性,第二個爲2,依此類推。

1)由於您對消息選擇器更感興趣,因此可以跳到下一個項目符號。反正僅供參考,如果你決定採用該解決方案1,你可以找到一些很好的參考:

http://activemq.apache.org/maven/apidocs/org/apache/activemq/ActiveMQQueueBrowser.html

2)消息選擇。 你的消息選擇將是一個SQL字符串,如:JMSCorrelationID = MAX(JMSCorrelationID)

如果你想在Java中實現消息選擇語法是:

的MessageConsumer消費= session.createConsumer(目的地,messageSelectorString,真); ActiveMQObjectMessage objMsg =(ActiveMQObjectMessage)consumer.receiveNoWait();

+0

Andrea R1,謝謝你的回覆。我有100個消息隊列裏面,我想像一個堆棧處理它。例如,消息依次排列:1,2,3 ... 99。但是,我希望以相反的方式接收它(不是嚴格的,但是反向),如:98,99,97 .. 2,1。不知道如何編寫這個選擇器:「MAX(timestamp)」 – 2013-04-30 14:29:17

+0

根據定義,隊列是指FIFO操作。爲了逆轉順序,將所有內容推入堆棧,然後根據需要從堆棧中彈出元素。 – 2016-03-08 22:48:56