3

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

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

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

4

3 回答 3

7

我想要告诉我的代理不要在发生不好的事情时从目的地(队列或主题)中删除消息。

如果您配置为使用PERSISTENT消息,则其中的任何异常都onMessage()将保留消息以根据代理和目标设置重新传递。如果您正在使用消息,则通常会丢弃消息中的NON_PERSISTENT任何异常。onMessage()

无论如何,为什么消息驱动 Bean 不支持 CLIENT_ACKNOWLEDGE。

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

您使用的是什么消息中间件?

于 2013-05-21T15:41:01.503 回答
0

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

例如,在 Wildfly 中,redeilvery 设置称为“max-delivery-attempts”

于 2015-09-23T06:41:32.857 回答
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();
        }
    }
}
于 2018-07-30T10:11:56.690 回答