问题描述
||
这是我在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似乎不起作用。
解决方法
@bsf的答案
我找到了解决方案。
CreateBus()
返回IStarableBus
。如果我对它保持静态引用,并在下一次调用ѭ2dis之前将其处置,则一切似乎正常。