0

1 つのエンドポイントが別のエンドポイントにメッセージを送信できるメッセージ チャネルがあります。ここで、メッセージがチャネルに到着するたびに、内部ビジネス サービスを呼び出したいと考えています。サービスが、チャネルを通過するメッセージの数をカウントするとします。ただし、サービス メソッドが戻るまでメッセージを通過させたくないのです。

これを実現できるのは、どのような種類のチャネルとエンドポイントの構成ですか?

注意すべき点がいくつかあります。

  • 受信側の定期的なポーラーは、ポーラーがチャネルへのメッセージの到着を認識しておらず、サービス メソッドがいつ戻るかを認識していないため、要件を満たしていません。
  • サービス メソッドは、メッセージの内容には関心がありません。 メッセージが到着
    したらすぐに(引数なしで)呼び出す必要があります。
    どちらも何も返しません。これが、フィルターの使用が理想的なソリューションではない理由です (フィルターは単に受信メッセージを転送し、その間にサービス メソッドを呼び出します)。

編集:サービス メソッドで発生する可能性があることの 1 つは、例外がスローされる可能性があることです。このようなシナリオでは、メッセージを手放すべきではなく、何か他のことを行う必要があります。ただし、例外の理由は、ペイロードで何もしないため、メッセージ ペイロードとは関係ありません。たとえば、メッセージカウンターをインクリメントするだけです。そのため、メッセージ自体を (理想的には) サービス メソッドに送信するべきではなく、適切にトリガーする必要があるだけであり、サービス メソッドが正常に返されたら、チャネルはメッセージを最終エンドポイントにディスパッチできるようにする必要があると述べました。(サービスメソッドが例外をスローする可能性があるのではなく、代わりにブール値を返すことを検討してください。つまり、渡された場合はtrue、そうでない場合はfalseです)

4

2 に答える 2

0

サービス メソッドがペイロードに関心がなく、何も返さない場合は、常に true を返す単純なフィルターにサービス呼び出しをラップしてみませんか?

于 2013-09-24T08:00:21.320 に答える
0

あなたが何を意味するのかは完全には明らかではありません.サービスは結果を返さないと言いますが、メッセージを「通過させたい」と言っています. 線形フローで結果が得られないということは、フローが終了したことを意味します。つまり、通過する結果メッセージはありません。

メッセージで 1 つのサービスを呼び出し、同じメッセージを他のサービスに渡したい場合は、単にチャネルを<publish-subscribe-channel/>. order="1"最初のサービス ( ) - 出力チャネルなし、および 2 番目のサービス ( ) をサブスクライブしorder="2"ます。最初のサービスが戻ると、メッセージは 2 番目のサービスに送信されます (ただし、タスク実行プログラムを追加してはなりません)。

メッセージ自体は不変ですが、ペイロードは不変である可能性があることに注意してください。つまり、最初のサービスによって行われた変更は、2 番目のサービスによって認識されます。

編集:これがデフォルトの動作です。最初のサブスクライバーが例外をスローした場合、メッセージは次のサブスクライバーには送信されません (この動作は、設定によって変更できますignore-failures="true")。デフォルトでは、例外がスローさerror-channelれ、インバウンド エンドポイント (フローが開始される場所) または中間エラー処理ゲートウェイで処理できます。

最初のサービスにメッセージを「見せたくない」場合は、トランスフォーマーをその前に追加します。2 番目のサブスクライバーは元のメッセージを取得します。

于 2013-09-24T12:27:59.847 に答える