Приостановить воркера на получение сообщений из очереди

Я пытался выяснить, есть ли способ приостановить выполнение работником дополнительных заданий / сообщений из очереди Rebus? Я хочу иметь возможность «отключить» воркера через свой графический интерфейс, чтобы он завершил работу, над которой работает в данный момент (если таковая имеется), а затем перестал выполнять другие задания. Затем, если я хочу, чтобы он снова начал работать, я сигнализирую об этом через графический интерфейс.

Моя рабочая установка для 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));
    }

person jopa    schedule 21.10.2014    source источник


Ответы (1)


К сожалению, он не поддерживается общедоступным API - хотя у меня было несколько запросов на эту функцию, поэтому вы можете увидеть ее в будущей версии.

Вы можете сделать это в данный момент: ((RebusBus)bus).SetNumberOfWorkers(0) (т.е. преобразовать экземпляр IBus в RebusBus и изменить количество рабочих потоков), который будет блокироваться до тех пор, пока количество рабочих не будет отрегулировано до желаемого числа. Все активные сотрудники закончат обработку сообщений, над которыми они работают.

Таким образом, вы действительно сможете добиться того, чего хотите. Это просто не официальная функция Rebus (пока), но, возможно, в будущем. Однако я могу гарантировать, что возможность регулировать количество рабочих процессов во время выполнения никуда не денется.

person mookid8000    schedule 21.10.2014
comment
Спасибо за быстрый ответ! - person jopa; 21.10.2014