我在 IBM WAS 服务器中的 IBM MQ 队列上有一个 MDB 侦听器。 MDB接收消息并进行处理并更新数据库。这是我无法处理的一个有问题的场景。
当消息到达 MDB 侦听器并且正在处理过程中时,如果有人强制停止 MDB 应用程序或重新启动整个服务器注释,正在处理的消息将从队列中丢失,而不会完成该过程。有没有什么机制可以避免这种情况。我尝试将 CLIENT_ACKNOWLEDGMENT 与 message.acknowledge() 一起使用,但它不起作用。
我的MDB是这样的:
@MessageDriven(name = "queueMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
}
public class TestMdb implements MessageListener {
@Resource
private MessageDrivenContext messageDrivenContext;
@Override
public void onMessage(Message message) {
try {
// Some usefull code...
message.acknowledge()
}
catch (Exception e) {
messageDrivenContext.setRollbackOnly();
}
}
}
我的 ibm-ejb-jar.xml 如下所示:
<ejb-jar-bnd
xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_2.xsd"
version="1.0">
<message-driven name="TestMdb">
<jca-adapter activation-spec-binding-name="jms/TestQueueAS" destination-binding-name="jms/TestQueue" />
</message-driven>
</ejb-jar-bnd>
任何人都可以帮我解决这个问题吗?只要我让确认工作正常,我就会确认每条消息,在强制停止的情况下,队列消息将不会被确认,也不会从实际队列中删除。一旦 MDB 再次启动,该消息将被处理。
propertyValue = "Auto-acknowledge"
会让我紧张。尝试删除它,这可能是自动提交消息的原因。
我认为成功时您不需要在 MDB 中执行 message.acknowledge()
,因为当 MDB 毫无异常地完成时会发生这种情况(尽管这与您的问题无关)。