【发布时间】:2016-10-20 14:33:46
【问题描述】:
我想接收一条消息实际上已被放入队列的异步确认。我已经搜索了很多,并尝试了使用 EasyNetQ 的PublishAsync 进行确认的各种方法,但似乎找不到可以给我这样确认的Bus 连接配置和代码组合。
也许PublishAsync 不是解决这个问题的方法,我忽略了 EasyNetQ API 中的其他内容?其他人有使用 EasyNetQ 实现此场景的经验吗?
【问题讨论】:
我想接收一条消息实际上已被放入队列的异步确认。我已经搜索了很多,并尝试了使用 EasyNetQ 的PublishAsync 进行确认的各种方法,但似乎找不到可以给我这样确认的Bus 连接配置和代码组合。
也许PublishAsync 不是解决这个问题的方法,我忽略了 EasyNetQ API 中的其他内容?其他人有使用 EasyNetQ 实现此场景的经验吗?
【问题讨论】:
对于这种保证,您需要启用发布者确认。请参阅文档:
https://github.com/mikehadlow/EasyNetQ/wiki/Publisher-Confirms
【讨论】:
mandatory设置为true。
官方documentation on Publish Confirm表示
对于不可路由的消息,一旦交换验证消息不会路由到任何队列(返回一个空的队列列表),代理将发出确认
这意味着您将获得发布确认,即使没有队列绑定到具有匹配路由键的交换。如果要确保消息至少发布到一个队列,则需要确保在BasicPublish 中将强制标志设置为true
channel.BasicPublish(
exchange: "my_exchange",
routingKey:"routingkey",
mandatory: true, // at least one queue
basicProperties: null,
body: new byte[0]
);
未提供强制时的默认值为false。所以 Mike Hadlow 的回答并不是 100% 准确的。 RawRabbit 有一个 open issue 与此相关,这将在下一个版本中到期。
【讨论】: