如何取消延迟的 Rebus 消息?

How to cancel a deferred Rebus message?

我正在考虑在我的 Saga 中使用延迟消息作为 delay/timeout 警报机制。我会通过在向处理程序发送消息的同时发送延迟消息来完成一些耗时的工作。

如果该处理程序未能在延迟的时间跨度内发布响应,则 Saga 会通过延迟的消息到达提醒 timeout/delay。这与处理程序故障不同,因为它仍然 运行,只是比预期慢。

如果一切按预期运行,问题就会出现,Saga 可能会完成其所有步骤,您会发现许多延迟的消息正在等待传送到不再存在的 Saga。有没有办法清理您知道不再需要的延迟邮件?

也许有更好的方法在 Rebus 中实现此功能?

延迟消息一经发送便无法取消。

但是 Rebus 恰好会忽略无法与 saga 实例关联的消息,并且 saga 处理程序不允许该特定消息类型启动新的 saga,因此如果 saga 实例消失,消息将简单地被吞了。

这就是在您的 saga 中使用 IHandleMessages<CanBeIgnored>IAmInitiatedBy<CannotBeIgnored> 的区别。