【问题标题】:How to pause JMS topic subscriber from receiving messages如何暂停 JMS 主题订阅者接收消息
【发布时间】:2010-11-18 15:34:22
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 感谢所有提示! :-) 作为一个临时解决方案,我现在已经实现了这个: 1. 如果主机离线,抛出 RuntimeException 导致回滚 2. 通过使用“@ActivationConfigProperty(propertyName = "DLQMaxResent",属性值="151200")"。我的 MDB 需要 4 秒才能理解主机脱机 * 151200 = 重新交付 1 周......我希望这应该足够了 :) 这不是一个很好的解决方案,但它有效,并且数字的默认值为 15同时消息,我的目的地不会受到 DoS 攻击:)

标签: jboss jms messaging subscriber


【解决方案1】:

这与How to temporarily disable a message listener中的场景非常相似

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

【讨论】:

    【解决方案2】:

    你不能阻止监听主题中任何传入消息的监听器吗?

    这是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()

    它们基本上都是一样的。

    【讨论】:

    • 那很好,但我不知道如何在我的 MDB 中执行此操作。如果我以编程方式设置主题侦听器,我想这很容易,但我的解决方案包括简单的 MDB,只有 onMessage()。任何提示如何从中进行 stop() ?
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 您的建议似乎是个好主意!我现在已经尝试过了,但我遇到了一些问题: 传入消息是并行处理的。这导致许多消息处于睡眠状态。此外,即使主机尚未上线,最大重新投递计数也会在某个时候达到限制,然后进入 DLQ。因此,最好暂停监听器消费新消息,直到主机再次在线。以编程方式设置我的主题侦听器并以这种方式处理我的传入消息是否是更好的解决方案?那么我想暂停/停止它会更容易......?
    • 查看我的编辑。是的,如果你有很多听众,你需要一种方法来阻止他们。在这种情况下,使用附加流程管理订阅是您的最佳选择。
    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 2017-11-08
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2015-04-06
    • 2013-03-03
    • 2016-06-17
    相关资源
    最近更新 更多