シナリオになる可能性があります:私の期待はバッチで10データポイントになる可能性があります。{失敗した5、成功した5}かsthの応答を出したいと思います。春の統合errorChannel、エラーハンドル
私のロジックは、バッチをデータ要素に分割して検証することです。
検証が成功すると、aggreagtorに送信されます。
検証に失敗すると、エラーがスローされ、エラーチャネルで取り上げられます。
recipient-list-router errorChannelをinputChannelにして、2つのフィルタを接続します。目的は、直接的に応答を送信するためのフィルタリングです(ユーザー入力とは無関係 - サーバーエラーなど)。クライアント側のエラーはアグリゲータに送られてレスポンスを作成します。
ロジックに問題はありますか? アグリゲーターの後にservice-activatorを使用して結果を構築すると、「応答メッセージは受信されましたが、受信スレッドはすでに応答を受け取りました」という問題があります。このサービスアクチベータはreplyChannelに接続しています。すでにこのチャネルに送信されているメッセージがあるようですか?
私は「誤差フィルタが」replyChannelに接続した後にのみ、このサービスベーターおよびサーバーのエラー枝私の統合作業の流れを確認し(ただし、ハンドルが呼び出されることはありません。)間違った
何か? BTW、受信者リストルータまたは他のタイプのエンドポイントがerrorChannelに接続できますか? ?またはそれは私がすべてオンラインの例で見たものとして、サービス活性化因子である必要があります(しかし、彼らは本当に簡単な例です。)
サンプルXML
<int:gateway id="myGateway" service-interface="someGateway" default-request-channel="splitChannel" error-channel="errorChannel" default-reply-channel="replyChannel" async-executor="MyThreadPoolTaskExecutor"/>
<int:splitter input-channel="splitChannel" output-channel="transformChannel" method="split">
<bean class="Splitter" />
</int:splitter>
<int:transformer id="transformer" input-channel="transformChannel" method="transform" output-channel="aggregateChannel">
<bean class="Transformer"/> // this may throw the validation error (filter_ErrorType_1), if it cannot transform
</int:transformer>
<int:aggregator id="aggregator"
input-channel="aggregateChannel"
output-channel="createAnswerChannel"
method="aggregate">
<bean class="MyAggregator" />
</int:aggregator>
<int:recipient-list-router id="myErrorRouter" input-channel="errorChannel">
<int:recipient channel="filter_ErrorType_1"/>
<int:recipient channel="filter_ErrorType_2"/>
<int:recipient channel="filter_ErrorType_3"/>
</int:recipient-list-router>
<int:filter input-channel="filter_ErrorType_1" output-channel="aggregateChannel" method="accept"></int:filter>
<int:filter input-channel="filter_ErrorType_2" output-channel="createErrorAnswerChannel" method="accept"></int:filter>
<int:filter input-channel="filter_ErrorType_3" output-channel="createErrorAnswerChannel" method="accept"></int:filter>
<int:service-activator input-channel='createErrorAnswerChannel' output-channel="replyChannel" method='buildError'>
<bean class="AnswerBuilder"/>
</int:service-activator>
<int:service-activator input-channel='createAnswerChannel' output-channel="replyChannel" method='build'>
<bean class="AnswerBuilder"/>
</int:service-activator>
はフォローアップ:
<int:gateway id="myGateway" service-interface="someGateway" default-request-channel="splitChannel" error-channel="errorChannel" default-reply-channel="replyChannel" async-executor="MyThreadPoolTaskExecutor"/>
<int:splitter input-channel="splitChannel" output-channel="transformChannel" method="split">
<bean class="Splitter" />
</int:splitter>
<int:transformer id="transformer1" input-channel="toTransformer1" method="transform" output-channel="toTransformer2">
<bean class="Transformer1"/> // this may throw the validation error (filter_ErrorType_1), if it cannot transform
</int:transformer>
<int:transformer id="transformer2" input-channel="toTransformer2" method="transform" output-channel="toTransformer3">
<bean class="Transformer2"/> // this may throw the validation error (filter_ErrorType_2), if it cannot transform
</int:transformer>
<int:transformer id="transformer3" input-channel="toTransformer3" method="transform" output-channel="aggregateChannel">
<bean class="Transformer3"/> // this may throw the validation error (filter_ErrorType_3), if it cannot transform
</int:transformer>
???
// seems like you are proposing to have one gateway for each endpoint that may throw error.
// but in this case, take transfomer 1 for example, I cannot output the gateway directly to aggregate channel since for valid data it has to go to transformer 2
// but the failed message throwed by the error handler cannot pass transformer 2 because of afterall this is a error message not a valid data for transformer 2
// <int:service-activator input-channel="toTransformer1" output-channel="toTransformer2" ref="gateway1"/>
// <int:gateway id="gateway1" default-request-channel="toTransformer1" error-channel="errorChannel1"/>
// <int:transformer id="transformer" input-channel="toTransformer1" method="transform">
// <bean class="Transformer"/> // this may throw the validation error (filter_ErrorType_1), if it cannot transform
// </int:transformer>
// how to deal with this problem?
<int:service-activator input-channel='createErrorAnswerChannel' output-channel="replyChannel" method='buildError'>
<bean class="AnswerBuilder"/>
</int:service-activator>
<int:service-activator input-channel='createAnswerChannel' output-channel="replyChannel" method='build'>
<bean class="AnswerBuilder"/>
</int:service-activator>
を
私は実際に複雑なロジックを持っていますが、ここでは変圧器123を使用しています。
ご迷惑をおかけして申し訳ございませんが、私はをerror-channel = "errorChannel"に設定しています。この問題は後ほどxmlスニペットで更新します。 –
edi
は、返信チャネルとエラーチャネルが同じである可能性があります。エラーが発生した場合、errorChannelに例外が送信され、受信済みとしてマークされますが、その後も処理を続けます(エラーメッセージを他のエンドポイント私はアグリゲータの結果を返信チャンネルに送ると、すでに受け取ったsthについて文句を言うでしょうか?これは、ゲートウェイでreplyChannelとは異なるerrorChannelを作成することを意味しますか?それは可能ですか? – edi
はい、そうです。彼らは本当に同じオブジェクトです。申し訳ありませんが私は明確でない場合。ゲートウェイ上の 'error-channel'は、同じオブジェクトである' replyChannel'または 'errorChannel'ヘッダ内のメッセージを受信した後でのみ動作します。 'replyChannel'と' errorChannel'は1つのメッセージに対してのみ、そして1つの応答に対しては 'TemporaryReplyChannel'であることを理解する必要があります。 –