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ą.
Możesz dodać puls do połączenia, które wykryje przerwę w działaniu usługi. – robthewolf
Czy możesz wysłać cały swój kod? Mam do czynienia z tym samym problemem. Z góry dziękuję. – Pritam
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