次のようなプロセスを構成したいと思います。
Method Call -> Dynamic Proxy Gateway -> Channel -> Service Activator -> Method Call
^---------- Transformer <- Channel <- [return value]
事実上、Spring Integration が作成する隠しチャネルに何らかの方法でアクセスし、戻りメッセージのペイロードを別のメッセージ タイプに変換したいと考えています。
簡単な解決策は、最初はゲートウェイで default-reply-channel を構成することのように見えるかもしれません。問題は、OSGi を使用してバンドル間でチャネルを共有していることです。Service Activator は Bundle "B" によって提供され、着信要求に共有チャネルを提供します (データ プロバイダー サービスとして機能します)。バンドル「A」はデータを必要とするため、それを要求しますが、別の形式の結果が必要です。バンドル「B」がバンドル「A」によって指定されたデフォルト応答チャネルを使用できる場合、バンドル「A」はそれを共有する必要があることに注意してください。それはすべて公平で問題ありませんが、OSGi に循環依存関係があり、何も開始しません。
ここでの別の解決策は、Service Activator で出力チャネルを定義することのようですが、これには少し異なる問題があります。バンドル「B」から出力チャネルを共有すると仮定すると、循環依存の問題は軽減されましたが、誰かがバンドル「A」から何かを要求すると、出力チャネルに接続されているすべての人に応答が送信されます。これも望ましくありません.
[編集: ここで言いたいのは、「B」がそのサービス アクティベーターの入力チャネルと出力チャネルの両方を共有している場合、「B」の出力チャネルにバインドされている人は誰でも、「B」の入力に対する誰かの要求の結果を受け取るということです。チャネル -- 望ましい動作は、応答がリクエスタに向けられることです。
ここでのトランスフォーマーは、バンドル A のコンテキストでのみ意味があることに注意してください。バンドル B はサービスを提供します (すべての意図と目的のために、私が制御できないものです)。バンドル A のニーズに固有の変換は、バンドル A に存在する必要があります。]
したがって、私が本当に必要だと思うのは、動的プロキシ ゲートウェイへの応答でトランスフォーマーを構成できるようにすることですが、Spring Integration マニュアルでそのようなデバイスを見つけることができないので試してみてください。いつものように、助けていただければ幸いです。
--
編集2 :ここで他の2つの戦術を試みました:
バンドル B の OSGi 共有チャネルを参照するサービス アクティベーターを使用する
その結果、返された要素は GenericMessageType であり、これを変換できる可能性がありました。GenericMessageType は実際には、応答メッセージではなく、サービス アクティベーターが指し示す必要がある「send」メソッドのブール値の結果です。したがって、この方法は機能しません。
ヘッダーエンリッチャーを使用して REPLY_CHANNEL を設定し、返信チャネルを値ではなく参照として渡します。
この手法は機能しませんでした。ゲートウェイの default-reply-channel が設定されている場合 (および default-reply-channelを設定する必要がある場合)、REPLY_CHANNEL ヘッダー要素が無視されるようです。