JmsListener 在方法发生错误时一次又一次地调用

JmsListener called again and again when a error happen in the method

在 spring 引导应用程序中,我有一个带有 jms 侦听器的 class。

public class PaymentNotification{

    @JmsListener(destination="payment")
    public void receive(String payload) throws Exception{
        //mapstring conversion
        .... 

        paymentEvent = billingService.insert(paymentEvent); //transactional method
 
        //call rest...

        
        billingService.save(paymentEvent);

        //send info to jms

    }
 

}

然后我看到当一个错误发生时,数据被插入到数据库中,没问题,但是它就像一次又一次地调用 receive 方法......但是当我检查服务器时队列是空的。

如果有错误,我不想再次调用方法,有什么办法吗?

JMS Message Headers might contain additional information to help with your processing. In particular JMSRedelivered could be of some value. The Oracle doc 声明“如果客户端收到一条设置了 JMSRedelivered 字段的消息,则很可能(但不一定)该消息是较早传递的,但它的接收当时没有被承认。"

我 运行 使用以下代码来探索我的配置中可用的内容(Spring 使用 IBM MQ 引导)。

    @JmsListener(destination="DEV.QUEUE.1")
        public void receive(Message message) throws Exception{
 
            for (Enumeration<String> e = message.getPropertyNames(); e.hasMoreElements();)
            System.out.println(e.nextElement());    

        }

从这里我可以找到 JMSXDeliveryCountJMS 2.0 中可用。如果那个 属性 不可用,那么您很可能会为自己的配置找到类似的东西。

一种策略是使用 JMSXDeliveryCount、供应商特定 属性 或 JMSRedelivered(如果适合您的需要)作为处理消息之前的检查方式。通常,消息将被发送到重新传递计数超过设定阈值的特定中断队列。

根据您使用的消息提供程序,还可以将回退队列处理配置为队列的属性。