我正在使用ActiveMQ,我想知道如何解決這個特定情況。如果生產者宕機,我如何清除隊列中的消息
當消費者宕機時,生產者發送消息到隊列中。該消息將保留在隊列中,直到消費者運行消耗它爲止。
現在想象一下,我關閉了生產者,消息仍然會保留在隊列中。現在我運行消費者,它會嘗試消費該消息,但自從消費者失敗後將無法回覆製作者。
我想解決這個問題,通過清除消息,如果生產者不在。 ActiveMQ代理在停止後清理隊列。我想爲相關製作人的信息做同樣的事情。
謝謝。
我正在使用ActiveMQ,我想知道如何解決這個特定情況。如果生產者宕機,我如何清除隊列中的消息
當消費者宕機時,生產者發送消息到隊列中。該消息將保留在隊列中,直到消費者運行消耗它爲止。
現在想象一下,我關閉了生產者,消息仍然會保留在隊列中。現在我運行消費者,它會嘗試消費該消息,但自從消費者失敗後將無法回覆製作者。
我想解決這個問題,通過清除消息,如果生產者不在。 ActiveMQ代理在停止後清理隊列。我想爲相關製作人的信息做同樣的事情。
謝謝。
基於我現在明白了,從你的問題,更多的意見,我建議一個Message Property添加到您的消息,以識別生產者,並編寫使用一個Message Selector讀匹配從隊列生產者的所有消息的小工具。在生產者停止(或崩潰)之後,您可以直接運行該實用程序,並且應該相當準確地完成您想要實現的目標。
編輯:雖然主要關注EE,但Sun/Oracle JavaEE Tutorial包含關於一般JMS編程的非常好的一章,該章從獨立的製作者和消費者開始。隨附的源代碼包可以下載here,該包中準備好的comoile樣本應該可以幫助您快速啓動。
你可以通過幾種方法解決它。一種是在消息上設置一個TTL,使其消失。另一個是通過JMX進行連接,並使用選擇器語句或Message的特定MessageId值清除Queue或刪除特定消息。
看到這個article的一些提示。
我不是ActiveMQ用戶,所以我不能真正說一些有關這種特定情況的東西,但我想指出[設置每個MessageProducer生成的消息的生存時間]經常被忽視的可能性( http://docs.oracle.com/cd/E17802_01/products/products/jms/javadoc-102a/javax/jms/MessageProducer.html#setTimeToLive%28long%29)。正確使用此功能可以顯着緩解您所描述的問題。 – fvu
我也想指出'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
是的,但通過設置到期消息不會解決案件。想象一下你設置TTL爲20秒的消息。製片人在20秒之前關機,我想把這個信息刪除,就像製片人關機的同一時間一樣,不要等待剩下的時間。在剩下的時間裏,消費者可能會消費它,例如向客戶收取費用,並且無法回覆客戶自關機後收取的費用。 – msqar