あなたの質問と混同しているように思われることがいくつかあります。
しかし、あなたの基本的な質問は、各メッセージが各サブスクライバーによって1回だけ処理されるようにする方法だと思います。
答えは非常に簡単です。サブスクライバーごとに個別のエンドポイントを設定します。これは、各サブスクライバーが、メッセージの処理元と失敗したメッセージの返送先となる独自の入力キューを持つことを意味します。
その後、各サブスクライバーに必要な数のハンドラーを含めることができます。互換性のあるすべてのハンドラーは、着信メッセージごとに実行されます。
Rebusを使用すると、Configure.With(...).(...).Start()
を呼び出すたびに 個別のエンドポイントが提供されます。そのため、この場合、サブスクライバエンドポイントの作成をメソッドでラップすることをお勧めします。このメソッドは、次のように呼び出すことができます。
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();
// ...
ここで、CreateSubscriber
その場合、次のようになります:
public IBus CreateSubscriber(string queueName)
{
return Configure.With(GetContainerAdapter())
.Transport(t => t.UseMsmq(queueName))
.Start();
}