Java 驼峰rabbitmq dlq实现与autoAck true

Java 驼峰rabbitmq dlq实现与autoAck true,java,rabbitmq,apache-camel,Java,Rabbitmq,Apache Camel,我有一个非常简单的要求 1.在某些例外情况下,重新获取消息 2.在某些其他异常情况下,发送到dlq 我的路线是 rabbitmq->POJO验证->数据库验证->目标rabbitmq 对于案例1,我的骆驼例外路线是 onException(IOException.class) //requeue for processing again .setHeader("rabbitmq.REQUEUE", constant(Boolean.

我有一个非常简单的要求 1.在某些例外情况下,重新获取消息 2.在某些其他异常情况下,发送到dlq

我的路线是 rabbitmq->POJO验证->数据库验证->目标rabbitmq

对于案例1,我的骆驼例外路线是

onException(IOException.class)
                //requeue for processing again
                .setHeader("rabbitmq.REQUEUE", constant(Boolean.TRUE))
                .removeHeaders("*")
                .bean(<do some stuff>)
                .handled(true)
                .end();
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();
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上没有requeue,JsonPath异常上没有dlq。这一切都是因为自动确认。我根本不想处理确认,所以是否可以使用autoAck false执行此操作

请帮忙

使用JMS事务的Ananth

(已处理会话) 如果要再次重新处理同一消息,则必须以事务方式使用消息,而不是处理错误。只有当驼峰路由“失败”时,代理事务才会回滚,并且消息会立即由代理再次传递(在使用任何其他消息之前)

我不知道RabbitMQ,但在ActiveMQ上您可以配置重新交付。如果所有重试均失败,则代理会自动将消息发送到DLQ

然而,一个典型的问题是,立即重新处理没有帮助,因为它会再次失败,因为问题仍然存在

没有JMS事务(自动确认) 如果不使用JMS事务,那么就没有重新交付,因此也没有通过代理进行DLQ交付。您所使用的消息会立即提交到代理上,并因此完成

这意味着您必须使用Camel“手动”。您可以像处理错误一样处理错误,只需在
onException
块中添加一个
.to()
,即可将失败的消息发送到另一个队列


但是,如果发生在路由中未处理的错误(例如
onException
块中的错误),则消息将丢失!因为使用AUTO_ACKNOWLEDGE,代理无法再次重新传递消息。

没有使用AUTO ack的重新请求。消息交付后,代理会确认消息并将其忘记。除此之外,我知道的还不足以提供答案。@theMayer谢谢。你的意思是“自动确认”设置为“正确”时重新开始?我不知道你在说什么。拒绝允许您指定重新申请。“自动确认”是在消息到达消费者之前设置的。@您所说的“自动确认无需重新请求”的玩家。我问你是否在autoAck为真的情况下做出了这一陈述,是的,是的,“带有auto ack”可以被视为“auto ack=true”。autoAck的影响是什么?我不关心重新交付的数量-我只想重新查询或发送到dlq,但不将autoAck设置为false。我的问题是——这可能吗?我编辑了我的答案,以区别自动确认和事务处理。希望这能让你明白。好的,我明白了。所以我在你回答的后半部分,这意味着自动确认false和重新交付(我称之为requeue)或在异常情况下推送到dlq更安全。那么,当我将autoAck设置为false时,是否还有其他需要处理的警告(在主路径上,ExchangePattern.InOnly足以确认对吗?事务消耗主要在连接到代理的ConnectionFactory上配置。具体配置取决于应用程序设置。如果您有事务管理器,您可以使用它。如果没有,您可以使用代理的本地JMS事务。这是一个很大的问题主题。为了从头开始学习,我推荐克劳斯·伊布森的书《骆驼在行动》