【问题标题】:Asynchronous ack in rabbitmqrabbitmq中的异步ack
【发布时间】:2018-11-06 18:25:00
【问题描述】:

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

  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-boot rabbitmq activemq spring-rabbit


    【解决方案1】:

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

    生产者也收到了消息 m1 ack。

    我不明白你的意思 - 消费者确认不会发送给生产者;消费者和生产者是独立的。生产者确认与消费者确认完全不同。

    建议您不要在不同的线程上发送确认;频道是not thread safe

    【讨论】:

    • 是的。我在错误的频道上确认 m1。我正在接收 m1,创建具有变量为 Channel、Message 和我的业务 pojo 类的 bean。问题是 m1 在错误的通道对象上得到了确认。感谢 Gary 的快速回答,并感谢您对 RMQ 上提出的每个问题的支持。很快我又发布了一个问题。请帮助我。
    猜你喜欢
    • 2015-05-01
    • 2018-08-29
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多