2013-02-22 16 views
8

Jeśli mam połączenie z RabbitMQ i słucham zdarzeń za pomocą EventingBasicConsumer, jak mogę stwierdzić, czy zostałem odłączony od serwera?W jaki sposób klient RabbitMQ może powiedzieć, kiedy traci połączenie z serwerem?

Wiem, że istnieje zdarzenie Shutdown, ale nie uruchamia się po odłączeniu kabla sieciowego w celu zasymulowania awarii.

Próbowałem również zdarzenie ModelShutdown i wyjątek CallbackException na modelu, ale żaden nie wydaje się działać.

EDYCJA ----- Ta, którą zaznaczam jako odpowiedź, jest poprawna, ale dla mnie była to tylko część rozwiązania. Istnieje również funkcja HeartBeat wbudowana w RabbitMQ. Serwer określa go w pliku konfiguracyjnym. Domyślnie jest to 10 minut, ale oczywiście możesz to zmienić.

Klient może również zażądać innego interwału pulsu, ustawiając wartość RequestedHeartbeat w instancji ConnectionFactory.

+0

Możesz dodać puls do połączenia, które wykryje przerwę w działaniu usługi. – robthewolf

+0

Czy możesz wysłać cały swój kod? Mam do czynienia z tym samym problemem. Z góry dziękuję. – Pritam

+0

Naprawdę potrzebujesz 3 rzeczy. 1 ConnectionFactory musi ustawić RequestedHeartBeat. 2 po utworzeniu połączenia zdefiniuj zdarzenie ConnectionShutdown zgodnie z opisem w zaznaczonej odpowiedzi. 3 upewnij się, że poprawnie skonfigurowałeś plik konfiguracyjny rabbitmq. (Przepraszam, nie mam obecnie tej części.) Zobaczę, czy mogę wyodrębnić kod bez żadnych konkretnych elementów implementacji. – Kelly

Odpowiedz

5

Zgaduję, że używasz biblioteki C#? (ale mimo to myślę, że inni mają podobne wydarzenie).

można wykonać następujące czynności:

public class MyRabbitConsumer 
{ 
    private IConnection connection; 

    public void Connect() 
    { 
    connection = CreateAndOpenConnection(); 
    connection.ConnectionShutdown += connection_ConnectionShutdown; 
    } 

    public IConnection CreateAndOpenConnection() { ... } 

    private void connection_ConnectionShutdown(IConnection connection, ShutdownEventArgs reason) 
    { 

    } 
} 
+0

Gdzie powinienem wdrożyć ten kod? – Pritam

0

To jest przykład tego, ale odpowiedź jest zaznaczone, co prowadzi mnie do tego.

var factory = new ConnectionFactory 
{ 
    HostName = "MY_HOST_NAME", 
    UserName = "USERNAME", 
    Password = "PASSWORD", 
    RequestedHeartbeat = 30 
}; 

using (var connection = factory.CreateConnection()) 
{ 
    connection.ConnectionShutdown += (o, e) => 
    {      
     //handle disconnect        
    }; 

    using (var model = connection.CreateModel()) 
    { 
     model.ExchangeDeclare(EXCHANGE_NAME, "topic"); 
     var queueName = model.QueueDeclare(); 

     model.QueueBind(queueName, EXCHANGE_NAME, "#"); 

     var consumer = new QueueingBasicConsumer(model); 
     model.BasicConsume(queueName, true, consumer); 

     while (!stop) 
     { 
      BasicDeliverEventArgs args;      
      consumer.Queue.Dequeue(5000, out args); 

      if (stop) return; 

      if (args == null) continue; 
      if (args.Body.Length == 0) continue; 

      Task.Factory.StartNew(() => 
      { 
       //Do work here on different thread then this one 
      }, TaskCreationOptions.PreferFairness); 
     } 
    } 
} 

Kilka rzeczy na ten temat.

Używam # do tematu. To łapie wszystko. Zwykle chcesz ograniczyć temat.

Ustawiam zmienną o nazwie "stop", aby określić, kiedy proces powinien się zakończyć. Zauważycie, że pętla działa wiecznie, dopóki ta zmienna nie jest prawdziwa.

Kolejka czeka 5 sekund, a następnie wychodzi bez uzyskiwania danych, jeśli nie ma nowej wiadomości. Ma to na celu zapewnienie, że będziemy nasłuchiwać tej zmiennej zatrzymującej i faktycznie przestaniemy w pewnym momencie. Zmień wartość według swoich upodobań.

Kiedy przychodzi wiadomość, odradzam kod obsługi nowego wątku. Bieżący wątek jest zarezerwowany tylko do słuchania wiadomości rabbitmq i jeśli procedura obsługi zajmuje zbyt wiele czasu, nie chcę, aby spowalniała ona inne wiadomości. Możesz tego potrzebować lub nie, w zależności od implementacji. Uważaj jednak, pisząc kod do obsługi wiadomości. Jeśli zajmie to minutę, a otrzymasz wiadomości pod sekundą, zabraknie pamięci lub przynajmniej poważnych problemów z wydajnością.

Powiązane problemy