【问题标题】:JmsListener called again and again when a error happen in the method当方法中发生错误时,会一次又一次地调用 JmsListener
【发布时间】:2020-07-31 22:40:44
【问题描述】:

在一个 Spring Boot 应用程序中,我有一个带有 jms 监听器的类。

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

    }
 

}

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

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

【问题讨论】:

    标签: spring-boot spring-data-jpa jms spring-jms


    【解决方案1】:

    JMS Message Headers 可能包含有助于您处理的其他信息。特别是JMSRedelivered 可能具有一定的价值。 Oracle doc 声明“如果客户端接收到设置了 JMSRedelivered 字段的消息,则很可能(但不能保证)此消息较早交付,但当时未确认其接收。”

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

        @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(如果适合您的需要)作为在处理消息之前进行检查的一种方式。通常,消息将被发送到重新传递计数超过设定阈值的特定中断队列。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 2018-08-19
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      相关资源
      最近更新 更多