Spring統合の紹介

1前書き

この記事では、主に小さな実用的な例を通して、Spring Integrationのコア概念を紹介します。

Spring Integrationは、エンタープライズアーキテクチャ内のシステムとプロセスの相互接続性を大幅に高めることができる強力なコンポーネントを数多く提供しています。

それは開発者が彼ら自身を転がすことを避けるのを手伝う、最高級で最もポピュラーなデザインパターンのいくつかを具体化します。

このライブラリがエンタープライズアプリケーションに必要とする具体的なニーズと、それが一部の代替手段に対して推奨される理由について説明します。また、Spring Integrationベースのアプリケーションの開発をさらに簡素化するためのいくつかの利用可能なツールについても見ていきます。

2セットアップ

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-core</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-file</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>

Spring Integration Core およびhttps://検索の最新バージョンをダウンロードできます。 Maven Centralのmaven.org/classic/#search%7Cga%7C1%7Cspring-integration-file[Spring Integration File Support]。

3メッセージングパターン

このライブラリの基本的なパターンの1つはメッセージングです。パターンは、メッセージ、つまり発信元のシステムまたはプロセスから、事前定義されたチャネルを介して1つまたは複数のシステムまたはプロセスに移動するデータの個別のペイロードを中心としています。

歴史的には、このパターンは、次のようにして複数の異種システムを統合する最も柔軟な方法として生まれました。

  • 統合に関わるシステムをほぼ完全に分離

  • 統合の参加者システムを完全にすることができます

プロトコル、フォーマット、その他の基礎となる互いを認識しない 実装の詳細 ** に含まれるコンポーネントの開発と再利用を奨励する

統合

4実際のメッセージング統合 **

指定したフォルダから別の設定済みフォルダにMPEGビデオファイルをコピーする 基本的な例 を考えてみましょう。

@Configuration
@EnableIntegration
public class BasicIntegrationConfig{
    public String INPUT__DIR = "the__source__dir";
    public String OUTPUT__DIR = "the__dest__dir";
    public String FILE__PATTERN = "** .mpeg";

    @Bean
    public MessageChannel fileChannel() {
        return new DirectChannel();
    }

    @Bean
    @InboundChannelAdapter(value = "fileChannel", poller = @Poller(fixedDelay = "1000"))
    public MessageSource<File> fileReadingMessageSource() {
        FileReadingMessageSource sourceReader= new FileReadingMessageSource();
        sourceReader.setDirectory(new File(INPUT__DIR));
        sourceReader.setFilter(new SimplePatternFileListFilter(FILE__PATTERN));
        return sourceReader;
    }

    @Bean
    @ServiceActivator(inputChannel= "fileChannel")
    public MessageHandler fileWritingMessageHandler() {
        FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(OUTPUT__DIR));
        handler.setFileExistsMode(FileExistsMode.REPLACE);
        handler.setExpectReply(false);
        return handler;
    }
}

上記のコードは、サービスアクティベータ、統合チャネル、およびインバウンドチャネルアダプタを設定します。

これらの各コンポーネントタイプについては、間もなく詳しく説明します。

@ EnableIntegration アノテーションは、このクラスをSpring Integration構成として指定しています。

Spring Integrationアプリケーションのコンテキストを始めましょう。

public static void main(String... args) {
    AbstractApplicationContext context
      = new AnnotationConfigApplicationContext(BasicIntegrationConfig.class);
    context.registerShutdownHook();

    Scanner scanner = new Scanner(System.in);
    System.out.print("Please enter q and press <enter> to exit the program: ");

    while (true) {
       String input = scanner.nextLine();
       if("q".equals(input.trim())) {
          break;
      }
    }
    System.exit(0);
}

上記のmainメソッドは統合コンテキストを起動します。コマンドラインからの“ q ”文字入力も受け付けてプログラムを終了します。コンポーネントをもっと詳しく調べてみましょう。

5 Spring統合コンポーネント

5.1. メッセージ

org.springframework.integration.Message インターフェースは、Spring Message(Spring Integrationコンテキスト内のデータ転送の単位)を定義します。

public interface Message<T> {
    T getPayload();
    MessageHeaders getHeaders();
}

2つの重要な要素へのアクセサを定義します。

  • メッセージヘッダ、基本的には以下の目的で使用できるKey-Valueコンテナ

で定義されているように、メタデータを送信する org.springframework.integration.MessageHeaders クラス ** メッセージペイロード、これは価値がある実際のデータです。

転送済み - 私たちのユースケースでは、ビデオファイルはペイロードです。

5.2. チャネル

Spring Integration(そして実際にはEAI)のチャネルは、統合アーキテクチャにおける基本的な配管です。これは、メッセージがあるシステムから別のシステムに中継されるパイプです。

統合システムまたはプロセスが他のシステムにメッセージをプッシュする(または他のシステムからメッセージを受信する)ためのリテラルパイプと考えることができます。

Spring Integrationのチャンネルには、必要に応じてさまざまな種類があります。カスタムコードを使用せずに、主に設定変更が可能で、すぐに使用できますが、カスタムのニーズがある場合は、堅牢なフレームワークを利用できます。

  • ポイントツーポイント(P2P)** チャネルは、システム間またはコンポーネント間で1対1の通信回線を確立するために使用されます。あるコンポーネントがメッセージをチャネルにパブリッシュするので、別のコンポーネントがそのメッセージを受け取ることができます。チャンネルの両端には1つのコンポーネントしか存在できません。

これまで見てきたように、チャンネルの設定は DirectChannel のインスタンスを返すのと同じくらい簡単です:

@Bean
public MessageChannel fileChannel1() {
    return new DirectChannel();
}

@Bean
public MessageChannel fileChannel2() {
    return new DirectChannel();
}

@Bean
public MessageChannel fileChannel3() {
    return new DirectChannel();
}

ここでは、それぞれがそれぞれのgetterメソッドの名前で識別される3つの別々のチャンネルを定義しました。

  • 発行 - 購読(Pub-Sub)** チャネルは、システム間またはコンポーネント間に1対多の通信回線を確立するために使用されます。これにより、先ほど作成した3つのダイレクトチャンネルすべてに公開できます。

そのため、この例では、P2Pチャンネルをpub-subチャンネルに置き換えることができます。

@Bean
public MessageChannel pubSubFileChannel() {
    return new PublishSubscribeChannel();
}

@Bean
@InboundChannelAdapter(value = "pubSubFileChannel", poller = @Poller(fixedDelay = "1000"))
public MessageSource<File> fileReadingMessageSource() {
    FileReadingMessageSource sourceReader = new FileReadingMessageSource();
    sourceReader.setDirectory(new File(INPUT__DIR));
    sourceReader.setFilter(new SimplePatternFileListFilter(FILE__PATTERN));
    return sourceReader;
}

これで、受信チャネルアダプタをPub-Subチャネルに公開するように変換しました。これにより、ソースフォルダから読み込まれているファイルを複数の宛先に送信できます。

5.3. ブリッジ

何らかの理由で直接接続できない場合は、Spring Integrationのブリッジを使用して2つのメッセージチャネルまたはアダプタを接続します。

この場合、ブリッジを使用してPub-Subチャンネルを3つの異なるP2Pチャンネルに接続できます(P2PチャンネルとPub-Subチャンネルは直接接続できないため)。

@Bean
@BridgeFrom(value = "pubSubFileChannel")
public MessageChannel fileChannel1() {
    return new DirectChannel();
}

@Bean
@BridgeFrom(value = "pubSubFileChannel")
public MessageChannel fileChannel2() {
    return new DirectChannel();
}

@Bean
@BridgeFrom(value = "pubSubFileChannel")
public MessageChannel fileChannel3() {
    return new DirectChannel();
}

上記のBean設定は、 pubSubFileChannel を3つのP2Pチャネルにブリッジします。 @ BridgeFrom アノテーションはブリッジを定義するものであり、Pub-Subチャンネルを購読する必要がある任意の数のチャンネルに適用できます。

上記のコードを「 pubSubFileChannel から fileChannel1、fileChannel2、および fileChannel3 へのブリッジを作成して、 pubSubFileChannel__からのメッセージを3つのチャネルすべてに同時に送信できるように」と読むことができます。

5.4. サービスアクティベータ

Service Activatorは、特定のメソッドに @ ServiceActivator アノテーションを定義する任意のPOJOです。これにより、インバウンドチャネルからメッセージを受信したときにPOJOで任意のメソッドを実行できます。また、メッセージを外部チャネルに書き込むこともできます。

この例では、サービスアクティベータが、設定された 入力チャネル からファイルを受け取り、それを設定されたフォルダに書き込みます。

5.5. アダプタ

アダプタは、システムまたはデータソースへの「プラグイン」を可能にするエンタープライズ統合パターンベースのコンポーネントです。我々はそれが壁のコンセントや電子機器に差し込むことからそれを知っているようにそれはほとんど文字通りアダプタです。

データベース、FTPサーバー、JMS、AMQPなどのメッセージングシステム、Twitterなどのソーシャルネットワークなど、それ以外の「ブラックボックス」システムへの再利用可能な接続を可能にします。これらのシステムに接続する必要性が普遍的であるということは、アダプタが非常にポータブルで再利用可能であることを意味します(実際には、小さなhttp://docs.spring.io/spring-integration/reference/html/endpoint-summary.html[カタログ]があります。アダプタ]、自由に入手可能で誰でも使用する準備ができている)。

  • アダプタは、受信と送信の2つの大きなカテゴリに分類されます。

サンプルシナリオで使用しているアダプタのコンテキストでこれらのカテゴリを調べてみましょう。

これまで見てきたように、 インバウンドアダプタ は外部システム(この場合はファイルシステムディレクトリ)からメッセージを取り込むために使用されます。

私たちのインバウンドアダプタの設定は以下で構成されています。

  • Beanをマークする @ InboundChannelAdapter アノテーション

アダプタとしての設定 - 我々はそれに対してチャネルを設定する アダプタは、そのメッセージ(この場合はMPEGファイル)と poller 、アダプターが構成済みフォルダーをポーリングするのを助けるコンポーネント 指定した間隔で ** を返す標準のSpring Java設定クラス

FileReadingMessageSource、 ファイルシステムのポーリングを処理するSpring Integrationクラスの実装

  • 送信アダプタ** はメッセージを外部に送信するために使用されます。 Spring Integrationは、さまざまな一般的なユースケースに対応する、さまざまな標準のアダプタをサポートしています。

6. 結論

ライブラリのJavaベースの設定と利用可能なコンポーネントの再利用性を実証するSpring Integrationの基本的なユースケースを調べました。

Spring Integrationコードは、JavaSE内のスタンドアロンプ​​ロジェクトとしても、JavaEE環境でより大きなものの一部としてもデプロイ可能です。

ESB(Enterprise Service Bus)のような他のEAI中心の製品やパターンと直接競合することはありませんが、ESBが解決するために構築したのと同じ問題の多くを解決するための実行可能で軽量の代替手段です。

この記事のソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-integration[Githubプロジェクト]にあります。