使用Bus.SendLocal(IMessage)而不是Bus.Publish(IEvent)启动Saga

时间:2017-01-06 11:18:05

标签: nservicebus

我正在开发一个需要定期轮询第三方API的应用程序。我们在整个项目中大量使用了NServiceBus,我决定使用Saga的好处来帮助维护我的轮询器的状态。

简而言之,Saga用于维护确保轮询正确完成所需的信息,并且还使我们能够简单地创建超时(在每次轮询之后)以确保下一次轮询发生,即使无论出于何种原因,服务都会被停止/泄密/阻止。

我的第一个问题出现在我决定通过让服务订阅自己的事件来启动Saga,然后在服务启动时发布其中一个事件(使用IWantToRunWhenBusStartsAndStops)。问题在于服务会启动并因此发布事件,但它会在订阅创建之前发生。因此,除非我重新启动,否则该服务不会处理旨在启动整个Saga的事件。重新启动服务以绕过此问题并不是我想要考虑的解决方案。

从那时起,随着一些游戏,我发现使用

Bus.SendLocal(new MyMessage());(MyMessage实现IMessage)

将有效启动Saga,无需订阅。 Saga是在数据库中创建的(我使用NHibernate和MSSQL进行持久化),并且正确创建超时并完全按预期运行。

我对这个解决方案的唯一问题是我正在做一些我在NServiceBus文档中找不到任何引用的东西,我担心我可能正在使用一个可能在将来版本中消失的“功能”到期实际上是一种无意的副作用。

简而言之 - 我使用IMessage发送SendLocal来启动传奇。它100%工作并修复了我的所有问题,但它是“正确的”吗?

1 个答案:

答案 0 :(得分:2)

您的解决方案绝对正确,我没有理由不考虑不这样做。