如何确认消息驱动Bean中的消息

时间:2013-05-21 13:34:54

标签: java jms message-driven-bean

在JMS文档中,我读到Message Driven Beans不支持CLIENT_ACKNOWLEDGE模式,仅支持DUPS_OK_ACKNOWLEDGEAUTO_ACKNOWLEDGE

据我了解,在AUTO_ACKNOWLEDGE模式下,当调用onMessage方法时,将确认消息(从目标中删除)。我想要的是告诉我的经纪人在发生不良事件时不要删除目的地(队列或主题)的消息

必须有一些方法可以做到这一点。无论如何,为什么Message Drven Beans不支持CLIENT_ACKNOWLEDGE

3 个答案:

答案 0 :(得分:7)

  

我想要的是告诉我的经纪人不要删除来自的经纪人   发生不良事件时的目的地(队列或主题)。

如果您已配置为使用PERSISTENT消息,onMessage()中的任何例外情况都会根据代理和目标设置保留邮件以进行重新传递。如果您使用NON_PERSISTENT消息,onMessage()中的任何异常通常都会丢弃该消息。

  

无论如何,为什么在Message Driven Beans中不支持CLIENT_ACKNOWLEDGE。

消息驱动的bean由J2EE容器管理;因此,容器处理确认。通常,只有独立的JMS接收器应使用CLIENT_ACKNOWLEDGE

您使用的是哪种消息传递中间件?

答案 1 :(得分:0)

确保您正在使用(JTA)事务(默认情况下您正在使用它们)。然后确保您的应用程序服务器具有重新传递设置和/或死信队列(DLQ)。从您的MDB抛出的任何异常将触发重新传递,并且在一定量的失败之后,该消息将被移动到DLQ。

重新发送设置称为" max-delivery-attempts"例如在Wildfly中

答案 2 :(得分:0)

在Mdb中,您可以告诉代理不要通过“ MessageDrivenContext”删除消息。 (没有抛出异常-这也会回滚事务)

一些示例代码,您可以在其中处理方法'onMessaage'中的所有异常,并在发生异常的情况下设置回滚:

@MessageDriven(name = "queueMDB", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "TestQueue"),
    @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...
        }
        catch (Exception e) {
            messageDrivenContext.setRollbackOnly();
        }
    }
}