我已经设置了一个测试用例,我希望在发生异常后将消息转到死信通道,重试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);
答案 0 :(得分:1)
camel-jms的默认重试/重新传递为6,这就是为什么你收到2条消息和7次错误的原因。
使用camel-jms tests createConnectionFactory()中的连接工厂创建方法指定您想要的最大重新传输,并将此连接工厂传递到您的camel组件。如果使用spring,那么transactional client docs已经出现了构建连接工厂和ActiveMQComponents的示例,您只需要将一个重新传递策略bean添加到连接工厂bean。
在camel-jms组件测试中还有其他使用事务和配置JMS消息重新传递的好例子。