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());
}
从这里我可以找到 JMSXDeliveryCount
在 JMS 2.0 中可用。如果那个 属性 不可用,那么您很可能会为自己的配置找到类似的东西。
一种策略是使用 JMSXDeliveryCount
、供应商特定 属性 或 JMSRedelivered
(如果适合您的需要)作为处理消息之前的检查方式。通常,消息将被发送到重新传递计数超过设定阈值的特定中断队列。
根据您使用的消息提供程序,还可以将回退队列处理配置为队列的属性。
在 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());
}
从这里我可以找到 JMSXDeliveryCount
在 JMS 2.0 中可用。如果那个 属性 不可用,那么您很可能会为自己的配置找到类似的东西。
一种策略是使用 JMSXDeliveryCount
、供应商特定 属性 或 JMSRedelivered
(如果适合您的需要)作为处理消息之前的检查方式。通常,消息将被发送到重新传递计数超过设定阈值的特定中断队列。
根据您使用的消息提供程序,还可以将回退队列处理配置为队列的属性。