1

我一直在尝试找出是否有任何方法可以阻止工作人员从 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));
    }
4

1 回答 1

2

不幸的是,公共 API 不容易支持它——不过我已经收到了一些关于这个功能的请求,所以你可能会在未来的版本中看到它公开。

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

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

于 2014-10-21T07:45:02.040 回答