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" />