如何在春季AMQP

问题描述 投票:0回答:1

如果数据是正确的,我们必须使用ACK,并应从队列中删除消息。 如果数据不正确,我们必须将数据纳入(负面确认),以便将其重新出现在Rabbitmq

.

中。 我遇到了

**factory.setDefaultRequeueRejected(false);**(它根本不会要求消息)

**factory.setDefaultRequeueRejected(true);**

(发生异常时会要求消息)

但我的案例我将根据验证来确认该消息。然后,它应该删除消息。如果nack请申请消息。

我已经在RabbitMQ网站上阅读了

AMQP规范定义了基本。拒绝方法,该方法允许客户拒绝个人,传递消息,指示经纪人丢弃或要求他们删除它们



如何实现上述情况?请给我一些例子。 我尝试了一个小程序

logger.info("Job Queue Handler::::::::::" + new Date()); try { }catch(Exception e){ logger.info("Activity Object Not Found Exception so message should be Re-queued the Message::::::::::::::"); } factory.setErrorHandler(new ConditionalRejectingErrorHandler(cause ->{ return cause instanceof XMLException; }));

Message并没有为不同的例外重新排队

FACTORY.SETDEFAULTREQUEUEREDED(true)

09:46:38,854 ERROR [stderr] (SimpleAsyncTaskExecutor-1)

org.activiti.Engine.activitiObjectNotFoundException

:没有使用键'WF89012'IS部署的过程

09:46:39,102信息 [com.example.bip.rabbitmq.handler.errqueuehandler] (SimpleSynctaskexecutor-1)从错误队列接收到:{error =可以 不进行JPA交易;嵌套异常是
javax.persistence.rollbackexception:交易标记为
  Rollbackonly
}

请参阅文档

默认,(带有defaultRequeueRejected=true

)如果侦听器正态退出或拒绝(并要求),如果侦听器抛出异常,则容器将对消息(导致其删除)。

如果侦听器(或错误处理程序)抛出一个AmqpRejectAndDontRequeueException,则默认行为被覆盖并丢弃消息(或将其路由到dlx/dlq,如果是这样的) - 容器调用

basicReject(false)
而不是
rabbitmq spring-amqp spring-rabbit
1个回答
24
投票
.

,如果您的验证失败,请扔一个。或者,使用自定义错误处理程序配置侦听器,将您的异常转换为AmqpRejectAndDontRequeueException

。 this Answer

如果您真的想对自己负责,请将确认模式设置为
AmqpRejectAndDontRequeueException

,并使用

MANUAL

,但是大多数人只是让容器照顾好事(一旦他们理解发生了什么)。通常,使用手动ACK用于特殊用例,例如递延ACK或早期Acking。
eDit

在我指出的答案中,这是一个错误(现在已修复);您必须查看

ChannelAwareMessageListener
的原因。我刚刚测试了这一点,它正常工作...
@RabbitListener

恢复: ListenerExecutionFailedException


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.