Rebus:如何在不处理总线实例的情况下停止/启动消息处理?

时间:2018-04-12 09:12:19

标签: azureservicebus rebus

我遇到需要在使用Rebus和Azure Service Bus的应用程序实例中暂停消息处理的情况。

应用程序的生命周期在应用程序启动时配置IoC容器,然后在应用程序准备好开始处理消息时配置并启动Rebus,这会自动将Rebus及其依赖项添加到IoC容器中。

在应用程序生命周期的后期阶段,它可能需要暂停消息处理,然后再次启动消息处理,而不重新启动应用程序。

在我目前的实验中,当我需要暂停消息处理时,我尝试处理IBus,但是我没有丢弃IoC容器(Windsor),因为其他组件在暂停期间需要它。我得到的结果是InvalidOperationException

System.InvalidOperationException 
Attempted to register primary -> Rebus.Config.Options, but a primary registration already exists: primary -> Rebus.Config.Options
   at Rebus.Injection.Injectionist.Register[TService](Func`2 resolverMethod, Boolean isDecorator, String description)
   at Rebus.Config.RebusConfigurer.Start()

重新配置并重新启动总线时重复使用相同的容器实例。由于某些Rebus依赖项已经在容器中注册,因此似乎发生了异常。所以我需要一些其他方法来暂停消息处理而不需要处理IBus实例。

是否可以在应用程序的生命周期内暂停/启动消息处理?看看IBus api或IAdvancedApi我找不到合适的方法来实现这个目标。

1 个答案:

答案 0 :(得分:1)

当你知道它时,它很简单:你可以简单地将工作线程数设置为0,这将停止消息处理:

// blocks until all currently executing message handlers have finished
// what they're currently up to
bus.Advanced.Workers.SetNumberOfWorkers(0);

然后通过添加它们再次恢复消息处理:

// you should probably get the number from a configuration
// value somewhere
bus.Advanced.Workers.SetNumberOfWorkers(3);