如何暂停JMS主题订阅者接收消息

时间:2009-08-11 14:39:10

标签: jboss jms messaging subscriber

我的设置:在JBoss 4.2.3上运行的JBoss Messaging 1.4

我有几个MDB订阅了一个主题,MDB的onMessage()尝试将收到的消息分别发送给一个Web服务。

我的问题是,在Web服务离线时,我无法弄清楚如何暂停订阅。

我的计划是在onMessage()中执行以下操作:

  1. 尝试投放到网络服务
  2. 如果离线:
  3. - >暂停订阅
  4. - >在onMessage()中抛出异常以使JMS重新传递消息 直到网络服务再次上线
  5. - >开始订阅
  6. 我想暂停只有一个有问题的订阅 - 不是我的所有订阅者。

    关于如何解决这个问题的任何建议?

3 个答案:

答案 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规范的技术违反,但取决于您正在考虑的替代方案,它可能不是更加丑陋。