我们使用NserviceBus作为我们的消息传递基础设施,RabbitMQ作为传输。 我正在尝试从5. *版本升级到NServiceBus 6.0。在5.0中,我们可以使用“Bus.Defer()”来推迟事件。但似乎在6.0中我们只能推迟消息而不是事件?
如果我使用下面的代码并将消息作为“事件”,我会收到错误消息,说明应该发布事件。
var sendOptions = new SendOptions();
sendOptions.DoNotDeliverBefore(DateTimeOffset.Now.AddMinutes(30));
sendOptions.RouteToThisEndpoint();
return context.Send(message, sendOptions);
但是 context.Publish(message,new PublishOptions())方法接受“PublishOptions”,它没有延迟选项。
我在这里遗漏了什么吗?感谢有人可以提供帮助。
答案 0 :(得分:1)
某些更改不会立即生效,因此我们必须推迟其中一些事件。
发布商不应受任何订阅者的约束。
假设产品创作系统发布ProductDataUpdate
事件而不管实际生效日期何时发生,这是否正确?在这种情况下,您已收到 决定的通知。作为订阅者,你做什么是另一回事,完全是内部的。
为了讨论起见,您可以发送一个命令UpdateProductCost
,如果将来EffectiveDate
,这将是一条延迟消息。否则,它是一个立即命令。
答案 1 :(得分:1)
我在另一个论坛得到了一个答案,我认为这是最相关的,所以在这里发布,以便将来可以帮助某人。感谢Daniel Marbach
https://groups.google.com/forum/#!topic/particularsoftware/ivy1wdsycT8
v5中的Bus.Defer在内部始终执行发送操作。似乎与v6的不同之处在于它会自动禁用消息传递最佳实践。您可以通过调用
来实现相同的目标 var sendOptions = new SendOptions();
sendOptions.DoNotDeliverBefore(DateTimeOffset.Now.AddMinutes(30));
sendOptions.RouteToThisEndpoint();
sendOptions.DoNotEnforceBestPractices();
return context.Send(message, sendOptions);
https://docs.particular.net/nservicebus/messaging/best-practice-enforcement