我正在开发一个需要定期轮询第三方API的应用程序。我们在整个项目中大量使用了NServiceBus,我决定使用Saga的好处来帮助维护我的轮询器的状态。
简而言之,Saga用于维护确保轮询正确完成所需的信息,并且还使我们能够简单地创建超时(在每次轮询之后)以确保下一次轮询发生,即使无论出于何种原因,服务都会被停止/泄密/阻止。
我的第一个问题出现在我决定通过让服务订阅自己的事件来启动Saga,然后在服务启动时发布其中一个事件(使用IWantToRunWhenBusStartsAndStops
)。问题在于服务会启动并因此发布事件,但它会在订阅创建之前发生。因此,除非我重新启动,否则该服务不会处理旨在启动整个Saga的事件。重新启动服务以绕过此问题并不是我想要考虑的解决方案。
从那时起,随着一些游戏,我发现使用
Bus.SendLocal(new MyMessage());
(MyMessage实现IMessage)
将有效启动Saga,无需订阅。 Saga是在数据库中创建的(我使用NHibernate和MSSQL进行持久化),并且正确创建超时并完全按预期运行。
我对这个解决方案的唯一问题是我正在做一些我在NServiceBus文档中找不到任何引用的东西,我担心我可能正在使用一个可能在将来版本中消失的“功能”到期实际上是一种无意的副作用。
简而言之 - 我使用IMessage
发送SendLocal
来启动传奇。它100%工作并修复了我的所有问题,但它是“正确的”吗?
答案 0 :(得分:2)
您的解决方案绝对正确,我没有理由不考虑不这样做。