假設您有兩個Spring DefaultMessageListenerContainer
監聽同一個隊列(例如ActiveMQ),並在不同的VM中啓動。使用JMX + ActiveMQ管理的DefaultMessageListenerContainer單個隊列上的多個使用者
發送1000000條消息。在你想讓剩下的消息只有一個DefaultMessageListenerContainer
處理500,000條消息之後,BUT不會另外調用銷燬或關機(因爲將來可能需要它 - 並且必須保持JMX的可管理性)。這些數字僅僅是在這裏,應該忽略,可以用 - 「經過一段時間後,在一些消息等等之後」等等。
這聽起來很簡單:呼叫停止在另一個DefaultMessageListenerContainer
。錯誤,因爲消息是以循環方式發送的,並且它們已經被消費者註冊。
每次消息進入時添加事務支持並在第二個DefaultMessageListenerContainer
中拋出錯誤,它將被回滾並且被第一個消息(循環)取回。錯誤再次,消息以某種方式向消費者註冊,不允許第一個DefaultMessageListenerContainer
消息。
即使您關閉/銷燬第一個DMLC,該消息也不會被其他DMLC消耗。只有當我終止現在關閉/銷燬的DMLC正在運行的JVM時,它們才被使用。
我的解決方案到目前爲止:由於Session.AUTO_ACKNOWLEDGE
消息在隊列中輸入onMessage方法之前從MessageListener DefaultMessageListenerContainer
。在MessageListener
實施SessionAwareMessageListener
並重新發送具有相同有效負載的消息的副本。 但是這看起來真的很髒 - 我希望我能以「JMS」的方式做更多。
而你的問題是? – nfechner
好吧,我可以「註銷」來自特定消費者的消息嗎? – Eugene