Rebus 为什么可以';我不能推迟为单向客户端发送消息吗

Rebus 为什么可以';我不能推迟为单向客户端发送消息吗,rebus,Rebus,当试图延迟在单向客户端上发送消息时,以下异常的基本原理是什么: System.InvalidOperationException“无法将我们自己用作超时管理器,因为我们是单向客户端”单向客户端是无法接收消息的Rebus客户端,因此它没有输入队列 wait bus.Defer(…)的工作方式是向“超时管理器”发送消息,默认情况下,超时管理器是延迟消息的端点 但是,由于单向客户机没有输入队列,因此它没有位置向其发送延迟消息 通过如下配置外部超时管理器,您可以使单向客户端延迟消息: Configure

当试图延迟在单向客户端上发送消息时,以下异常的基本原理是什么:
System.InvalidOperationException“无法将我们自己用作超时管理器,因为我们是单向客户端”

单向客户端是无法接收消息的Rebus客户端,因此它没有输入队列

wait bus.Defer(…)
的工作方式是向“超时管理器”发送消息,默认情况下,超时管理器是延迟消息的端点

但是,由于单向客户机没有输入队列,因此它没有位置向其发送延迟消息

通过如下配置外部超时管理器,您可以使单向客户端延迟消息:

Configure.With(...)
    .(...)
    .Options(o => o.UseExternalTimeoutManager(anotherQueue))
    .Start();
这将导致客户端向该队列发送延迟消息

此外,您必须手动将报头设置为其他一些输入队列,以便超时管理器知道在使用消息(*)时将消息发送到何处

我希望这可以解释:)如果不清楚,请告诉我



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

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

您必须指定两个标题:
rbs2 deferred to
rbs2 deferred recipient
并调用
Publish
方法,如示例中所示

var deferredUntil=DateTimeOffset.UtcNow.AddDays(1);
var headers=newdictionary();
添加(headers.DeferredUntil,DeferredUntil.ToString(“O”,CultureInfo.InvariantCulture));
headers.Add(headers.DeferredRecipient,@“Rebus需要此”\_(ツ)_/¯");
wait bus.Publish(new SomeMessage(),headers);
注意:
rbs2延迟收件人
Rebus
所必需的,因此任何伪值都可以

请小心,它看起来像是一个解决方法,因此在更新
Rebus.AzureServiceBus
后可能无法工作。它在中对我有效