2013-08-07 36 views
1

我正在使用ActiveMQ,我想知道如何解決這個特定情況。如果生產者宕機,我如何清除隊列中的消息

當消費者宕機時,生產者發送消息到隊列中。該消息將保留在隊列中,直到消費者運行消耗它爲止。

現在想象一下,我關閉了生產者,消息仍然會保留在隊列中。現在我運行消費者,它會嘗試消費該消息,但自從消費者失敗後將無法回覆製作者。

我想解決這個問題,通過清除消息,如果生產者不在。 ActiveMQ代理在停止後清理隊列。我想爲相關製作人的信息做同樣的事情。

謝謝。

+0

我不是ActiveMQ用戶,所以我不能真正說一些有關這種特定情況的東西,但我想指出[設置每個MessageProducer生成的消息的生存時間]經常被忽視的可能性( http://docs.oracle.com/cd/E17802_01/products/products/jms/javadoc-102a/javax/jms/MessageProducer.html#setTimeToLive%28long%29)。正確使用此功能可以顯着緩解您所描述的問題。 – fvu

+1

我也想指出'Message'中的[setJMSExpiration()](http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#setJMSExpiration%28long%29)可能表面上似乎也是這樣做的,[但不會按預期工作](http://activemq.2283324.n4.nabble.com/Difference-setJMSExpiration-setTimeToLive-td2360498.html) – fvu

+0

是的,但通過設置到期消息不會解決案件。想象一下你設置TTL爲20秒的消息。製片人在20秒之前關機,我想把這個信息刪除,就像製片人關機的同一時間一樣,不要等待剩下的時間。在剩下的時間裏,消費者可能會消費它,例如向客戶收取費用,並且無法回覆客戶自關機後收取的費用。 – msqar

回答

2

基於我現在明白了,從你的問題,更多的意見,我建議一個Message Property添加到您的消息,以識別生產者,並編寫使用一個Message Selector讀匹配從隊列生產者的所有消息的小工具。在生產者停止(或崩潰)之後,您可以直接運行該實用程序,並且應該相當準確地完成您想要實現的目標。

編輯:雖然主要關注EE,但Sun/Oracle JavaEE Tutorial包含關於一般JMS編程的非常好的一章,該章從獨立的製作者和消費者開始。隨附的源代碼包可以下載here,該包中準備好的comoile樣本應該可以幫助您快速啓動。

+0

嗯,這將是一個不錯的方法,發生,我不知道如何實現它,需要考慮它:)謝謝! – msqar

+0

謝謝,結束了使用主題,而不是隊列與消費者端的選擇器。我不知道爲什麼我會得到2個消費者的迴應......就像它通過消費者兩次。仍然需要弄清楚。 – msqar

1

你可以通過幾種方法解決它。一種是在消息上設置一個TTL,使其消失。另一個是通過JMX進行連接,並使用選擇器語句或Message的特定MessageId值清除Queue或刪除特定消息。

看到這個article的一些提示。

+0

謝謝。什麼是TTL? (生存時間)?順便說一句,即時通訊與騾工作。所以我需要從Mule或activemq.xml文件中設置它。要繼續檢查:) – msqar

+0

@TimBish看到我上面的評論 - 通過消息設置過期**不起作用**,你**有**在生產者上設置TTL。 – fvu

+0

是的,但是,想象你設置一個TTL爲20秒的消息。製片人在20秒之前關機,我想把這個信息刪除,就像製片人關機的同一時間一樣,不要等待剩下的時間。在剩下的時間內,消費者可能會消費它,例如對客戶做$ $$收費,並且無法回覆客戶收取的費用。有可能是某種策略或政策:/ – msqar