NServiceBus:作为单身人士的消息

时间:2018-05-30 11:05:37

标签: c# nservicebus nservicebus5

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

这样可以正常工作,因为相应的处理程序可以捕获消息并执行它的操作。 不幸的是,例如在安装日,赶上Messagesis的Handler停止了,但Saga带着幸福的无知继续产生消息。根据处理程序不在的时间,队列中充满了消息。 由于此消息仅触发完全加载,因此每次在总线上只有一条消息就足够了。我有几种可能性:

  • 最简单的方法是访问队列(以某种方式)并检查消息是否存在。从我所看到的情况来看,这不可能开箱即用
  • 我设置了[TimeToBeReceived] -Attribute。这可以减轻处理程序停机期间的痛苦
  • 我介绍一个国家进入佐贺。处理程序必须在总线上放置一条消息,然后由Saga处理。这似乎是" Saga"-like方法,但是它依赖于Handler

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

是否有任何缺失的可能性或是否有一种方法,哪种方法更适合NServiceBus背后的思维方式?

1 个答案:

答案 0 :(得分:0)

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

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

鉴于处理端点可以在任何时间点离线,我假设可能多次发送一般的启动消息(非唯一),而端点关闭。我将处理程序放在一个单独的端点中,并将该端点配置为discard old messages at startup。这样,端点关闭时发出的所有消息都将被丢弃。有一些警告。

  1. 队列中的所有消息都将消失。因此,需要注意将其他消息发送到队列。
  2. 如果您希望处理程序响应系列中的第一条消息,这将无法正常工作,因为无法知道在端点运行时是否发送了第一条消息。
  3. 如果第二个要点是你所面对的,那么拥有一个国家是不可避免的。