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

时间:2017-01-22 20:11:10

标签: azure rebus

我有一个网站和一个webjob,其中网站是单向客户端,webjob是工作者。

我将Azure ServiceBus传输用于队列。

我收到以下错误:

  

InvalidOperationException:无法将自己用作超时管理器   因为我们是单向客户

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

由于Azure Servicebus内置了对timeoutmanager的支持,不应该是单向客户端的这个工作事件吗?

关于Bus.Defer的文档说:通过附加一个标头并将其传递给配置的超时管理器端点来延迟消息的传递     ///(默认为我们自己)。当时间正确时,延迟消息将返回到标题指示的地址。“

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

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

1 个答案:

答案 0 :(得分:0)

  

我是否可以通过设置ReturnAddress来解决此问题:headers.Add(Rebus.Messages.Headers.ReturnAddress," webjob-worker");

是的:)

问题是这样的:当您await bus.Defer带有Rebus的消息时,它默认将消息返回给发送者的输入队列。

当您是单向客户端时,您没有输入队列,因此在超时结束后您无法接收该消息。

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

var routingApi = bus.Advanced.Routing;

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

但不幸的是,目前还没有这种方法。

总结一下:是的,在延迟消息上明确设置返回地址使得单向客户端能够推迟消息。