暂停工作程序从队列中获取消息

时间:2014-10-21 07:23:57

标签: c# bus rebus

我一直试图找出是否有办法暂停工作人员从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));
    }

1 个答案:

答案 0 :(得分:2)

不幸的是,它并没有得到公共API的支持 - 虽然我已经对这个功能提出了一些要求,所以你可能会在未来的版本中看到它。

您现在可以执行此操作:((RebusBus)bus).SetNumberOfWorkers(0)(即将IBus实例强制转换为RebusBus并更改工作线程数),这将阻止,直到工作人员数量调整到所需数量。所有活跃的工作人员都将完成处理他们正在处理的消息。

这样,您实际上可以实现您所追求的目标。它不仅仅是Rebus的官方功能,但它可能在未来。但我可以保证,在运行时调整工人数量的能力不会消失。