假设:
问题:
只要消息正在进行中,就不能在不中断工作流状态的情况下取消部署消息驱动的bean。因此,我们首先停止计时器服务,然后等待所有消息完成。
有没有办法自动化这种行为?或者,如果计时器服务仍在运行,是否可以防止取消部署?我们目前正在使用JBoss 4.2.3。
非解决方案:
答案 0 :(得分:2)
每个部署的MDB都有一个JMX管理接口MBean。此MBean的ObjectName因部署而异(并且JBoss版本之间也可能不同)。我使用的是JBoss 4.3,ObjectName格式是:
Domain Name: jboss.j2ee
service: EJB3
name: <MDB Name>
ear: <EAR Name> (if applicable)
jar: <JAR Name>
如果您的计时器服务是JBoss ServiceMBean,您可以使用JBoss @Depends(“计时器服务ObjectName”使计时器上的MDB 依赖 “)注释。这将强制计时器服务在MDB启动之前启动(因此最好使计时器服务具有一些启动后延迟)但更重要的是,我相信在取消部署时将发生相反的情况并且计时器服务应该首先停止,然后停止MDB。
如果可行,它会负责排序,但我不认为您可以在计时器运行时强制MDB不取消部署。您的应用程序的详细信息可能不支持这一点,但您可以考虑解决此问题的一种方法是使用JBoss Quartz JCA Inflow Adapter,它将计时器和消息处理器绑定为一个(它就像一个MDB,但它接收计时器事件而不是消息),摆脱你必须与两个组件之间的依赖关系搏斗。
================================ 尝试#2 ================================
好的,所以你想要防止MDB在进给队列的深度大于零时停止。这种方法应该对你有用,尽管它对JBoss非常具体。
最重要的是,在调用属性更改侦听器时,将继续处理消息。当属性更改侦听器返回时,MDB停止将继续。
如果您的JMS实现是本地in-VM JBoss Messaging,则队列消息计数将在队列的管理MBean中可用。对于任何其他设置,您可能需要进行专有的JMS API调用以获取队列的消息计数,或者,使用更强力的方法,您只需请求JMS QueueBrowser并计算消息数。 / p>