【问题标题】:Rollback the message to Dead Letter Queue - Apache Camel将消息回滚到死信队列 - Apache Camel
【发布时间】:2019-02-02 20:30:46
【问题描述】:

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

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

这里会发生什么--> 队列1-->(消耗)-->操作(抛出异常)-->回滚-->再次队列1-->(消耗)-->操作(抛出异常)-->回滚-->...发生这种情况5-6次,然后我的信息就丢失了

我不知道我的消息要去哪里以及为什么它会丢失,并且从我的 Active MQ GUI 中我可以看到它已出列。

@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)

【问题讨论】:

    标签: apache-camel jms activemq


    【解决方案1】:

    我认为存在多个问题。

    1. markRollbackOnly 停止发送消息。在此语句之后,不会进行进一步的路由。

    这就是您的RedeliveryPolicy 和您的onException 路由的其余部分被完全忽略的原因。您配置了 2 次重新传递尝试,但您编写了 5 次(ActiveMQ 的默认重新传递)。

    要解决此问题,markRollbackOnly 移动到您的 onException 路由的末尾

    1. 如果您使用 JMS 代理的交易,则消息不得丢失

    由于发生错误时您会丢失它,因此您的事务配置存在问题。配置 Camel 的 ActiveMQ 组件以在消费时使用本地 JMS 事务

    @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 错误处理程序不会在路由级别重新交付,而是在处理器级别。因此,如果您同时配置代理和骆驼重新交付,它可以使它们成倍增加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2015-02-25
      • 2014-08-30
      • 2022-07-28
      相关资源
      最近更新 更多