現在、Spring統合フレームワークを使用した簡単なSpring Webアプリケーションを開発中です。私はエンタープライズインテグレーションパターン、目的、利点について読んでいます...私はServiceLayerを取り除き、アプリケーションワークフローを統合フレームワークに委任しました。しかし、私は立ち往生している設計上の問題に遭遇しました。私はデザインの面で軽視しています。ここでは、事前に感謝します。Spring Integration質問:CRUD操作とコンポーネント間のイベントの共有
春の統合フレームワーク1. CRUD操作
1つのエンドポイントがリクエストを受信し、他方はこれらの要求を処理し、あなたが直接チャネルを介して接続された2つのエンドポイントを考えてみましょう。私は、実装の観点からは言いませんが(前に述べたように)、デザインからはっきりさせるために、受信エンドポイントをゲートウェイに接続されたRestControllerとして実装し、他のエンドポイントをDBアダプタに接続されたServiceActivator。 ここでは、ユーザーが要求できる作成、読み込み、更新、削除(基本CRUD)の4つの基本操作があります。受信側のエンドポイントはしか実行できません(handleMessageメソッド)、4つの操作を多重化する正しい方法は何ですか?
- メッセージヘッダーに何らかのタグを追加していますか?それは私にとっては醜いようで、受信側エンドポイントはif-elseのブロックを実装する必要があります。コントローラをインターフェイスに接続し、メソッドを呼び出してバネの統合を取り除くほうが簡単です。
- 4つのServiceActivatorを同じDBに接続して作成しますか?私はそれも好きではありません。あなたが4ではなく30の操作をしたと想像してください。
- 他の解決策はまだ見つかりませんでしたか?たとえば、4つのチャンネルを持つように、それぞれの操作を別のチャンネルで送信します。これはゲートウェイの観点から行うことができますが、問題はServiceActivatorがインバウンド・チャネルを1つしか持てないことです。
春の統合フレームワークとエンドポイント間2.共有イベント
あなたは、ゲートウェイは、いくつかのデータを解析し、次のエンドポイントに送信したスレッドINITS Transformer.The変圧器に接続されているとしましょう終了時。 ゲートウェイクライアントは、チャネルが送信した要求のステータスを知る必要があります(ゲートウェイはTransformerまたはその実装について何も知らないので、何も共有しないため)。トランスは1つのインバウンドチャネルと1つの出力チャネルしか持たず、結果を第3のチャネルを通じて公開する方法がないので、どのように達成できますか?要するに、エンドポイントを結合したり、統合パターンアーキテクチャを破ったりすることなく、どのようにイベントを共有するのかという疑問です。 P.D.:静的な共有オブジェクトなどのクリーンな回答は避けてください。
非常にありがとう、Artem、非常に便利な答えです。私は最初の部分を理解したが、2番目の部分は得られなかった。 私が理解するところでは、トランスには1つのメソッドしかないので、パブリッシュ/サブスクライブを介してトランスフォーマー内で実行されているスレッドの状態を通知するメッセージを送信することはできません。 要約すると、コントローラー - >ゲートウェイ - >トランスフォーマー - >アウトバウンドアダプターがあります。変圧器の内部に仕事があります。コントローラからタスクのパーセンテージをポーリングしてhtmlビューに表示する必要があります。どのように達成することができますか?私の他の問題は、そのスレッドの範囲です。ありがとう! – Quark
さて、そのスレッドのパーセンテージをいくつかの 'QueueChannel'に公開することができます。コントローラが状態をチェックすると、' QueueChannel'からのメッセージだけがポーリングされます。または、単にAtomicReferenceを使って最新の進捗状況を設定すれば、コントローラはその値を 'AtomicReference.get()'で調べるだけです。 –
ありがとうございましたArtem。私はあなたがクラスに直接チャンネルを注入できるのか分かりませんでした。私はそれが注釈付きの自動化されたものだと思っていて、あなたはチャンネルオブジェクトを制御することができません。また、変圧器が複数の責任(変換)を持つので、変圧器が他の種類のメッセージを公開する場合はアーキテクチャを壊していますか?また、コントローラーセッションごとに変圧器にタスクがある場合、その作業をどのように区別できますか?さらに、どのようにして正しいセッションスレッドにチャネル経由でアップデートできますか?チャンネル/エンドポイント/タスクを作成するときは、メッセージヘッダーか@Sessionを使用する必要がありますか?ありがとうございます – Quark