0

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

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

我的问题是我不知道在网络服务离线的情况下如何暂停订阅。

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

  1. 尝试交付到网络服务
  2. 如果离线:
  3. --> 暂停订阅
  4. --> 在 onMessage() 中抛出异常,让 JMS 重新传递消息,直到 Web 服务再次上线
  5. --> 开始订阅

我只想暂停一个有问题的订阅——而不是我的所有订阅者。

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

4

3 回答 3

1

为什么要暂停订阅?只需抛出一个异常并进入睡眠状态,例如 30 秒。该异常将回滚 JMS 事务并将消息放回队列中。

睡眠确保在 Web 服务离线时这不会成为 DoS 攻击(通过每秒传递和回滚消息多次)。

[编辑] 如果您有许多针对同一主题的侦听器(出于性能原因),我建议创建一个独立的进程来侦听“Web 服务关闭”消息并在这种情况下取​​消订阅所有普通侦听器。

然后,该过程应等到服务再次可用并重新订阅侦听器。

于 2009-08-11T14:47:04.330 回答
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()

它们都基本相同。

于 2009-08-11T18:54:02.127 回答
0

这与如何临时禁用消息侦听器中的场景非常相似

唯一的区别是您是 MDB 而不是普通的 Java 客户端。您能否避免从 onMessage() 返回,直到您的 Web 服务再次运行?你必须安排你的 onMessage() 逻辑阻塞或睡眠。休眠是对 EJB 规范的技术违规,但根据您考虑的替代方案,它可能并不丑陋。

于 2009-08-14T18:11:51.117 回答