如何在NServiceBus 6.0中延迟事件?

如何在NServiceBus 6.0中延迟事件?,nservicebus,nservicebus6,nservicebus-rabbitmq,Nservicebus,Nservicebus6,Nservicebus Rabbitmq,我们使用NserviceBus作为消息传递基础架构,RabbitMQ作为传输。 我正在尝试从5.*版本升级到NServiceBus 6.0。在5.0中,我们可以使用“Bus.defer()”延迟事件。但在6.0中,我们似乎只能延迟消息,而不能延迟事件 如果我使用下面的代码,并且消息是“事件”,我会得到一个错误,说应该发布事件 var sendOptions = new SendOptions(); sendOptions.DoNotDeliverBefore(Da

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

我是不是遗漏了什么?如果有人能帮忙,我将不胜感激

有些变化不是立即生效的,因此我们将不得不推迟其中一些事件

发布服务器不应受到任何订阅服务器的约束

假设产品创作系统发布
ProductDataUpdate
事件,而不管实际生效日期何时发生,这是否正确?在这种情况下,您已经收到关于已作出的决定的通知。作为一个订阅者,你打算用它做什么是另一回事,完全是内部的


为了便于讨论,您可以发送一条命令,称之为
UpdateProductCost
,如果
EffectiveDate
在将来出现,则该命令将是一条延迟消息。否则,这是一个即时命令。

我在另一个论坛上得到了一个答案,我认为这是最相关的,所以将其发布在这里,以便将来对某人有所帮助。感谢丹尼尔·马尔巴赫

v5中的Bus.Defer在内部总是执行发送操作。与v6的区别似乎在于它自动禁用了消息传递最佳实践。您可以通过调用

        var sendOptions = new SendOptions();
        sendOptions.DoNotDeliverBefore(DateTimeOffset.Now.AddMinutes(30));
        sendOptions.RouteToThisEndpoint();
        sendOptions.DoNotEnforceBestPractices();
        return context.Send(message, sendOptions);

事件是基于已经发生的事情,而不是需要推迟的行动。如果您需要延迟一个操作,那么它可能应该是一个命令?没有更广泛的问题范围,很难说。您能从流程的角度添加一些您正在做的事情的细节吗?有一个产品创作系统,它在产品数据更改时发布事件。我们是订户,当产品数据发生变化时,我们必须更新我们的系统。有些变化不是立即生效的,因此我们将不得不推迟其中一些事件。例如,事件可能如下所示。2017年9月22日产品更新是一个事件、消息或命令这一事实总是有争议的,但我不能将其更改为消息或命令,因为这会导致其他问题。我同意你的看法,肖恩,你是绝对正确的。我可能会在时间允许的情况下这样做,以便遵循NserviceBus实施的最佳实践。但现在,我正在寻找一个快速的替代方案。谢谢你的建议。