【发布时间】:2012-01-03 16:33:50
【问题描述】:
假设你有两个 Spring DefaultMessageListenerContainer 监听同一个队列(例如 ActiveMQ),在不同的 VM 中启动。
发送 1 000 000 条消息。在 500 000 条消息之后,您希望其余消息仅由一个 DefaultMessageListenerContainer 处理,但不要在另一个上调用 destroy 或 shutdown(因为您将来可能需要它 -并且必须使用 JMX 使其易于管理)。这些数字只是此处的示例,应忽略,可以替换为 - “经过一段时间,经过一些消息等”
这听起来很简单:在另一个 DefaultMessageListenerContainer 上调用 stop。错误,因为消息是以循环方式发送的,并且它们会向消费者注册。
添加事务支持并在第二个DefaultMessageListenerContainer 中抛出一个错误,每次有消息进来时,它将被第一个回滚并采取(循环)。又错了,消息以某种方式向消费者注册,不允许第一个 DefaultMessageListenerContainer 接收消息。
即使您关闭/销毁第一个 DMLC - 消息也不会被另一个 DMLC 使用。仅当我杀死正在关闭/销毁的 DMLC 正在运行的 JVM 时,它们才会被消耗。
到目前为止我的解决方案:因为Session.AUTO_ACKNOWLEDGE 消息在进入DefaultMessageListenerContainer 的MessageListener 中的onMessage 方法之前从队列中取出。在MessageListener 中实现SessionAwareMessageListener 并重新发送具有相同有效负载的消息的新副本。
但这看起来真的很脏——我希望我能以“JMS”式的方式做更多的事情。
【问题讨论】:
-
好吧,我可以“取消注册”来自特定消费者的消息吗?