Es gibt ein paar Dinge, die bei Ihrer Frage verwirrend erscheinen.
Aber ich denke, Ihre grundlegende Frage ist, wie Sie sicher sein können, dass jede Nachricht nur einmal von jedem Abonnenten verarbeitet wird.
Die Antwort ist ziemlich einfach:Verwenden Sie einen separaten Endpunkt für jeden Abonnenten - das bedeutet, dass jeder Abonnent seine eigene Eingabewarteschlange hat, aus der Nachrichten verarbeitet werden und an die eine fehlgeschlagene Nachricht zurückgegeben wird.
Sie können dann so viele oder so wenige Handler in jedem Abonnenten haben, wie Sie möchten. Alle kompatiblen Handler werden für jede eingehende Nachricht ausgeführt.
Bei Rebus ist jeder Aufruf von Configure.With(...).(...).Start()
wird Ihnen einen separaten Endpunkt geben - in Ihrem Fall schlage ich vor, dass Sie die Erstellung des Abonnenten-Endpunkts in eine Methode einschließen, die Sie dann wie folgt aufrufen können:
var event1Subscriber = CreateSubscriber("subscriber_event1");
event1Subscriber.Subscribe<Event1>().Wait();
var event2Subscriber = CreateSubscriber("subscriber_event2");
event2Subscriber.Subscribe<Event2>().Wait();
var event3Subscriber = CreateSubscriber("subscriber_event3");
event3Subscriber.Subscribe<Event3>().Wait();
// ...
wobei CreateSubscriber
wäre dann etwa so:
public IBus CreateSubscriber(string queueName)
{
return Configure.With(GetContainerAdapter())
.Transport(t => t.UseMsmq(queueName))
.Start();
}