Il y a quelques éléments qui semblent déroutants avec votre question.
Mais je suppose que votre question fondamentale est de savoir comment être sûr que chaque message est traité une seule fois par chaque abonné.
La réponse est assez simple :avoir un point de terminaison distinct pour chaque abonné - cela signifie que chaque abonné aura sa propre file d'attente d'entrée à partir de laquelle les messages seront traités et vers laquelle un message ayant échoué sera renvoyé.
Vous pouvez alors avoir autant ou aussi peu de gestionnaires que vous le souhaitez dans chaque abonné. Tous les gestionnaires compatibles seront exécutés pour chaque message entrant.
Avec Rebus, chaque invocation à Configure.With(...).(...).Start()
vous donnera un point de terminaison séparé - donc dans votre cas, je vous suggère d'envelopper la création du point de terminaison de l'abonné dans une méthode, que vous pouvez ensuite invoquer comme ceci :
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();
// ...
où CreateSubscriber
serait alors quelque chose comme ceci :
public IBus CreateSubscriber(string queueName)
{
return Configure.With(GetContainerAdapter())
.Transport(t => t.UseMsmq(queueName))
.Start();
}