我的设置:在JBoss 4.2.3上运行的JBoss Messaging 1.4
我有几个MDB订阅了一个主题,MDB的onMessage()尝试将收到的消息分别发送给一个Web服务。
我的问题是,在Web服务离线时,我无法弄清楚如何暂停订阅。
我的计划是在onMessage()中执行以下操作:
我想暂停只有一个有问题的订阅 - 不是我的所有订阅者。
关于如何解决这个问题的任何建议?
答案 0 :(得分:1)
为什么要暂停订阅?只要抛出异常就可以睡30秒。该异常将回滚JMS事务并将消息放回队列中。
睡眠可确保在Web服务脱机时(通过每秒多次传送和回滚邮件),这不会成为DoS攻击。
[编辑]如果你有很多同一主题的监听器(出于性能原因),我建议创建一个独立的进程来监听“Web服务关闭”消息,并在这种情况下取消订阅所有正常的监听器。
然后,该过程应该等到服务再次可用并重新订阅监听器。
答案 1 :(得分:0)
您是否无法阻止侦听主题中任何传入消息的侦听器?
以下是Listener文档的链接,它有一个暂停方法。您可以遵循相同的方法,并在其分布中找到详细信息。 http://synapse.apache.org/apidocs/org/apache/synapse/transport/jms/JMSListener.html
另一个向您展示如何阻止您的消费者: http://livedocs.adobe.com/blazeds/1/javadoc/flex/messaging/services/messaging/adapters/JMSConsumer.html#stop()
它们基本相同。
答案 2 :(得分:0)
这与How to temporarily disable a message listener
中的情景非常相似唯一不同的是您是MDB而不是普通的Java客户端。您是否可以避免从onMessage()返回,直到您的Web服务再次运行?您必须安排onMessage()逻辑来阻止或睡眠。睡眠是对EJB规范的技术违反,但取决于您正在考虑的替代方案,它可能不是更加丑陋。