nservicebus でイベントを記述したい場合は、サービスから発行され、1 つ以上のサブスクライバーによって消費されるインターフェイスを作成します。
イベントを「systemerror」と呼びましょう。このイベントは、コード内でそれ以上何かを実行できないポイントに到達するたびに発行されます。
そのため、このイベントは最終的に複数の異なる論理サービスによって発行される可能性があります。この「systemerror」を発行するサービスが 1 つしかない場合に、サブスクライバーからの構成ファイルを見てみましょう。
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="SystemErrorMessages" Endpoint="appserviceQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
今のところ問題ありません。しかし、このイベントを発行するサービスが 2 つある場合はどうなるでしょうか。
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="SystemErrorMessages" Endpoint="appserviceQueue" />
<add Messages="SystemErrorMessages" Endpoint="transportQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
「SystemErrorMessages」という名前のメッセージ エントリが 2 つあるため、これは有効な構成ではありません。
「systemerror」イベントから継承して、各論理サービスが独自の「systemerror」(たとえば「appservice_systemerror」や「transportservice_systemerror」)を発行できるようにすることができます。
サブスクライバーの構成は次のようになります。
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="AppService_SystemErrorMessages" Endpoint="appserviceQueue" />
<add Messages="TransportService_SystemErrorMessages" Endpoint="transportQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
しかし、論理サービス「transportservice」を 2 つ以上の異なるマシンにインストールする場合、どのようなアプローチになるのでしょうか? そのため、2 つの論理サービスがあり、これらのサービスの 1 つが 2 つの物理的な場所にインストールされています。
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="AppService_SystemErrorMessages" Endpoint="appserviceQueue" />
<add Messages="TransportService_SystemErrorMessages" Endpoint="transportQueue1" />
<add Messages="TransportService_SystemErrorMessages" Endpoint="transportQueue2" />
</MessageEndpointMappings>
</UnicastBusConfig>
そのような問題の可能な解決策は何でしょうか? そのような場合を処理する nservicebus コンポーネントはありますか? これらのメッセージがコマンドではなくイベントを示しているという事実に関係なく、メッセージを発行する代わりにメッセージを送信する必要がありますか?