2014-10-21 4 views
1

작업자가 Rebus 대기열에서 더 많은 작업/메시지를 가져 오지 못하도록하는 방법이 있는지 알아 내려고했습니다. 내 GUI를 통해 작업자를 "비활성화"하여 현재 작업중인 작업을 종료하고 더 많은 작업을 중단 할 수 있기를 원합니다. 그런 다음 작업을 다시 시작하기를 원한다면 GUI를 통해 신호를 보냅니다.작업자가 대기열에서 메시지를 가져 오지 못하게합니다.

수수께끼에 대한 나의 작업자 설정은 다음과 같습니다

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)); 
    } 

답변

2

를 불행하게도, 그것은 쉽게 공개 API에 의해 지원되지 않는 - 당신이 노출 볼 수 있습니다, 그래서 나는,하지만이 기능에 대한 몇 가지 요청을 했어 미래 버전.

현재로서는 ((RebusBus)bus).SetNumberOfWorkers(0) (예 : IBus 인스턴스를 RebusBus로 캐스팅하고 작업자 스레드 수를 변경)를 수행 할 수 있습니다. 이는 작업자 수가 원하는 수로 조정될 때까지 차단됩니다. 모든 활동중인 직원이 작업중인 메시지 처리를 마칩니다.

이렇게하면 실제로 무엇을 달성 할 수 있습니다. Rebus의 공식 기능은 아니지만 (아직) Rebus는 미래에있을 수 있습니다. 하지만 런타임에 근로자 수를 조정하는 기능이 사라지지 않을 것이라고 보장 할 수 있습니다.

+0

빠른 응답을 보내 주셔서 감사합니다! – jopa