暂停工作人员从队列中获取消息

本文关键字:获取 消息 队列 工作人员 暂停 | 更新日期: 2023-09-27 18:27:25

我一直在尝试了解是否有任何方法可以暂停工作人员从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));
    }

暂停工作人员从队列中获取消息

遗憾的是,公共API并不支持它——不过我收到了一些关于此功能的请求,所以您可能会看到它在未来的版本中公开。

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

通过这种方式,你可以真正实现你想要的。这还不是雷布斯的官方特色,但它可能在未来出现。不过,我可以保证,在运行时调整工作人员数量的能力不会消失。