java spring rabbit - 优雅地拒绝消息

标签 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);
    }
  }
}

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

最佳答案

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

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

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

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

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

关于java spring rabbit - 优雅地拒绝消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36209605/

相关文章:

java - 是否有任何选项可以使用 Spring-AMQP 在 RabbitMQ 中设置 AutomaticRecoveryEnabled?

Java8 从类中检索 lambda setter

java - JSF - 创建通用确认页面(动态导航)

java - Android 通话记录查询给出非法参数异常 : column '_id' does not exist

spring - RabbitMQ - 多个消费者如何使用来自单个队列的相同消息?

java - 使用 Protobuf 的 Java 中的 RabbitMQ。解析接收到的数据

java - Spring RabbitMQ教程导致Connection Refused错误

java - 使用 spring mvc 使用 enableStompBrokerRelay 时缺少依赖项

java - 如何在 Spring RabbitMQ 项目中使用多个虚拟主机?

java - Spring-AMQP 事务性发布无异常