Rebus - 将延迟消息发送到另一个 queue (Azure ServiceBus)

Rebus - Send delayed message to another queue (Azure ServiceBus)

我有一个网站和一个网络作业,其中网站是单向客户端,网络作业是工作程序。

我使用 Azure ServiceBus 传输 queue。

我收到以下错误:

InvalidOperationException: Cannot use ourselves as timeout manager because we're a one-way client

当我尝试从网站总线发送 Bus.Defer 时。

既然 Azure Servicebus 内置了对 timeoutmanager 的支持,这个工作事件不应该来自单向客户端吗?

Bus.Defer 上的文档说:通过将 header 附加到消息并将其传递到配置的超时管理器端点来延迟传递消息 ///(默认为我们自己)。时机成熟时,延迟的消息将返回到 header."

指示的地址

我可以通过像这样设置 ReturnAddress 来解决这个问题吗:

headers.Add(Rebus.Messages.Headers.ReturnAddress, "webjob-worker");

Could I fix this by setting the ReturnAddress like this: headers.Add(Rebus.Messages.Headers.ReturnAddress, "webjob-worker");

是:)

问题是这样的:当你await bus.Defer一个带有Rebus的消息时,它默认return将消息发送到发送者的输入队列。

当您是 one-way 客户端时,您没有输入队列,因此您无法在超时后接收消息。

设置 return 地址解决了这个问题,尽管我承认这个解决方案并不完全优雅。如果 Rebus 在其路由 API 上有一个 Defer 方法,则更好的 API 可以这样调用:

var routingApi = bus.Advanced.Routing;

await routingApi.Defer(recipient, TimeSpan.FromSeconds(10), message);

但不幸的是,它目前没有那个方法。

总结一下:是的,在延迟消息上明确设置 return 地址使 one-way 客户端能够延迟消息。