2012-05-08 8 views
7

Ich habe ein einfaches Publisher/Consumer-Set mit MassTransit implementiert, und ich möchte die Verbraucher die Nachrichten aus der gleichen Warteschlange lesen lassen. Wenn ich es jedoch ausführe, sehe ich einen großen Teil der Nachrichten, die an die Fehlerwarteschlange gesendet werden, anstatt verbraucht zu werden. Von den Diskussionen, die ich gesehen habe (SO, Forum), sollte dies mit RabbitMQ wirklich sehr einfach sein (zeigen Sie einfach auf die gleiche Warteschlange), aber es funktioniert nicht. Gibt es eine zusätzliche Konfiguration, die eingestellt werden sollte?Konkurrierende Verbraucher in Massentransit mit RabbitMQ

hier mein Verlag

public class YourMessage { public string Text { get; set; } } 
public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Publisher"); 
     Bus.Initialize(sbc => 
     { 
      sbc.UseRabbitMqRouting(); 
      sbc.ReceiveFrom("rabbitmq://localhost/test_queue"); 
     }); 
     var x = Console.Read(); 
     for (var i = 0; i <= 1000; i++) 
     { 
      Console.WriteLine("Message Number " + i); 
      Bus.Instance.Publish(new YourMessage { "Message Number " + i }); 
     } 
    } 
} 

And My Consumer

public class YourMessage { public string Text { get; set; } } 
public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Consumer"); 
     Bus.Initialize(sbc => 
     { 
      sbc.UseRabbitMqRouting(); 
      sbc.ReceiveFrom("rabbitmq://localhost/test_queue"); 
      sbc.Subscribe(subs => 
      { 
       var del = new Action<IConsumeContext<YourMessage>,YourMessage>((context, msg) => 
       { 
        Console.WriteLine(msg.Text); 
       }); 
       subs.Handler<YourMessage>(del); 
      }); 
     }); 
     while (true) { } 
    } 
} 

Antwort

5

Der Empfänger/Verbraucher und Verlag kann nicht auf der gleichen Warteschlange sein. Wenn Sie möchten, dass konkurrierende Kunden mehrere Instanzen des Verbrauchers in derselben Warteschlange ausführen.

Wir haben Dokumentation, aber dieser Abschnitt fehlt derzeit, so verstehe ich Ihre Verwirrung: http://readthedocs.org/docs/masstransit/en/latest/configuration/gotchas.html#how-to-setup-a-competing-consumer Wenn Sie erfolgreich sind, wäre die Hilfe mit der Dokumentation wunderbar.

4

So sieht es aus wie die Lösung, die die Linie in den Verlag zu ändern war:

sbc.ReceiveFrom("rabbitmq://localhost/test_queue"); 

Um so etwas wie:

sbc.ReceiveFrom("rabbitmq://localhost/test_queue_publisher"); 

Dies verhinderte, dass die Verlage vom Wettbewerb um Nachrichten, die sie nicht waren zum Konsumieren konfiguriert

Verwandte Themen