【问题标题】:Why can't I defer sending a message for a one-way client为什么我不能推迟为单向客户端发送消息
【发布时间】:2016-04-14 18:36:34
【问题描述】:

尝试在单向客户端上延迟发送消息时,出现以下异常的原因是什么: System.InvalidOperationException "不能将自己用作超时管理器,因为我们是单向客户端"

【问题讨论】:

    标签: rebus


    【解决方案1】:

    单向客户端是 Rebus 客户端,它不能接收消息,因此它没有输入队列。

    await bus.Defer(...) 的工作方式是将带有some special headers 的消息发送到“超时管理器”,默认情况下它是延迟消息的端点。

    但是由于单向客户端没有输入队列,它没有地方可以发送延迟消息。

    您可以通过像这样配置外部超时管理器来使单向客户端延迟消息:

    Configure.With(...)
        .(...)
        .Options(o => o.UseExternalTimeoutManager(anotherQueue))
        .Start();
    

    这将导致客户端将延迟消息发送到该队列。

    此外,您必须手动将rbs2-defer-recipient 标头设置为其他输入队列,以便超时管理器知道何时将消息发送到何处(*) .

    我希望能解释一下 :) 如果不清楚,请告诉我。


    *) Rebus 4 实际上并非如此,因为bus.Defer 使用正常的端点映射来路由消息。

    【讨论】:

      【解决方案2】:

      如果使用Rebus.AzureServiceBus,则有更简单(或hacky)的方式来发送延迟消息。

      您必须指定 2 个标头:rbs2-deferred-untilrbs2-defer-recipient 并像示例中一样调用 Publish 方法。

      var deferredUntil = DateTimeOffset.UtcNow.AddDays(1);
      var headers = new Dictionary<string, string>();
      headers.Add(Headers.DeferredUntil, deferredUntil.ToString("O", CultureInfo.InvariantCulture));
      headers.Add(Headers.DeferredRecipient, @"Rebus requires this ¯\_(ツ)_/¯");
      await bus.Publish(new SomeMessage(), headers);
      

      注意:Rebus 需要 rbs2-defer-recipient,因此任何虚拟值都可以。

      小心,它看起来像是一种解决方法,所以在Rebus.AzureServiceBus 更新后它可能无法正常工作。它在5.0.1 中对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-28
        • 2016-04-25
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多