如果数据是正确的,我们必须使用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)
。
,如果您的验证失败,请扔一个。或者,使用自定义错误处理程序配置侦听器,将您的异常转换为AmqpRejectAndDontRequeueException
。
如果您真的想对自己负责,请将确认模式设置为
AmqpRejectAndDontRequeueException
,并使用MANUAL
或
,但是大多数人只是让容器照顾好事(一旦他们理解发生了什么)。通常,使用手动ACK用于特殊用例,例如递延ACK或早期Acking。
eDit
在我指出的答案中,这是一个错误(现在已修复);您必须查看
ChannelAwareMessageListener
的原因。我刚刚测试了这一点,它正常工作...@RabbitListener
恢复:
ListenerExecutionFailedException