我有以下监听器方法:
@Override
public void onMessage(Message message, Channel channel) {
try {
// do something bad :)
} catch (Exception e){
try {
long dt = null != message.getMessageProperties()
? message.getMessageProperties().getDeliveryTag()
: 0;
channel.basicReject(dt, true);
} catch(IOException io) {
logger.error("IO-COMMON", io);
}
}
}
问题是基本拒绝不起作用,我不知道为什么。如何优雅地拒绝它?我认为,如果我拒绝一条消息,它应该被重新排队并且驻留就像缓存一样,然后再转到下一个工作者。但实际上这条消息似乎已经丢失了。
答案 0 :(得分:5)
如果您正在做自己的行动,则需要将确认模式设置为MANUAL。我不确定为什么它不适合你; DEBUG / TRACE日志记录可能有所帮助。
你应该考虑让容器处理ack - 使用acknowledgemode=AUTO
;对于任何抛出的异常,容器通常会重新排队消息,如果监听器正常返回,则会确认消息。
您可以将defaultRequeueRejected
设置为false(默认情况下为true),该邮件将被丢弃(或路由到DLX / DLQ)。
您还可以抛出AmqpRejectAndDontRequeueException
来覆盖重新排列失败消息的默认机制。
如果ack模式为NONE - 没有acks,RabbitMQ会在发送消息后立即自动获取消息。