java spring rabbit - 优雅地拒绝邮件

时间:2016-03-24 20:38:49

标签: java spring-amqp spring-rabbit

我有以下监听器方法:

@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);
    }
  }
}

问题是基本拒绝不起作用,我不知道为什么。如何优雅地拒绝它?我认为,如果我拒绝一条消息,它应该被重新排队并且驻留就像缓存一样,然后再转到下一个工作者。但实际上这条消息似乎已经丢失了。

1 个答案:

答案 0 :(得分:5)

如果您正在做自己的行动,则需要将确认模式设置为MANUAL。我不确定为什么它不适合你; DEBUG / TRACE日志记录可能有所帮助。

你应该考虑让容器处理ack - 使用acknowledgemode=AUTO;对于任何抛出的异常,容器通常会重新排队消息,如果监听器正常返回,则会确认消息。

您可以将defaultRequeueRejected设置为false(默认情况下为true),该邮件将被丢弃(或路由到DLX / DLQ)。

您还可以抛出AmqpRejectAndDontRequeueException来覆盖重新排列失败消息的默认机制。

如果ack模式为NONE - 没有acks,RabbitMQ会在发送消息后立即自动获取消息。