Java 骆驼路由中的Errorhandler重试次数超过配置值
我已经设置了一个测试用例,在该测试用例中,我希望在异常发生后消息会转到死信通道,并重试2次以处理它: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)
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