尝试延迟在单向客户端上发送消息时,以下异常背后的原因是什么: System.InvalidOperationException"不能将自己用作超时管理器,因为我们是单向客户端"
答案 0 :(得分:1)
单向客户端是一个无法接收消息的Rebus客户端,因此它没有输入队列。
await bus.Defer(...)
的工作方式是将some special headers的消息发送给“超时管理器”,默认情况下是延迟消息的端点。
但由于单向客户端没有输入队列,因此无法将延迟消息发送到。
您可以通过配置外部超时管理器来使单向客户端延迟消息:
Configure.With(...)
.(...)
.Options(o => o.UseExternalTimeoutManager(anotherQueue))
.Start();
然后将导致客户端将延迟消息发送到该队列。
此外,您必须手动将rbs2-defer-recipient
标头设置为其他输入队列,以便超时管理器知道在消耗时将消息发送到何处( *)。
我希望能解释一下:)如果不清楚,请告诉我。
*)Rebus 4实际上并非如此,因为bus.Defer
使用普通端点映射来路由消息。
答案 1 :(得分:0)
如果使用Rebus.AzureServiceBus
,则发送延迟邮件的方式更加简单(或骇客)。
您必须指定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);
注意: rbs2-defer-recipient
需要Rebus
,所以任何虚拟值都可以。
请注意,它看起来像一种变通办法,因此在Rebus.AzureServiceBus
更新之后可能无法正常工作。它在5.0.1中对我有用。