我一直试图找出是否有办法暂停工作人员从Rebus队列中获取更多的工作/消息?我希望能够"禁用"一个工人通过我的GUI,以便它完成当前正在工作的工作(如果有的话),然后停止接受更多的工作。 然后,如果我想让它再次开始工作,我会通过gui发出信号。
我的Rebus工作人员设置如下:
private void SetupRebus(int numberOfWorkers, string messageName)
{
_adapter = new BuiltinContainerAdapter();
Configure.With(_adapter)
.Logging(l => l.Log4Net())
.Transport(t => t.UseSqlServer(_connectionString, _inputQueue, "error")
.EnsureTableIsCreated())
.Events(x => x.AfterMessage += ((bus, exception, message) => SendWorkerFinishedJob(exception, message)))
.Events(x => x.BeforeMessage += (bus, message) => SignalWorkerStartedJob(message))
.Behavior(x => x.SetMaxRetriesFor<Exception>(0))
.CreateBus().Start(numberOfWorkers);
Log.Info(string.Format("Starting to listen for messages of type {0} from queue {1} queue in {2}", messageName, _inputQueue, _connectionString));
}
答案 0 :(得分:2)
不幸的是,它并没有得到公共API的支持 - 虽然我已经对这个功能提出了一些要求,所以你可能会在未来的版本中看到它。
您现在可以执行此操作:((RebusBus)bus).SetNumberOfWorkers(0)
(即将IBus实例强制转换为RebusBus并更改工作线程数),这将阻止,直到工作人员数量调整到所需数量。所有活跃的工作人员都将完成处理他们正在处理的消息。
这样,您实际上可以实现您所追求的目标。它不仅仅是Rebus的官方功能,但它可能在未来。但我可以保证,在运行时调整工人数量的能力不会消失。