Java 在JMS消息驱动Bean中重试

Java 在JMS消息驱动Bean中重试,java,jakarta-ee,jms,Java,Jakarta Ee,Jms,我有一个消息驱动bean,它使用消息并通过restapi将其发送到其他地方。像这样: @MessageDriven(name = "n", activationConfig = {...}) public class SubmitMessageBean implements MessageListener { @Resource private MessageDrivenContext context; @Override public void onMess

我有一个消息驱动bean,它使用消息并通过restapi将其发送到其他地方。像这样:

@MessageDriven(name = "n", activationConfig = {...})
public class SubmitMessageBean implements MessageListener {

    @Resource
    private MessageDrivenContext context;

    @Override
    public void onMessage(final Message message) {
        try {
            // Submit data to somewhere with REST API
        } catch (IOException ex) {
            this.context.getRollbackOnly();
        } catch (JMSException ex) {
            e.printStackTrace();
        }
    }
}

当发生错误时,我想在一分钟内重试发送。有没有办法做到这一点?

好吧,我想出来了。您还可以轻松地添加延迟,让远程系统有更多的时间来解决错误

@MessageDriven(name = "n", activationConfig = {...})
public class SubmitMessageBean implements MessageListener {

   @Inject
   JMSContext context;

   @Resource(mappedName = "...")
   Queue queue;

    @Override
    public void onMessage(Message message) {
        Integer retry = 0;
        try {
            // track how many time we tried before
            retry = message.getIntProperty("retry");

            // Submit data to somewhere with REST API
        } catch (IOException ex) {
            // Put it back in queue again
            // You can limit number of retry by keeping retry variable 
            if (retry < 5) {
                JMSProducer producer = this.context.createProducer();
                producer.setProperty("retry", r);
                // Add some delay to start it again after a minute
                producer.setDeliveryDelay(60000);
                // Send it again with send()
            }
        } catch (JMSException ex) {
            e.printStackTrace();
        }
    }
}
@MessageDriven(name=“n”,activationConfig={…})
公共类SubmitMessageBean实现MessageListener{
@注入
JMSContext上下文;
@资源(mappedName=“…”)
排队;
@凌驾
消息(消息消息)上的公共无效{
整数重试=0;
试一试{
//追踪我们以前试过多少次
重试=message.getIntProperty(“重试”);
//使用RESTAPI将数据提交到某处
}捕获(IOEX异常){
//再把它放回队列
//您可以通过保留retry变量来限制重试次数
如果(重试<5次){
JMSProducer producer=this.context.createProducer();
producer.setProperty(“重试”,r);
//添加一些延迟,一分钟后再次启动
生产商设置交货延迟(60000);
//使用Send()再次发送
}
}捕获(JMEX){
e、 printStackTrace();
}
}
}
当然,您需要用自己正确的值填充{…}