4

ゲートウェイと複数のパラメーターについて質問があります。

コンテキスト: ゲートウェイに 2 つのメソッドを持たせたい:

search(Query query, FetchSpec fetchSpec);
search(int queryId, FetchSpec fetchSpec);

最初のメソッドはクエリを実行するサービスに直接ルーティングする必要があり、2 番目のメソッドは別のサービスにルーティングして queryId をクエリに解決し、次に最初のサービスにルーティングしてクエリを実行する必要があります。

質問: Gateway メソッドの引数として 2 つ (またはそれ以上) のパラメーターを使用するためのベスト プラクティスは何ですか? パターン全体が、1 つのメッセージに対応するパラメーターを 1 つだけ持つことをターゲットにしているようです。追加のパラメーターを追加するためにメッセージ ヘッダーを使用する必要がありますか?

4

2 に答える 2

5

質問をすることで、問題について考えざるを得なくなったのだと思います。

私の質問への答えはこれです:

ゲートウェイは、ペイロードとして 1 つのパラメーターのみを受け取ります。残りは、カスタム名を持つヘッダーフィールドに送られます。したがって、私の場合、次のようにします。

@Gateway (requestChannel = "incomingAdhocQuery")
public ResultSet search(@Payload Query query, @Header("fetchSpec") FetchSpec fetchSpec);

@Gateway (requestChannel = "incomingPersistedQuery")
public ResultSet search(@Payload int queryId, @Header("fetchSpec") FetchSpec fetchSpec);

どのパラメーターがペイロードで、どれがヘッダーであるかを定義します。次に、各メソッドは、サービスをアクティブ化するためにメッセージを特定のチャネルに送信します。

構成では、ゲートウェイを次のように定義します。

<int:gateway service-interface="my.company.search.Search" />

次に、ゲートウェイ方式ごとに 1 つの特定の構成で検索サービスをアクティブにします。

<bean id="myManager" class="my.company.search.MyManager"/>
<int:service-activator input-channel="incomingAdhocQuery"  expression="@myManager.fetchByQuery(payload, headers['fetchSpec'])"/>
<int:service-activator input-channel="incomingPersistedQuery" expression="@myManager.fetchById(payload, headers['fetchSpec'])"/>

このようにして、マネージャーを次のように設計します。

public ResultSet fetchById(int queryId, FetchSpec fetchSpec) {...}

public ResultSet fetchByQuery(Query query, FetchSpec fetchSpec) {...}

サービスでSpringに依存する必要がないため、このソリューションは非常にエレガントだと思います。ゲートウェイのみがこの依存関係を持つ必要があります。配線はすべてスプリング構成で行われます。私は春の統合に恋をしていると思います:-D

于 2012-09-30T06:35:52.847 に答える
3

ゲートウェイ側で以下を使用できます。

@Payload("T(java.util.Arrays).asList(#args[0],#args[1])")
search(Query query, FetchSpec fetchSpec);

同じ署名であると仮定した場合、サービス アクティベーターの場合:

@ServiceActivator(inputChannel = "request", outputChannel = "reply")
search(@Payload("#this[0]")  Query query, @Payload("#this[1]") FetchSpec fetchSpec)
于 2013-06-13T09:09:08.853 に答える