我有一个非常简单的要求 1.在某些例外情况下重新排列邮件 2.在某些其他例外情况下发送到dlq
我的路线是 rabbitmq - > POJO验证 - >数据库验证 - >目的地兔子mq
对于案例1,我的骆驼例外路线是
onException(IOException.class)
//requeue for processing again
.setHeader("rabbitmq.REQUEUE", constant(Boolean.TRUE))
.removeHeaders("*")
.bean(<do some stuff>)
.handled(true)
.end();
对于案例2,我的骆驼例外路线是
onException(JsonPathException.class, PathNotFoundException.class)
.setHeader("rabbitmq.REQUEUE", constant(Boolean.FALSE))
.handled(true)
.end()
我的基本骆驼路线类似于
from(eventConsumerEndpoint)
.filter().method(<validation>)
.bean(<db fetch>)
.filter().method(<db validation>)
.removeHeaders("*")
.to(eventConsumerDestination)
.end();
现在我没有在任何地方使用过autoAck = false。我的uri就像是
rabbitmq://localhost:5672/events?autoDelete=false&deadLetterExchange=events&deadLetterExchangeType=topic&deadLetterQueue=dlq.xxx.yyy&deadLetterRoutingKey=evt.xxx.dead&exchangeType=topic&password=xxxxxx&queue=central-queue&username=guest&vhost=%2F
所以我的情况都不起作用 - 没有重新排队IOException,没有关于JsonPath异常的dlq。所以这都是因为autoAck。我根本不想处理确认,所以可以使用autoAck false吗?
请帮忙。
Ananth
答案 0 :(得分:1)
如果要再次重新处理相同的消息,则必须以事务方式使用消息并不处理错误。仅当Camel路由&#34;失败&#34;时,代理事务才会回滚,并且代理再次立即传递消息(在消耗任何其他消息之前)。
我不了解RabbitMQ,但在ActiveMQ上,您可以配置重新发送。如果所有重试失败,则代理会自动将消息发送到DLQ 。
然而,一个典型的问题是,立即重新处理没有帮助,因为它会再次失败,因为问题仍然存在。
如果您不使用JMS交易,那么您没有重新发送,因此没有通过代理交付DLQ。您消费的消息将立即在代理上提交,因此已完成。
这意味着你必须与Camel一起手动&#34; 。您可以通过处理错误来执行此操作,只需在.to()
块中添加onException
即可将失败的消息发送到另一个队列。
但是,如果您的路线中未处理错误(例如onException
阻止中的错误),则消息将丢失!因为使用AUTO_ACKNOWLEDGE,代理无法再次重新发送消息。