2017-05-05 2 views
0

나는 RabbitMQ를 처음 사용합니다. while 루프를 사용하면 Queue에 새로 추가 된 메시지를 찾을 수 있습니다. 그러나 나는 그런 식으로 가고 싶지 않다. 또한 EventingBasicConsumer Received 이벤트 처리기를 시도했지만 구독자 코드가 처음 실행될 때 나타나는 메시지 만 트리거합니다. 새로 추가 된 메시지는이 코드를 유발하지 않습니다. 대기열에 새로운 메시지가있는 경우 RibbitMQ에서 알려주는 방법이 있습니까? 새 메시지가있을 때마다 RabbitMQ가 내 웹 응용 프로그램에 알리 길 원합니다.새 메시지가 RabbitMQ 대기열에 추가되면 알림을받는 방법?

Receiver : 
public static class RabbitMQConsumer2 
    { 
     public static void Receive() 
     { 
      var factory = new ConnectionFactory() { HostName = "localhost" }; 
      using (var connection = factory.CreateConnection()) 
      using (var channel = connection.CreateModel()) 
      { 
       channel.ExchangeDeclare(exchange: "logs", type: "fanout"); 

       channel.QueueDeclare("AAA", true, false, false, null); 
       channel.QueueBind(queue: "AAA", 
            exchange: "logs", 
            routingKey: ""); 

       Debug.WriteLine(" [*] Waiting for logs."); 

       var consumer = new EventingBasicConsumer(channel); 
       consumer.Received += (model, ea) => 
       { 
        var body = ea.Body; 
        var message = Encoding.UTF8.GetString(body); 
        Debug.WriteLine(" [x] {0}", message); 
       }; 
       channel.BasicConsume(queue: "AAA", 
            noAck: true, 
            consumer: consumer); 

       Debug.WriteLine(" Press [enter] to exit."); 
      } 
     } 
    } 
+0

두 번째 튜토리얼을 보았습니까? https : //www.rabbitmq.com/tutorials/tutorial-two-java.html 매우 간단합니다. 단지 handleDelivery 메소드를 구현하십시오. – cantSleepNow

답변

0

BasicConsume을 호출 한 직후에 채널과 연결을 닫는 문제가 있습니다 (사용 범위의 끝 부분에 도달하기 때문에). 커넥션과 채널이 살아있는 오래 지속되는 백그라운드 스레드를 시작할 필요가 있습니다. 그러면 메시지가 수신되는 즉시 수신 핸들러가 실행됩니다.

이벤트를 보내는 소비자는 일반적으로 수명이 길고 Windows 서비스 또는 콘솔 응용 프로그램에 더 적합합니다. 그러나 웹 응용 프로그램에서 실제로 필요한 경우 실제로 메시지가 수신되는 백그라운드에 앉아 있어야만 스레드 또는 수명이 긴 작업을 시작하여 정적 개체에 고정하여 죽지 않도록 할 수 있습니다 . 그러나 귀하의 유스 케이스에 대해 알지 못해서 이것이 최고의 충고라고 말할 수는 없습니다.

+0

해당 메이트를 지적 해 주셔서 감사합니다. 내 이벤트 처리기가 트리거되지 않는 이유가 궁금 해서요. 사용하는 블록의 bcz라는 것을 깨닫지 못했습니다. –

관련 문제