这是我在StackOverflow上的第一篇文章。
我试图将NServiceBus放在一个如下所示的界面之后:
interface IMessagingService
{
IObserver<T> RegisterPublication<T>() where T : IPublishedMessage;
IObservable<T> RegisterSubscription<T>() where T : IPublishedMessage;
}
为了支持这个接口而不强迫用户进行明确的Start()调用,每次调用RegisterSubscription并调用如下所示的方法时,我需要重新配置总线:
IBus ConfigureBus()
{
Configure config = BuildConfiguration();
return config.CreateBus().Start();
}
我无法复制和粘贴真实代码,但希望您可以看到,一旦调用RegisterSubscription,我需要有一个启动总线来监听消息。我需要在后续调用中添加订阅者。
我遇到的问题是每次调用ConfigureBus()似乎都会激活更多线程并导致消息丢失。我的处理程序实例未被调用,但NServiceBus记录它已完成处理每个消息。 通过四次调用RegisterSubscription,我丢失了大约40%的消息。
是否有一种安全的方法可以在不导致此问题的情况下即时重新配置和重新启动IBus? IBus.Subscribe似乎不起作用。
答案 0 :(得分:0)
@ bsf的回答
我找到了解决方案。 CreateBus()
会返回IStarableBus
。如果我保留静态引用并在下次调用CreateBus()
之前将其处理掉,那么一切似乎都正常。