Jest kilka rzeczy, które wydają się mylące z Twoim pytaniem.
Ale myślę, że twoje podstawowe pytanie brzmi:jak mieć pewność, że każda wiadomość jest przetwarzana tylko raz przez każdego subskrybenta.
Odpowiedź jest dość prosta:miej osobny punkt końcowy dla każdego subskrybenta - oznacza to, że każdy subskrybent będzie miał własną kolejkę wejściową, z której wiadomości będą przetwarzane i do której zostanie zwrócona wiadomość, która się nie powiodła.
Możesz wtedy mieć tyle lub mniej handlerów w każdym subskrybencie, ile chcesz. Wszystkie kompatybilne procedury obsługi zostaną wykonane dla każdej wiadomości przychodzącej.
W Rebusie każde wywołanie Configure.With(...).(...).Start()
da ci osobny punkt końcowy - więc w twoim przypadku sugeruję, abyś zawinął tworzenie punktu końcowego subskrybenta w metodę, którą możesz następnie wywołać w następujący sposób:
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();
// ...
gdzie CreateSubscriber
byłoby wtedy mniej więcej tak:
public IBus CreateSubscriber(string queueName)
{
return Configure.With(GetContainerAdapter())
.Transport(t => t.UseMsmq(queueName))
.Start();
}