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
后可能无法工作。它在中对我有效