【问题标题】:RabbitMQ BasicAck giving channel shutdown error messages on console - Spring AMQPRabbitMQ BasicAck 在控制台上给出通道关闭错误消息 - Spring AMQP
【发布时间】:2022-01-03 02:17:54
【问题描述】:
@EnableRabbit
@Service
public class RabbitMqListenerWithReply {


@Autowired
RabbitTemplate rabbitTemplate;

@Value("${test.rabbitmq.exchange}")
private String rabbitMQExchange;


@Value("${test.rabbitmq.routingkey}")
private String rabbitMQRoutingKey;

@RabbitListener(queues = "${test.rabbitmq.queue}")
public void receiveMessage(String message, Channel channel, 
@Header(AmqpHeaders.DELIVERY_TAG)long tag) throws IOException {
    System.out.println(message.toString());
    channel.basicAck(tag, false);
    System.out.println("Ackd"); 
    
}
}

我正在尝试实现一个侦听器,它在我使用消息后确认消息,但是控制台会返回此错误,因此有人可以指导我可能出错的地方。

这是我现在在运行发布者将消息发布到交易所时遇到的错误。

2022-01-03 09:35:33.192 ERROR 27280 --- [ 127.0.0.1:5672] o.s.a.r.c.CachingConnectionFactory       : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)

2022-01-03 09:35:34.208  INFO 27280 --- [ntContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer : Restarting Consumer@52d7ab79: tags=[[amq.ctag-0pIM_-TROTIxXRsAJpmOrw]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,1), conn: Proxy@71369e1a Shared Rabbit Connection: SimpleConnection@60b616c8 [delegate=amqp://guest@127.0.0.1:5672/, localPort= 57660], acknowledgeMode=AUTO local queue size=0

这就是我现在发布消息的方式。

@RestController
@RequestMapping("api/test")
public class RestAPIController {
@Autowired
RabbitTemplate rabbitTemplate;

@Value("${test.rabbitmq.exchange}")
private String rabbitMQExchange;

@Value("${test.rabbitmq.routingkey}")
private String rabbitMQRoutingKey;

@Value("${test.rabbitmq.queue}")
private String rabbitMQQueue;



@GetMapping("{message}")
public String testAPI(@PathVariable("message") String message) {
    System.out.println("Message sent: " + message);
    rabbitTemplate.convertAndSend(rabbitMQExchange, rabbitMQRoutingKey , message);
    return "The message was sent";
}

}

【问题讨论】:

    标签: java spring rabbitmq spring-amqp


    【解决方案1】:

    @RabbitListener默认使用AUTO-ACK

    容器自动确认消息,除非 MessageListener 抛出异常。

    所以如果你在listener中ack一次,框架会ack一次,重复ack会导致这个异常。

    试试:

    @RabbitListener(queues = "xxx", ackMode = "MANUAL")
    

    【讨论】:

    • 感谢您对错误的澄清,如果我可以进一步澄清,对不起。我是否需要使用:channel.basicConsume 在使用 channel.basicAck 后正确确认消息
    • 监听容器已经是消费者。您不能在侦听器中使用basicConsume。你可以看看这个问题:link
    • 您好 Zysaaa,当您提到容器已经是消费者时,我有点理解您的意思。我已经访问了您发布的链接,在我的情况下,我是否错误地使用了我的 channel.basicAck 来确认消息?
    • 如果您设置 ackMode = "AUTO"(默认情况下),您不必在侦听器方法中调用channel.basicAck。如果要手动ack或者uack消息,那么目前的做法是正确的,只需要设置当前监听的ackMode = MANUAL,避免双重ack。
    • 我明白了,在这种情况下,如何使用我的代码 sn-ps 验证我的消息是否已被手动确认?提前感谢 Zysaaa 的建议,如果您碰巧有任何 Rabbitmq 教程,我很乐意加入它以增强我对它的了解。
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多