Rebus と NServiceBus アプリケーション間のブリッジを提供する最良の方法は何ですか? 私のアプリケーションでは、古い NServiceBus 2.0 ホストにメッセージを送受信する必要があります。
少し掘り下げてみると、Rebus に NServiceBusMessageFormatter の必要性を感じました。自分が向かっている方向がよくわからない。
Rebus と NServiceBus アプリケーション間のブリッジを提供する最良の方法は何ですか? 私のアプリケーションでは、古い NServiceBus 2.0 ホストにメッセージを送受信する必要があります。
少し掘り下げてみると、Rebus に NServiceBusMessageFormatter の必要性を感じました。自分が向かっている方向がよくわからない。
これにはいくつかの解決策を想像できますが、ここで説明するものよりも簡単な解決策があるかもしれません。
たとえば、NServiceBus エンドポイントに一方向のメッセージング チャネルを提供するだけの場合は、IHandleMessages<object>
すべてのメッセージを NServiceBus エンドポイントに転送する の実装を使用して単純な Rebus エンドポイントをスピンアップするだけで済みます。その Rebus エンドポイントは内部でホストすることもできます。古い NServiceBus エンドポイント。
しかし、メッセージを送受信できる必要があると述べていますが、NServiceBus エンドポイントで要求/応答を実行できる必要があるかのように読みました。
これを実現するには、NServiceBus エンドポイントを他のものとして扱い、統合する必要があります。ただし、NServiceBus エンドポイントには非同期 API があります。つまり、NServiceBus 応答を受信したときに誰に応答するかを何らかの形で把握できる必要があります。
私が見ているように、これは2つの方法で達成できます。
これを行い、NServiceBus エンドポイントに送信される要求にヘッダー値を含め、rebus-return-address
エンドポイントがこの元のリターン アドレスをブリッジに返されるすべての応答にコピーするようにします。
これは、元の Rebus リターン アドレスをリクエストのカスタム ヘッダーに格納し、NServiceBus のフックを使用して、レガシー NServiceBus エンドポイントから送信されるすべての応答にヘッダーがコピーされるようにすることで実行できます。
このように、ブリッジはbus.Advanced.Routing.Send(originalRebusReturnAddress, reply)
受信した NServiceBus メッセージに対して を実行して、返信を元のリクエスタに明示的にルーティングできます。
このようにして、受信する Rebus リクエストごとに新しいものを考え出し、受信するリクエストのヘッダーGuid
の値とともに、その内部にその GUID を使用してサガを開始します。rebus-return-address
次に、従来の NServiceBus エンドポイントへのリクエストの NServiceBus 相関 ID として guid を割り当てることができます。これは、すべての返信に自動的にコピーされます。
次に、ブリッジに戻って、着信 NServiceBus メッセージ (従来のエンドポイントからの応答である必要があります) を転送するために使用できる特別なメッセージ ラッパーを次のように作成します。
public class ForwardedReply
{
public Guid CorrelationId { get; set; }
public object ReplyMessage { get; set; }
}
次に、(唯一の) NServiceBus メッセージ ハンドラーで次のようなことを行います。
public class BridgeIncomingNsbMessagesToRebus : NServiceBus.IHandleMessages<object>
{
public Rebus.IBus Bus { get; set; }
public void Handle(object msg)
{
Bus.SendLocal(new ForwardedReply {
CorrelationId = GetCorrelationIdFrom(msg),
ReplyMessage = msg
});
}
}
このようにして、フォワーダー サガは受信ForwardedReply
メッセージをCorrelationId
プロパティで関連付け、サガ ハンドラーにコンテンツをReplyMessage
元の送信者 (アドレスがサガに保存されている) に送り返すようにさせることができます。
おっと、それは長い答えでした-それがあなたにとって理にかなっていることを願っています:)しかし、覚えておいてください-レガシーエンドポイントで使用できるようにする必要があるメッセージング交換パターンによっては-すべてがより単純に見える場合があります(またはより複雑 ;))