spring-boot - rabbitmq中的异步ack
问题描述
首先让我告诉你我已经设置好了。
- 持久和持久的队列和交换。
- 手动确认。
- 在 Spring Boot 中使用 rabbitmq。
- SimpleMessageListenerContainer 并发消费者为 10,最大消费者为 50。
问题场景是,我先发送消息 m1,然后再发送 m2。m1 需要时间来处理。m2 进程在 m1 之前完成。对于 m1 和 m2,此处的传递标签与 1 相同。因此,消息 m2 在 m1 之前得到确认,当 m1 得到确认时,我收到未知的传递标签 1 异常。
令人惊讶的是,生产者也收到了消息 m1 ack。但问题是 m1 在 RMQ 管理控制台中长时间处于未确认状态。
这可能在 RMQ 中我可以在 m1 之前确认 m2 吗?我知道这两条消息都在同一个频道和同一个队列上。问题是我不能保证两条消息都被传递到不同的队列。
解决方案
如果它们具有相同的交付标签,则它们是在不同的线程/通道上交付的 - 交付标签的范围在通道级别。看来您正试图在错误的频道上确认 m1。
令人惊讶的是,生产者也收到了消息 m1 ack。
我不知道您的意思是什么-消费者确认不会发给生产者;消费者和生产者是独立的。生产者确认与消费者确认完全不同。
建议您不要在不同的线程上发送确认;通道不是线程安全的。
推荐阅读
- java - 需要从用户那里为每个学生生成卷号吗?
- python - 在 ms 访问中看不到由 pyodbc 创建的表
- php - laravel 急切加载“with”
- javascript - 从 Firebase 获取数据到 Ionic(Angular)
- apache - SOLR 的 http 错误 404
- hyperledger-fabric - 超级账本结构和以太坊集成
- ruby-on-rails - Heroku Scheduler 任务未按预期运行
- javascript - Vuejs - 将原始 html 链接渲染到
- javascript - 用于将 <=lastdate+30d 拆分为 5 个数组的正则表达式
- kotlin - 类不是抽象的,不实现抽象基类成员