0

我们目前有一个 Singleton Saga(在此处实现:https ://lostechies.com/jimmybogard/2015/04/17/saga-implementation-patterns-singleton/ )在特定超时后重新发送消息。

这很好用,因为相应的处理程序可以捕获消息并做它的东西。不幸的是,例如在安装日,捕捉 Messagesis 的 Handler 停止了,但 Saga 以其幸福的无知继续产生消息。根据 Handler 不在的时间,队列中充满了消息。由于此消息仅触发满载,因此每次在总线上几乎只有一条消息就足够了。我在这里有几种可能性:

  • 最简单的方法是访问队列(以某种方式)并检查消息是否存在。但从我所见,这不可能开箱即用
  • 我设置了一个 [TimeToBeReceived]-属性。这将减轻处理程序停机期间的痛苦
  • 我在 Saga 中引入了一个 State。处理程序必须在总线上自己放置一条消息,然后由 Saga 处理。这似乎是类似“Saga”的方法,但它依赖于 Handler

最简单的解决方案是有可能将消息标记为单例,但我没有找到任何提示,如何做到这一点。第二种最简单的方法,检查队列,对于给定的接口似乎也不是那么容易。

是否有任何遗漏的可能性,或者是否有一种方法更适合 NServiceBus 背后的心态?

4

1 回答 1

0

TimeToBeReceived 是一个不错的选择,但在端点启动并运行时无济于事。消息没有时间过期,将被处理。

saga 方法可以工作,但这意味着有消息系列,每个系列都有一些唯一标识符。我在你的描述中没有看到。

鉴于处理端点可以在任何时候离线,我假设在端点关闭时,可能会多次发送一般的启动消息(不是唯一的)。我会将处理程序放在一个单独的端点中,并将该端点配置为在启动时丢弃旧消息。这样,在端点关闭时到来的所有消息都将被丢弃。有一些警告。

  1. 队列中的所有消息都将消失。因此需要小心哪些其他消息被发送到队列。
  2. 如果您希望处理程序响应系列中的第一条消息,这将不起作用,因为无法知道在端点运行时是否发送了第一条消息。

如果第二个要点是您所面临的,那么有一个状态是不可避免的。

于 2018-06-05T04:10:49.127 回答