java - DefaultMessageListenerContainer 在单个队列上使用 JMX + ActiveMQ 多个消费者进行管理

标签 java spring jms jmx

假设您有两个 Spring DefaultMessageListenerContainer 监听同一个 Queue(例如 ActiveMQ),它们在不同的 VM 中启动。

发送 1 000 000 条消息。在 500 000 条消息之后,您希望其余消息仅由一个 DefaultMessageListenerContainer 处理,但不要在另一个上调用 destroy 或 shutdown(因为您可能需要它在未来 - 并且必须使用 JMX 保持它的可管理性)。这些数字只是这里的例子,应该被忽略,可以替换为 - “一段时间后,一些消息之后,等等”

这听起来很简单:在另一个 DefaultMessageListenerContainer 上调用 stop。错了,因为消息以 Round Robin 方式发送,并且它们在消费者中注册。

添加事务支持并在第二个 DefaultMessageListenerContainer 中抛出错误,每次有消息进来时,它会被回滚并由第一个接收(循环)。又错了,消息以某种方式向消费者注册,不允许第一个 DefaultMessageListenerContainer 接收消息。

即使您关闭/销毁了第一个 DMLC - 消息也不会被另一个 DMLC 使用。只有当我杀死现在关闭/销毁的 DMLC 正在运行的 JVM 时,它们才会被消耗。

到目前为止我的解决方案:由于 Session.AUTO_ACKNOWLEDGE 消息在进入 DefaultMessageListenerContainer 的 MessageListener 中的 onMessage 方法之前从队列中取出。在 MessageListener 中实现 SessionAwareMessageListener 并使用相同的负载重新发送消息的新副本。 但这看起来真的很脏——我希望我能以类似“JMS”的方式做更多。

最佳答案

我没有完全理解这部分:“[消息] 向消费者注册”。你的意思是 ActiveMQ 决定将它发送给哪个监听器?当您在 DMLC 上调用“停止”时究竟会发生什么?

我不知道这是否会克服您的困难,但我有一个想法:DMLC 中的消息选择器是实时:您可以随时更改它们并且它们会立即生效。也许尝试将消息选择器更改为“FALSE”;所有缓存的消息都应该完成处理,新消息应该停止。

关于java - DefaultMessageListenerContainer 在单个队列上使用 JMX + ActiveMQ 多个消费者进行管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8224318/

相关文章:

java - 如何填充Struts2下拉菜单?

java - 如何使用Xtend框架生成2个Java类

java - 当我运行我的 spring 应用程序时,它显示抛出错误

java - 为什么我不能在 @Mapping 属性中引用 @Context 参数?

Spring Boot 应用程序可以处理大量请求

java - 如何在 REST 应用程序上使用 SOAP Web 服务

java - 疑似 JMS 队列资源泄漏 - 注入(inject)连接、 session 和队列

java - 跟踪 JMS 消息的来源

java - 配置虚拟主题: JMS - Java

java - 如何使用 SpringTemplateLoader 而不是 FiletemPlateLoader 配置 Freemarker