2017-01-22 93 views
1

我有一个网站和一个webjob,其中网站是单向客户端,webjob是worker。Rebus - 将延迟的消息发送到另一个队列(Azure ServiceBus)

我使用Azure ServiceBus传输作为队列。

我得到以下错误:

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

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

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

Bus.Defer上的文档说:通过给它添加一个头并把它传递到配置的超时管理器端点012////(默认是我们自己)来延迟邮件的传递。当时间是正确的,推迟的消息被返回到由标题所指示的地址“

我能否通过设置这样的returnAddress的解决这个问题。

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

回答

0

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

是:)

问题是这样的:当你await bus.Defer与卤面的消息,则默认为消息返回到发送的输入队列

当你是一个娃。 y客户端,您没有输入队列,因此在超时过后,您无法接收消息。

设置返回地址修复了这个问题,虽然我承认这个解决方案并不完美。一个更好的API是,如果卤面对路由的API,它可以被称为像这样的Defer方法:

var routingApi = bus.Advanced.Routing; 

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

但遗憾的是它并没有在目前这个方法。

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

+0

这是可以添加到Rebus中的功能吗?如果是这样,我应该在GitHub仓库中创建一个问题? –

+0

嗯,我想过 - 但后来我怀疑它应该被添加到什么地方,也想知道该怎么称呼它.....现在,我建议你通过在'IBus'上创建扩展方法来添加它。接受目标队列作为参数 – mookid8000

相关问题