Camel Route中的Errorhandler重试次数超过配置值

时间:2016-03-17 15:09:48

标签: java apache-camel activemq

我已经设置了一个测试用例,我希望在发生异常后将消息转到死信通道,重试2次以处理它:

public class TestObjectRoutes extends SpringRouteBuilder {
    @Override
    @Transactional
    public void configure() {
        errorHandler(transactionErrorHandler().logHandled(true)
                .onRedelivery(exchange -> System.out.println("Testing..."))
                .maximumRedeliveries(2));

        from("activemq:queueone")
                .transacted()
                .to("activemq:queuetwo")
                .process(javaThrower); // This line throws an exception
        ;
    }
}

调用路线后,我可以看到以下内容:

Testing...
Testing...

2016-03-17 15:59:32.762 ERROR 3296 --- [testobject.one]] o.a.camel.processor.DeadLetterChannel    : Failed delivery for (MessageId: ID:DESKTOP-HRMD8N6-64204-1458226711533-21:2:1:1:1 on ExchangeId: ID-DESKTOP-HRMD8N6-64190-1458226703758-0-8). Exhausted after delivery attempt: 3 caught: java.lang.IllegalArgumentException: JAVA EXCEPTION. Processed by failure processor: FatalFallbackErrorHandler[sendTo(Endpoint[activemq://mydeadletterchannel] InOnly)]

这看起来与我期待的完全一样。

唯一的问题是它并不止于此。它一直在重试呼叫,我看到这2条日志行和ERROR 7

然后它将消息移动到DLQ,但是,它不是我定义的DLQ队列名称,而是移动到“ACTIVEMQ.DLQ”。

这让我觉得在其他地方另一个默认配置正在接管,但我似乎无法确定它。

这是我的ActiveMQComponent配置:

@Autowired
private PlatformTransactionManager platformTransactionManager;

@PostConstruct
public void init() throws Exception {

    ActiveMQComponent component = ActiveMQComponent.activeMQComponent("vm://localhost?broker.persistent=false");
    component.setTransactionManager(platformTransactionManager);
    component.setTransacted(true);

    camelContext.addComponent("activemq", component);
}

有谁知道为什么会出现这种情况?

编辑:

添加自定义连接工厂后,我的代码如下所示:

ActiveMQComponent component = ActiveMQComponent.activeMQComponent("vm://localhost?broker.persistent=false");
    component.setTransactionManager(platformTransactionManager);
    component.setTransacted(true);

    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
    redeliveryPolicy.setMaximumRedeliveries(0);
    connectionFactory.setRedeliveryPolicy(redeliveryPolicy);
    connectionFactory.setBrokerURL("vm://localhost?broker.persistent=false");
    component.setConnectionFactory(connectionFactory);

    camelContext.addComponent("activemq", component);

1 个答案:

答案 0 :(得分:1)

camel-jms的默认重试/重新传递为6,这就是为什么你收到2条消息和7次错误的原因。

使用camel-jms tests createConnectionFactory()中的连接工厂创建方法指定您想要的最大重新传输,并将此连接工厂传递到您的camel组件。如果使用spring,那么transactional client docs已经出现了构建连接工厂和ActiveMQComponents的示例,您只需要将一个重新传递策略bean添加到连接工厂bean。

在camel-jms组件测试中还有其他使用事务和配置JMS消息重新传递的好例子。