为什么我不能推迟为单向客户端发送消息

时间:2016-04-14 18:36:35

标签: rebus

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

2 个答案:

答案 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-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);

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

请注意,它看起来像一种变通办法,因此在Rebus.AzureServiceBus更新之后可能无法正常工作。它在5.0.1中对我有用。