【问题标题】:Rebus - Send delayed message to another queue (Azure ServiceBus)Rebus - 将延迟消息发送到另一个队列 (Azure ServiceBus)
【发布时间】:2017-06-07 07:55:26
【问题描述】:

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

我使用 Azure ServiceBus 传输队列。

我收到以下错误:

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

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

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

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

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

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

【问题讨论】:

    标签: azure rebus


    【解决方案1】:

    我可以通过像这样设置 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);
    

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

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

    【讨论】:

    • 这是一个可以添加到 Rebus 中的功能吗?如果是这样,我应该在 GitHub 存储库中创建一个问题吗?
    • 嗯,我想过——但后来我怀疑应该在哪里添加它,也想知道如何称呼它.....现在,我建议你通过创建来添加它IBus 上的扩展方法,接受目标队列作为参数
    猜你喜欢
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2019-08-28
    相关资源
    最近更新 更多