首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将消息回滚到死信队列- Apache Camel

将消息回滚到死信队列- Apache Camel
EN

Stack Overflow用户
提问于 2018-08-28 09:00:49
回答 1查看 2K关注 0票数 1

我已经设置了Apache camel,在其中,我使用来自一个队列的消息,并对其执行某种操作,然后将其传输到其他队列。

现在,如果异常出现了,那么我希望它应该回滚,然后在6次尝试将其发送到死信队列后,当前回滚会发生5-6次,但我的消息不会被传输到死信队列。

这里发生的事情->Queue1 1->(消耗) -->操作(抛出的异常)->回滚->再一次Queue1 1->(消费)->操作(异常抛出)->回滚->.这种情况发生了5-6次,然后我的消息就丢失了。

我不知道我的消息到哪里去了,为什么它会丢失,从我的活动MQ中我可以看到它已经退出队列。

代码语言:javascript
复制
@Bean
public RedeliveryPolicy redeliveryPolicy() {
    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
    redeliveryPolicy.setMaximumRedeliveries(2);
    redeliveryPolicy.setMaximumRedeliveryDelay(10000);
    redeliveryPolicy.setRedeliveryDelay(10000);
    return redeliveryPolicy;
}

---------------------Route extends SpringRouteBuilder-------------------

onException(MyException.class)
    .markRollbackOnly()
    .redeliveryPolicy(redeliveryPolicy)
    .useExponentialBackOff()
    .handled(true)

from("jms:queue:Queue1")
    .process(new Processor(){
       public void process(Exchange ex){
         throw new RuntimeException();
        }
    }).to("jms:queue:myQueue)
EN

回答 1

Stack Overflow用户

发布于 2018-08-29 13:39:13

我想有很多问题。

  1. markRollbackOnly 停止消息。在此语句之后,将不再执行路由操作。

这就是为什么您的RedeliveryPolicy和其余的onException路由被完全忽略的原因。您配置了2次重传尝试,但是编写它会执行5次(ActiveMQ的默认重传)。

要解决这个问题,将移动到onException路由的end

  1. 如果使用来自JMS的事务处理,则消息绝不能丢失

由于您在发生错误时丢失了它,您的事务配置出现了问题。将Camel的ActiveMQ组件配置为在消费时使用本地JMS事务

代码语言:javascript
复制
@Bean(name = "activemq")
@ConditionalOnClass(ActiveMQComponent.class)
public ActiveMQComponent activeMQComponent(ConnectionFactory connectionFactory) {
    ActiveMQComponent activeMQComponent = new ActiveMQComponent();
    activeMQComponent.setConnectionFactory(connectionFactory);
    activeMQComponent.setTransacted(true);
    activeMQComponent.setLazyCreateTransactionManager(false);
    return activeMQComponent;
}

在此之后,您实际上可以删除onException路由,因为重传是由JMS 完成的,因此您必须在JMS上配置重发设置。如果已配置的重传已经用完,并且消息仍然产生回滚,则会将其移到DLQ。

当使用额外的onException路由时要注意,因为这是纯骆驼。Camel错误处理程序不会在路由级别上重新传递,而是在处理器级别上重新传递。因此,如果您同时配置代理和骆驼重发,它可以将它们相乘。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52053929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档