Java 骆驼路由中的Errorhandler重试次数超过配置值

Java 骆驼路由中的Errorhandler重试次数超过配置值,java,apache-camel,activemq,Java,Apache Camel,Activemq,我已经设置了一个测试用例,在该测试用例中,我希望在异常发生后消息会转到死信通道,并重试2次以处理它: public class TestObjectRoutes extends SpringRouteBuilder { @Override @Transactional public void configure() { errorHandler(transactionErrorHandler().logHandled(true)

我已经设置了一个测试用例,在该测试用例中,我希望在异常发生后消息会转到死信通道,并重试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)]
这和我所期待的一模一样

唯一的问题是它并没有就此止步。它不断重试呼叫,我看到这两条记录行和错误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);

驼峰jms的默认重试/重新交付为6,因此您将收到2条消息和7次错误

使用createConnectionFactory()中的connection factory creator方法,指定所需的最大重新交付次数,并将此连接工厂传递到camel组件中。如果使用spring,那么已经有了构建连接工厂和ActiveMQComponents的示例,您只需要向连接工厂bean添加一个重新交付策略bean


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

您是如何配置activemq组件的?我已经更新了我的问题。您是否尝试在连接工厂上设置重新传递策略?我相信您正在为Camel设置重新交付策略,而没有更改ActiveMQI的重新交付策略。我正在尝试,但我找不到如何正确配置它的示例。感谢您提出查看Camel jms测试的建议。我找到了在那里建立连接工厂的正确方法。我还没有找到可以在哪里配置默认队列“ACTIVEMQ.DLQ”的名称。有什么想法吗?从您发布的代码中,我看不出到目前为止您是如何将消息配置为发送到自定义DLQ的,但上的此页说明需要在代理的activemq.xml中配置DLQ