JMS setRollbackOnly - 不一致的行为

JMS setRollbackOnly - inconsistent behaviour

请看下面的Message Driver Bean。 收到消息后,我们对其调用 clearProperties() 以解锁并能够在其上设置一些其他属性。 最后,我们在 MessageDrivenContext 上调用 setRollbackOnly(),以便重新发送消息。

我们使用 ActiveMQ 作为带有 JBoss 和相应的 activemq-rar.rar 资源适配器的消息代理。 尽管最近和新版本之间关于此资源适配器关于下面代码段的行为方式存在差异。 直到版本“5.11.0.redhat-630446”的资源适配器,我们在onMessage方法中设置的property("newprop")出现在重新投递的消息中。 自版本“5.11.0.redhat-630475”以来,clearProperties()setObjectProperty()方法对重新发送的消息没有影响,所以它属于onMessage方法,具有相同的属性作为原始的第一条消息。

我想知道哪种行为是正确的?

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/QUEUE1"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})

public class MDBean implements MessageListener {

    @Resource
    private MessageDrivenContext contextMD;

    public void onMessage(Message message) {
        try {
            message.clearProperties();
            message.setObjectProperty("newprop", "newprop");
        } catch (JMSException e) {
            e.printStackTrace();
        }
        contextMD.setRollbackOnly();
    }

}

您在新版本中看到的行为是正确的。通过 AMQ-7464 进行了相关更改。简而言之,在消费期间对消息所做的更改不应不会在重新传递期间反映在消息中。