2016-06-20 8 views
2

Ich benutze den C# -Client für RabbitMQ. Viele Beispiele verwenden Console.ReadLine() oder while(true), um die Verbindung offen zu halten, um Nachrichten zu konsumieren. while(true) wird die CPU brennen und ReadLine() ist nicht wirklich auf einem Webserver anwendbar.C#: RabbitMQ-Nachrichten auf Web-Server

Ich benutze Asp.Net Core Web Service und versuche, einige Tests dafür zu schreiben. In meinem der Server-Startmethode, nenne ich

Task.Factory.StartNew(() => 
     { 
      using (IConnection connection = _connectionFactory.CreateConnection()) 
      { 
       using (IModel channel = connection.CreateModel()) 
       { 
        // configuring queue etc.... 
        options.DeclareConsumer(queueName, MessageReceived); 

        ResetEvent.WaitOne(); 
       } 
      } 
     }); 

ich diese Aufgabe nicht überall erwarten. Natürlich möchte ich, dass mein Webserver immer noch Anfragen bedient.

In meinem Integrationstest würde ich dann in der Lage sein, den Faden zu stoppen mit MailMessageQueue.ResetEvent.Set();, was ich brauche nicht, ob ich Block nicht, ist aber hilfreich, wenn ich sperren müssen ..

Ich bin etwas verwirrt, wenn ich sollte blockieren oder nicht, wie viele Threads brauche ich usw. Gibt es irgendwo ein nützliches Beispiel?

Dank ..

Antwort

1

In Konsolenanwendungen, wenn Sie so etwas wie Console.ReadLine nicht setzen - der Prozess wird beendet, wenn es Haupt-Thread beendet (nicht immer, aber das ist nicht der Punkt hier). Dies ist nicht der Fall in Web-Server-Anwendungen, wie asp.net (oder vielmehr - Sie sollten sich nicht darum kümmern, da es nicht von Ihnen behandelt wird). Aus diesem Grund - Sie müssen nicht neue Thread starten und dann blockieren, indem Sie warten - es tut nur nichts nützliches und verbraucht einen Thread.

Weil Kaninchen Verbraucher läuft bereits auf separaten Thread intern, entfernen Sie Ihre Blöcke mit und Verbindung und Kanal in Haupt-Thread erstellen:

class MailMessageQueue : IDisposable { 
    private IConnection _connection; 
    private IModel _channel; 

    public void Start() { 
     _connection = _connectionFactory.CreateConnection(); 
     _channel = connection.CreateModel(); 
     // configuring queue etc.... 
     options.DeclareConsumer(queueName, MessageReceived); 
    } 

    public void Stop() { 
     _channel.Dispose(); 
     _connection.Dispose(); 
    } 

    public void Dispose() { 
     Stop(); 
    } 
} 

Wenn Sie fertig sind (das ist, wenn, bevor Sie würden Ihr Event-Signal) - Entsorg dich einfach in die Warteschlange.

+0

Danke für die schnelle Antwort. Werde das versuchen, sieht vielversprechend aus :) – Senj