rabbitmq - 使用 RabbitMQ 和 Camel 一条一条地消费消息
问题描述
我有一个 RabbitMQ 代理和一个使用消息的 Camel Java 应用程序。消费者在 ca 中处理一条消息。1秒。我产生 10'000 条消息;这几乎是瞬间的。RabbitMQ 控制台立即报告队列不包含更多内容。7'000 条消息。这对我来说是个问题,因为如果消费者失败,大约有 3'000 条消息会丢失。
我尝试了几种选择:
- 流缓存:
camelContext.setStreamCaching(false);
//或true
- 节流:
from(queue).throttle(1)
- 预取:
from(rabbitmq:exchange&queue=q&prefetchEnabled=true&prefetchCount=1&prefetchGlobal=false&prefetchSize=0
一切都无济于事。我从来没有观察到队列中的消息数量有规律地减少(10'000,然后是 9'999,9'998 等)。恰恰相反:我总是可以看到消息以大块的形式从队列中出来(通常是 3'000 条消息),尽管消费者实际上处理它们的速度很慢。
如何一一消费消息?
解决方案
我知道这对你来说可能有点太晚了,但我也一直在与同样的问题作斗争,我终于找到了一个解决方案,让 Camel RabbitMq 组件一个一个地消费消息。
您只需将autoAck
属性设置为false
.
下面我有整个路线定义的示例:
rabbitmq:your-exchange?routingKey=rtkey&queue=qname&autoDelete=false&durable=true&guaranteedDeliveries=true&threadPoolSize=1&autoAck=false
那么重要的部分就是:
guaranteedDeliveries=true&threadPoolSize=1&autoAck=false
threadPoolSize
和属性不是实现您想要的东西所必需的guaranteedDeliveries
,我只是为了完整起见将它们放在这里。
这是文档的链接
推荐阅读
- c# - 如何将 XML 属性反序列化为对象,然后遍历对象
- xcode10 - 方案的应用程序语言设置
- java - 在 Spring Boot 中创建新的实体对象
- c++ - 从 /etc/ld.so.conf 使 ld 忽略目录
- javascript - 防止条码扫描器进入下一个输入框
- angular-material - Angular 6 将多个主题与延迟加载集成在一起
- java - 使用递归从字符串中删除子字符串
- azure-devops - 无法使用 odata 在 VSTS 中下载“Scrum 任务”的更改历史记录和讨论详细信息
- react-native - 中间件不是本机反应的功能
- android - 使用手势自动静音应用程序 - 如何?