【发布时间】:2016-04-14 18:36:34
【问题描述】:
尝试在单向客户端上延迟发送消息时,出现以下异常的原因是什么: System.InvalidOperationException "不能将自己用作超时管理器,因为我们是单向客户端"
【问题讨论】:
标签: rebus
尝试在单向客户端上延迟发送消息时,出现以下异常的原因是什么: System.InvalidOperationException "不能将自己用作超时管理器,因为我们是单向客户端"
【问题讨论】:
标签: rebus
单向客户端是 Rebus 客户端,它不能接收消息,因此它没有输入队列。
await bus.Defer(...) 的工作方式是将带有some special headers 的消息发送到“超时管理器”,默认情况下它是延迟消息的端点。
但是由于单向客户端没有输入队列,它没有地方可以发送延迟消息。
您可以通过像这样配置外部超时管理器来使单向客户端延迟消息:
Configure.With(...)
.(...)
.Options(o => o.UseExternalTimeoutManager(anotherQueue))
.Start();
这将导致客户端将延迟消息发送到该队列。
此外,您必须手动将rbs2-defer-recipient 标头设置为其他输入队列,以便超时管理器知道何时将消息发送到何处(*) .
我希望能解释一下 :) 如果不清楚,请告诉我。
*) Rebus 4 实际上并非如此,因为bus.Defer 使用正常的端点映射来路由消息。
【讨论】:
如果使用Rebus.AzureServiceBus,则有更简单(或hacky)的方式来发送延迟消息。
您必须指定 2 个标头:rbs2-deferred-until 和 rbs2-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 中对我有用。
【讨论】: