Questo è un esempio di esso, ma la risposta contrassegnato è quello che mi ha portato a questo.
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);
}
}
}
Alcune cose da notare su questo.
Sto usando # per l'argomento. Questo prende tutto. Di solito vuoi limitare un argomento.
Sto impostando una variabile chiamata "stop" per determinare quando il processo dovrebbe terminare. Noterai che il ciclo gira per sempre fino a quando quella variabile è vera.
Il Dequeue attende 5 secondi quindi esce senza ricevere dati se non c'è un nuovo messaggio. Questo per garantire che ascoltiamo quella variabile di stop e in realtà smettiamo ad un certo punto. Cambia il valore a tuo piacimento.
Quando arriva un messaggio sposto il codice di gestione su una nuova discussione. Il thread corrente è riservato solo per ascoltare i messaggi di rabbitmq e se un gestore impiega troppo tempo per elaborare non voglio rallentare gli altri messaggi. Potrebbe essere necessario o meno a seconda della tua implementazione. Fai attenzione però a scrivere il codice per gestire i messaggi. Se è necessario un minuto per eseguire e ricevere i messaggi in tempi inferiori alla seconda, si esaurirà la memoria o almeno in gravi problemi di prestazioni.
È possibile aggiungere un heartbeat alla connessione che rileverà l'interruzione del servizio – robthewolf
È possibile pubblicare l'intero codice? Sto affrontando lo stesso problema. Grazie in anticipo. – Pritam
Hai davvero bisogno di 3 cose. 1 ConnectionFactory deve impostare un RequestedHeartBeat. 2 dopo aver creato una connessione, definire l'evento ConnectionShutdown come descritto nella risposta contrassegnata. 3 assicurati di averlo configurato correttamente nel file di configurazione di rabbitmq. (scusa non ho questa parte in giro al momento). Vedrò se riesco a estrarre il codice senza alcuna specifica implementazione. – Kelly