1

クライアント側に送信 JMS ゲートウェイを設定し、サーバー側に受信 JMS ゲートウェイを設定しています。クライアントは、これらのゲートウェイを使用して同期スタイルでサーバー側のサービスを呼び出します。

サーバー側サービスは、見つかったオブジェクトを返す find メソッドです。何も見つからない場合は null を返します。

問題は、 null をクライアントに返すことができないことです。そのため、私の質問は次のとおりです。

  1. クライアントに null を返すベスト プラクティスは何ですか?
  2. サーバー側のメソッドが例外をスローした場合、この例外をクライアントに戻すにはどうすればよいですか?

よろしく、 クリスチャン・フォン・ウェント・ジェンセン

4

1 に答える 1

1

Spring はまだ null ペイロードの概念をサポートしていませんが、例外をスローできます。サービスアクティベーターの「requires-reply」属性を true に設定します。受信ゲートウェイで呼び出しを直接消費している場合は、例外をスローする必要があります。タイムアウトが指定されていない場合、null はサイレントに返され、呼び出しスレッドは無期限に待機するため、null を返すことはできません。

例えば

Service activator を使用する場合、「requires-reply」を true に設定すると、null 応答が生成された場合、Spring 統合は ReplyRequiredException をスローし、クライアント呼び出しコードに送信できます。

クライアント側で例外を送信するには、次の戦略を使用できます。

受信ゲートウェイでエラー チャネルを構成します。

<int-jms:inbound-gateway request-channel="req" reply-channel="reply" error-channel="serverError" /> 

serverError チャネルで、再スローするサービス アクティベーターを追加します。私は通常、ペイロードルーティングのためにクライアント側で使用するために、いくつかの一般的な例外ホルダークラスで例外をラップします。

<int:channel id="serverError" />

<int:service-activator input-channel="serverError"  expression="new package.ExceptionWrapper(payload.cause==null ? payload : payload.cause)" /> 

クライアント側では、ペイロード ルーターを使用し、それが ExceptionWrapper タイプの場合は、サーバー側からスローされた保持している例外をアンラップできる「errorChannel」などのチャネルにルーティングします。デフォルトでは、payload-router 応答をゲートウェイ応答チャネルに送信します。

<int:payload-type-router input-channel="replyRoute" default-output-channel="reply">
  <int:mapping type="package.ExceptionWrapper" channel="errorThrower" />
</int:payload-type-router>

<int:channel id="errorThrower" /> 

<int:service-activator input-channel="errorThrower" ref="exceptionHandler" method="process" />
于 2013-07-12T10:27:19.730 に答える