我已经设置了Apache camel,在其中,我使用来自一个队列的消息,并对其执行某种操作,然后将其传输到其他队列。
现在,如果异常出现了,那么我希望它应该回滚,然后在6次尝试将其发送到死信队列后,当前回滚会发生5-6次,但我的消息不会被传输到死信队列。
这里发生的事情->Queue1 1->(消耗) -->操作(抛出的异常)->回滚->再一次Queue1 1->(消费)->操作(异常抛出)->回滚->.这种情况发生了5-6次,然后我的消息就丢失了。
我不知道我的消息到哪里去了,为什么它会丢失,从我的活动MQ中我可以看到它已经退出队列。
@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)发布于 2018-08-29 13:39:13
我想有很多问题。
markRollbackOnly 停止消息。在此语句之后,将不再执行路由操作。这就是为什么您的RedeliveryPolicy和其余的onException路由被完全忽略的原因。您配置了2次重传尝试,但是编写它会执行5次(ActiveMQ的默认重传)。
要解决这个问题,将移动到onException路由的end
由于您在发生错误时丢失了它,您的事务配置出现了问题。将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错误处理程序不会在路由级别上重新传递,而是在处理器级别上重新传递。因此,如果您同时配置代理和骆驼重发,它可以将它们相乘。
https://stackoverflow.com/questions/52053929
复制相似问题