如何推迟NServiceBus 6.0中的事件?

时间:2017-09-20 18:54:38

标签: nservicebus nservicebus6 nservicebus-rabbitmq

我们使用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”,它没有延迟选项。

我在这里遗漏了什么吗?感谢有人可以提供帮助。

2 个答案:

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