1

現在、Spring統合フレームワークを使用した簡単なSpring Webアプリケーションを開発中です。私はエンタープライズインテグレーションパターン、目的、利点について読んでいます...私はServiceLayerを取り除き、アプリケーションワークフローを統合フレームワークに委任しました。しかし、私は立ち往生している設計上の問題に遭遇しました。私はデザインの面で軽視しています。ここでは、事前に感謝します。Spring Integration質問:CRUD操作とコンポーネント間のイベントの共有

春の統合フレームワーク1. CRUD操作

1つのエンドポイントがリクエストを受信し、他方はこれらの要求を処理し、あなたが直接チャネルを介して接続された2つのエンドポイントを考えてみましょう。私は、実装の観点からは言いませんが(前に述べたように)、デザインからはっきりさせるために、受信エンドポイントをゲートウェイに接続されたRestControllerとして実装し、他のエンドポイントをDBアダプタに接続されたServiceActivator。 ここでは、ユーザーが要求できる作成、読み込み、更新、削除(基本CRUD)の4つの基本操作があります。受信側のエンドポイントはしか実行できません(handleMessageメソッド)、4つの操作を多重化する正しい方法は何ですか?

  1. メッセージヘッダーに何らかのタグを追加していますか?それは私にとっては醜いようで、受信側エンドポイントはif-elseのブロックを実装する必要があります。コントローラをインターフェイスに接続し、メソッドを呼び出してバネの統合を取り除くほうが簡単です。
  2. 4つのServiceActivatorを同じDBに接続して作成しますか?私はそれも好きではありません。あなたが4ではなく30の操作をしたと想像してください。
  3. 他の解決策はまだ見つかりませんでしたか?たとえば、4つのチャンネルを持つように、それぞれの操作を別のチャンネルで送信します。これはゲートウェイの観点から行うことができますが、問題はServiceActivatorがインバウンド・チャネルを1つしか持てないことです。

春の統合フレームワークとエンドポイント間2.共有イベント

あなたは、ゲートウェイは、いくつかのデータを解析し、次のエンドポイントに送信したスレッドINITS Transformer.The変圧器に接続されているとしましょう終了時。 ゲートウェイクライアントは、チャネルが送信した要求のステータスを知る必要があります(ゲートウェイはTransformerまたはその実装について何も知らないので、何も共有しないため)。トランスは1つのインバウンドチャネルと1つの出力チャネルしか持たず、結果を第3のチャネルを通じて公開する方法がないので、どのように達成できますか?要するに、エンドポイントを結合したり、統合パターンアーキテクチャを破ったりすることなく、どのようにイベントを共有するのかという疑問です。 P.D.:静的な共有オブジェクトなどのクリーンな回答は避けてください。

答えて

2

M-m-m。あなたの心配はどういうわけか分かりません。

前にServiceLayerを使っていたとき、特定の操作のための多くの方法があなたを邪魔しないことは確かです。したがって、メッセージング・アーキテクチャーに切り替えたときの操作を区別するメッセージ・チャネルについて、なぜ心配しているのかは不明です。私はその方法についてGET@CotrollerPOSTDELETEなど@RequestMappingが再びあなたを心配していないことを推測同時に

これは、エンドポイント間のMessageChannelに面した余分なオブジェクトをアプリケーションに追加するのはちょっと不便です。しかし同時に、あなたのアプリケーションが複数のメッセージフローとして考え始めると、それぞれがMessageChannelに分かれ、他のフローに影響を与えないフローを修正することができます。さらに、MessageChannelでは、ビジネスロジックが同じだがメッセージがターゲットサービスやその他の目的でネットワークを介して移動しているときに、分散モードに進むことができることを忘れないでください。

したがって、IMO私はから電話するために@MessagingGatewayを持っており、各ゲートウェイのメソッドは特定のMessageChannelにマップされます。あなたが唯一の目的のサービスを持つことができ

アノテーションモデルのおかげで、しかし特にMessageChannelため@ServiceActivatorで示された各CRUD操作のための方法で:

@MessagingGateway 
public interface CrudGateway { 

    @Gateway(requestChannel = "getChannel") 
    Object get(Object id); 

    @Gateway(requestChannel = "saveChannel") 
    Object save(Object object); 

    @Gateway(requestChannel = "deleteChannel") 
    boolean delete(Object object); 

} 

... 

@Service 
public class CrudService { 

    @ServiceActivator(inputChannel = "getChannel") 
    public Object get(Object id) { 
     // SELECT 
    } 

    @ServiceActivator(inputChannel = "saveChannel") 
    public Object save(Object object) { 
     // INSERT or UPDATE 
    } 

    @ServiceActivator(inputChannel = "deleteChannel") 
    public boolean delete(Object object) { 
     // DELETE 
    } 

} 

いくつかの答えはそこにもあるあなたの2番目の質問については。

PublishSubscribeChannelを出力すると、transformerとなります。

一方、受信メッセージをいくつかの受信者 - チャンネルに配信するには、RecipientListRouterがあります。

+0

非常にありがとう、Artem、非常に便利な答えです。私は最初の部分を理解したが、2番目の部分は得られなかった。 私が理解するところでは、トランスには1つのメソッドしかないので、パブリッシュ/サブスクライブを介してトランスフォーマー内で実行されているスレッドの状態を通知するメッセージを送信することはできません。 要約すると、コントローラー - >ゲートウェイ - >トランスフォーマー - >アウトバウンドアダプターがあります。変圧器の内部に仕事があります。コントローラからタスクのパーセンテージをポーリングしてhtmlビューに表示する必要があります。どのように達成することができますか?私の他の問題は、そのスレッドの範囲です。ありがとう! – Quark

+1

さて、そのスレッドのパーセンテージをいくつかの 'QueueChannel'に公開することができます。コントローラが状態をチェックすると、' QueueChannel'からのメッセージだけがポーリングされます。または、単にAtomicReferenceを使って最新の進捗状況を設定すれば、コントローラはその値を 'AtomicReference.get()'で調べるだけです。 –

+0

ありがとうございましたArtem。私はあなたがクラスに直接チャンネルを注入できるのか分かりませんでした。私はそれが注釈付きの自動化されたものだと思っていて、あなたはチャンネルオブジェクトを制御することができません。また、変圧器が複数の責任(変換)を持つので、変圧器が他の種類のメッセージを公開する場合はアーキテクチャを壊していますか?また、コントローラーセッションごとに変圧器にタスクがある場合、その作業をどのように区別できますか?さらに、どのようにして正しいセッションスレッドにチャネル経由でアップデートできますか?チャンネル/エンドポイント/タスクを作成するときは、メッセージヘッダーか@Sessionを使用する必要がありますか?ありがとうございます – Quark

関連する問題