2017-11-03 1 views
2

구독자를 사용/사용 중지 할 수있는 기능이 있습니다. 메시지는 전송 될 수 있지만 구독자가 해제 된 경우에는 대기열에서 메시지를 처리하지 않는 것이 좋습니다. 다시 켜면 대기열에서 메시지 처리를 시작합니다.구독자 일시 중지

필자는 pub/sub 및 요청/답장 예제를 살펴보고 Rebus의 소스 코드를 가져 와서이 질문에 대답 할 수있는 기능을 찾아 보았습니다. Defer 메서드는 메시지 전송에 시간 지연을 적용 할 수 있지만 필요한 지연은 구독자를 켜거나 끄는 것을 기반으로합니다.

주요 질문은 구독자를 일시 중지하는 몇 가지 방법입니까?

(한 가입자, 모든 가입자, 그래서 나는 SetWorkerThreads (0) 기술이 작동합니다 생각하지 않습니다) 대답은과 같이 _activator.Bus.Advanced.Workers.SetNumberOfWorkers(0)을 사용

UPDATE :

public static class Subscriber1 
{ 
    private static BuiltinHandlerActivator _activator; 
    public static void Start(ILogger logger) 
    { 
     _activator = new BuiltinHandlerActivator(); 
     _activator.Register(() => new Subscriber1MessageHandler()); 
     Configure.With(_activator) 
       .Transport(t => t.UseMsmq("subscriber1")) 
       .Logging(l => l.Serilog(logger)) 
       .Routing(r => r.TypeBased().Map<Subscriber1Message>("thepublisher")) 
       .Start(); 
     _activator.Bus.Subscribe<Subscriber1Message>().Wait(); 
    } 
    public static void Pause() 
    { 
     _activator.Bus.Advanced.Workers.SetNumberOfWorkers(0); 
    } 
    public static void Resume() 
    { 
     _activator.Bus.Advanced.Workers.SetNumberOfWorkers(1); 
    } 
} 
+0

구독자는 어떻게 배포됩니까? Windows 서비스입니까? – mookid8000

+0

IIS의 웹 API 응용 프로그램에 게시자와 구독자가 동일한 IIS 프로세스에서 실행되고 있습니다. –

답변

0

왜 당신이 말을 이해할 수 없다

모든 구독자가 아니라 한 명의 구독자이므로 SetWorkerThreads (0) 기술이 작동한다고 생각하지 않습니다.

제안 사항 : 특정 구독자의 활성 작업자 스레드 수를 0으로 낮추기 만하면됩니다.

이 방법을 사용하면 대기열에서 메시지를 수신하지 못하게되고 다시 0 이상의 숫자로 작업자 수를 다시 설정하여 메시지 처리를 다시 시작할 수 있습니다.

btw. 구문은 다음과 같습니다.

bus.Advanced.Workers.SetNumberOfWorkers(0); 

그리고 조정자 수를 조정할 때까지 차단됩니다.

+0

SetNumberOfWorkers (0)는 구독자가 작동하지 않는다는 것을 의미한다고 생각했습니다. 테스트를 위해 사용한 패턴은 모든 구독자가 일시 중지 및 이력서 (예 : 주석을 너무 오래 업데이트하여 게시)를 표시한다는 것입니다. –

관련 문제