Jboss 如何暂停JMS主题订阅服务器接收消息

Jboss 如何暂停JMS主题订阅服务器接收消息,jboss,jms,messaging,subscriber,Jboss,Jms,Messaging,Subscriber,我的设置:运行在JBoss 4.2.3上的JBoss Messaging 1.4 我有几个MDB订阅一个主题,MDB的onMessage()尝试将收到的消息分别传递给一个web服务 我的问题是,当web服务脱机时,我不知道如何暂停订阅 我的计划是在onMessage()中执行以下操作: 尝试交付到web服务 如果脱机: -->暂停订阅 -->在onMessage()中引发异常以使JMS重新传递消息 直到web服务再次联机 -->启动订阅 我只想暂停出现问题的一个订阅,而不是我的所有订阅 关于如何

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

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

我的问题是,当web服务脱机时,我不知道如何暂停订阅

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

  • 尝试交付到web服务
  • 如果脱机:
  • -->暂停订阅
  • -->在onMessage()中引发异常以使JMS重新传递消息 直到web服务再次联机
  • -->启动订阅
  • 我只想暂停出现问题的一个订阅,而不是我的所有订阅


    关于如何解决这个问题有什么建议吗?

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

    睡眠确保在web服务脱机时不会成为DoS攻击(通过每秒多次传递和回滚消息)

    [编辑]如果同一主题有多个侦听器(出于性能原因),我建议创建一个独立的进程来侦听“Web service down”消息,并在这种情况下取消订阅所有正常侦听器


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

    您不能阻止侦听主题中任何传入消息的侦听器吗

    这里是Listener的doc的链接,它有一个pause方法。您可以遵循相同的方法,详细信息可以在其分布中找到。

    另一个向您展示如何阻止您的消费者:


    它们基本上都是一样的。

    这与中的场景非常相似


    唯一的区别是您是一个MDB,而不是一个普通的Java客户机。在web服务重新工作之前,是否可以避免从onMessage()返回?您必须将onMessage()逻辑安排为阻塞或休眠。睡眠在技术上违反了EJB规范,但取决于您正在考虑的替代方案,睡眠可能不会更难看。

    这很好,但我不知道如何在我的MDB中做到这一点。如果我以编程方式设置一个主题侦听器,我想这很容易,但我的解决方案由简单的MDB和onMessage()组成。有什么建议可以阻止它吗?你的建议似乎是个好主意!我现在已经尝试过了,但是我遇到了一些问题:传入的消息是并行处理的。这导致在睡眠中有许多信息。此外,即使主机尚未联机,最大重新交付计数也会在某个点达到限制,然后被放入DLQ。因此,在主机再次联机之前,最好暂停侦听器使用新消息。以编程方式设置主题侦听器并以这种方式处理传入的消息是更好的解决方案吗?那么我想暂停/停止它会更容易…?查看我的编辑。是的,如果你有很多听众,你需要一种方法来阻止他们。在这种情况下,使用附加流程管理订阅是您的最佳选择。感谢所有提示!:-)作为一个临时解决方案,我现在实现了以下内容:1。如果主机脱机,则引发RuntimeException以导致回滚2。通过使用“@ActivationConfigProperty(propertyName=“dlqMaxRecent”,propertyValue=“151200”)”在我的MDB上使用一个巨大的重新交付值。这是我的MDB理解主机离线的4秒*151200=1周内的重新交付。。。这应该足够了,我希望:)这不是一个很好的解决方案,但它可以工作,同时消息数的默认值为15,我的目的地将不会受到DoS攻击:)