2016-01-05 5 views
7

Sto riscontrando un problema con le code di coniglio che al momento reagiscono solo al primo messaggio in coda, dopo che tutti gli altri messaggi inviati vengono ignorati.RabbitMQ ascolta solo il primo messaggio in coda

comincio con un'istanza della connessione e dichiarando la coda nel mio IQueueConnectionProvider:

var connectionFactory = new ConnectionFactory() { HostName = hostName }; 
var connection = _connectionFactory.CreateConnection(); 
var channel = connection.CreateModel(); 

Che IQueueConnectionProvider viene poi utilizzato nel mio IQueueListener come dipendenza con un solo metodo:

public void ListenToQueue(string queue) 
{ 
    var channel = _queueConnectionProvider.GetQueue(); 

    var consumer = new EventingBasicConsumer(channel); 
    consumer.Received += (model, ea) => 
    { 
     string path = @"d:\debug.log.txt"; 
     File.AppendAllLines(path, new List<string>() {"MESSAGE RECEIVED", Environment.NewLine }); 

     var body = ea.Body; 
     var message = Encoding.UTF8.GetString(body); 

     channel.BasicAck(ea.DeliveryTag, false); 
    }; 

    channel.BasicConsume(queue, true, consumer); 

} 

Il mio registro il file finisce con una sola riga "MESSAGE RICEVUTO", tuttavia posso vedere nell'interfaccia ui di Rabbit che i miei altri servizi stanno spingendo i messaggi verso quella coda.

C'è qualcosa che mi manca qui?

risposta

3

Questo è stato un errore stupido ... ancora una volta.

channel.BasicConsume(queue, false, consumer); 

Questo era ciò di cui avevo bisogno. Voglio riconoscere manualmente i miei messaggi, pertanto noAck deve essere false;

0

Il codice funziona correttamente! Ho provato con la mia coda, ed è stato in grado di ottenere "MESSAGGIO RICEVUTO" 9 volte nel file di registro; dal momento che avevo 9 messaggi in coda.

Ho provato senza questa riga di codice e ha funzionato correttamente var channel = _queueConnectionProvider.GetQueue();