首页 > 解决方案 > rabbitmq中的异步ack

问题描述

首先让我告诉你我已经设置好了。

  1. 持久和持久的队列和交换。
  2. 手动确认。
  3. 在 Spring Boot 中使用 rabbitmq。
  4. SimpleMessageListenerContainer 并发消费者为 10,最大消费者为 50。

问题场景是,我先发送消息 m1,然后再发送 m2。m1 需要时间来处理。m2 进程在 m1 之前完成。对于 m1 和 m2,此处的传递标签与 1 相同。因此,消息 m2 在 m1 之前得到确认,当 m1 得到确认时,我收到未知的传递标签 1 异常。

令人惊讶的是,生产者也收到了消息 m1 ack。但问题是 m1 在 RMQ 管理控制台中长时间处于未确认状态。

这可能在 RMQ 中我可以在 m1 之前确认 m2 吗?我知道这两条消息都在同一个频道和同一个队列上。问题是我不能保证两条消息都被传递到不同的队列。

标签: spring-bootrabbitmqactivemqspring-rabbit

解决方案


如果它们具有相同的交付标签,则它们是在不同的线程/通道上交付的 - 交付标签的范围在通道级别。看来您正试图在错误的频道上确认 m1。

令人惊讶的是,生产者也收到了消息 m1 ack。

我不知道您的意思是什么-消费者确认不会发给生产者;消费者和生产者是独立的。生产者确认与消费者确认完全不同。

建议您不要在不同的线程上发送确认;通道不是线程安全的。


推荐阅读