Java MDB Listener 强制停止时的确认和重试机制

问题描述 投票:0回答:1

我在 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 再次启动,该消息将被处理。

java ibm-mq was
1个回答
0
投票

propertyValue = "Auto-acknowledge"
会让我紧张。尝试删除它,这可能是自动提交消息的原因。 我认为成功时您不需要在 MDB 中执行
message.acknowledge()
,因为当 MDB 毫无异常地完成时会发生这种情况(尽管这与您的问题无关)。

© www.soinside.com 2019 - 2024. All rights reserved.