目次
-
はじめに
1.1 なぜインテグレーションフレームワークが必要なのか
1.2 Spring Integrationの概要
1.3 想定読者と前提知識
-
Spring Integrationとは
2.1 一言でいうと何をするものか
2.2 主な用途・ユースケース
2.3 Spring Frameworkとの関係
-
エンタープライズ・インテグレーション・パターン(EIP)概要
3.1 EIPとは
3.2 Spring IntegrationとEIPの関係
3.3 よく出てくるEIPの種類
-
Spring Integrationの基本コンセプト
4.1 メッセージ(Message)
4.2 メッセージチャネル(Channel)
4.3 エンドポイント(Endpoint)
4.4 アダプタ(Adapter)・ゲートウェイ(Gateway)
-
代表的なコンポーネント
5.1 Service Activator:サービス呼び出し
5.2 Transformer:メッセージ変換
5.3 Filter:メッセージのふるい分け
5.4 Router:メッセージのルーティング
5.5 Splitter / Aggregator:分割と集約
-
外部システムとの連携
6.1 ファイル(File Adapter)
6.2 HTTP / REST(HTTP Adapter)
6.3 メッセージキュー(JMS, AMQP, Kafkaなど)
6.4 メール、TCP/UDP との連携概要
-
開発スタイルと設定方法
7.1 XML設定とJava DSLの違い
7.2 サンプル構成:簡単なフロー定義
7.3 Spring Bootとの連携
-
Spring Integrationを使うメリット
8.1 疎結合なアーキテクチャ
8.2 拡張性・保守性の向上
8.3 Springエコシステムとのシームレスな統合
-
Spring Integrationを使うべきケース / 向かないケース
9.1 向いているケース
9.2 単純なパイプラインではオーバーキルなケース
9.3 他の選択肢が適するケース
-
Spring Batch・Spring Cloud Streamとの違い
10.1 Spring Batchとの役割の違い
10.2 Spring Cloud Streamとの比較
10.3 併用パターンの例
-
よくある設計パターンとアンチパターン
11.1 フローが複雑になりすぎる問題
11.2 ロギング・監視のポイント
11.3 テスト戦略の基本
-
まとめ
12.1 本記事の振り返り
12.2 次に学ぶと良いトピック
12.3 公式ドキュメント・参考資料
1. はじめに
1.1 なぜインテグレーションフレームワークが必要なのか
業務システムは、単体で完結せず、他システムや外部サービスと連携する場面が多くあります。
- ファイルサーバ上のCSVを取り込み、加工してDBに保存
- MQやKafkaからメッセージを受け取って形式変換し、別システムへ送信
- REST APIで受付 → バックグラウンド処理 → メールやSlackで結果通知
こうした連携を個別に作り込むと、以下の問題が発生しがちです。
- 処理フローがスパゲッティになりやすい
- 例外処理・リトライ・ロギング・監視がバラバラ
- 拡張や仕様変更時の影響範囲が読みにくい
この「システム間のつなぎ込み」を共通のパターン(EIP)とフレームワークで整理・標準化するのが、Spring Integrationの役割です。
1.2 Spring Integrationの概要
Spring Integrationは、Spring Framework上で動作する「メッセージング/インテグレーション」用フレームワークです。
特徴としたは以下が挙げられます。
- メッセージを介してコンポーネント同士を疎結合に接続
- エンタープライズ・インテグレーション・パターン(EIP)の実装
- ファイル、HTTP、JMS、AMQP、メール、TCP/UDPなどへの多彩なアダプタ
1.3 想定読者と前提知識
- Spring Framework / Spring Boot をある程度触ったことがある
- REST API やメッセージング(MQなど)の基本用語がなんとなく分かる
- システム連携やバッチ処理の現場感が少しある
2. Spring Integrationとは
2.1 一言でいうと何をするものか
「メッセージを使って、アプリケーション同士・システム同士をつなぐための配線フレームワーク」です。
- 処理の流れを「メッセージの流れ」として定義
- 変換・ルーティング・フィルタリングなどの処理を部品として組み合わせ
- 外部システムとの入出力も、共通のメッセージモデルで扱う
2.2 主な用途・ユースケース
- ファイル連携:フォルダ監視 → 読込 → 変換 → DBやMQへ送信
- 非同期ワークフロー:HTTP受付 → キューへ → バックグラウンド処理
- システム間連携ハブ:複数の外部システムを1つのフローで接続
2.3 Spring Frameworkとの関係
- Spring IoC/DI コンテナ上で動作
- Bean として定義されたコンポーネントをメッセージングインフラに接続
- トランザクション管理やセキュリティなど既存Spring機能と連携可能
3. エンタープライズ・インテグレーション・パターン(EIP)概要
3.1 EIPとは
Enterprise Integration Patterns(EIP)は、
「システム間連携でよく出る問題と、その解決パターン」を整理したカタログです。
例:
- メッセージチャネル (Message Channel)
- ルーター (Router)
- フィルター (Filter)
- トランスフォーマー (Transformer)
- スプリッター / アグリゲーター (Splitter / Aggregator)
3.2 Spring IntegrationとEIPの関係
Spring Integrationは、このEIPをJava/Springで実装したフレームワークです。
EIPのパターン名とほぼ同じ概念・クラスが登場するため、EIPの知識があると理解がスムーズになります。
3.3 よく出てくるEIPの種類
- Message Channel:メッセージの通り道
- Message Endpoint:処理を行う端点
- Router:内容に応じた行き先分岐
- Filter:条件に合わないメッセージを捨てる
- Transformer:メッセージ形式の変換
- Splitter / Aggregator:メッセージの分割と再結合
4. Spring Integrationの基本コンセプト
4.1 メッセージ(Message)
Spring Integrationでは、データは「Message」として扱われます。
- payload:実データ(文字列、オブジェクト、XML、JSONなど)
- header:メタ情報(ID、タイムスタンプ、送信元、ルーティングキーなど)
Message<String> message = MessageBuilder
.withPayload("Hello")
.setHeader("foo", "bar")
.build();
4.2 メッセージチャネル(Channel)
メッセージの通り道です。
Producer(送り手)とConsumer(受け手)がチャネルを介して疎結合に接続されます。
主な種類:
- DirectChannel:同期処理(呼び出しスレッドで処理)
- QueueChannel:キューに貯めて非同期処理
- PublishSubscribeChannel:複数購読者へのブロードキャスト
4.3 エンドポイント(Endpoint)
チャネルからメッセージを受け取り、処理を行う部品です。
- Service Activator:任意のSpring Beanメソッドを呼び出す
- Transformer:形式変換
- Filter:条件判定
- Router:行き先チャネルの選択
4.4 アダプタ(Adapter)・ゲートウェイ(Gateway)
外部システムとの境界を担うコンポーネントです。
- Adapter:ファイル、HTTP、JMS、AMQP、メールなどとの入出力
- Gateway:Javaコードからメッセージ世界への入口(インターフェースで宣言)
5. 代表的なコンポーネント
5.1 Service Activator:サービス呼び出し
メッセージを受け取って、任意のサービスメソッドを呼び出すエンドポイントです。
@Service
public class SampleService {
public String process(String input) {
return "processed: " + input;
}
}
@Bean
public IntegrationFlow sampleFlow(SampleService service) {
return IntegrationFlows.from("inputChannel")
.handle(service, "process") // Service Activator
.channel("outputChannel")
.get();
}
5.2 Transformer:メッセージ変換
メッセージの形式や型を変えるコンポーネントです。
- JSON → Javaオブジェクト
- CSVの1行 → DTO
- 独自フォーマット → 標準フォーマット
@Bean
public IntegrationFlow transformFlow() {
return IntegrationFlows.from("in")
.<String, String>transform(String::toUpperCase)
.channel("out")
.get();
}
5.3 Filter:メッセージのふるい分け
条件に合わないメッセージを破棄(または別チャネルへ)します。
@Bean
public IntegrationFlow filterFlow() {
return IntegrationFlows.from("in")
.filter((Integer i) -> i > 0)
.channel("out")
.get();
}
5.4 Router:メッセージのルーティング
メッセージの内容に応じて行き先チャネルを切り替えます。
@Bean
public IntegrationFlow routeFlow() {
return IntegrationFlows.from("in")
.<String, String>route(
payload -> payload.startsWith("A") ? "aChannel" : "otherChannel"
)
.get();
}
5.5 Splitter / Aggregator:分割と集約
- Splitter:1つのメッセージを複数に分割
- Aggregator:分割されたメッセージを条件に従って再結合
例: 大きなファイルを行単位に分割 → 並列処理 → 集約して結果を返す、など。
6. 外部システムとの連携
6.1 ファイル(File Adapter)
特定フォルダを監視し、新規ファイルをメッセージとして流すことができます。
@Bean
public IntegrationFlow fileFlow() {
return IntegrationFlows
.from(Files.inboundAdapter(new File("input"))
.patternFilter("*.txt"))
.transform(Files.toStringTransformer())
.channel("fileInputChannel")
.get();
}
6.2 HTTP / REST(HTTP Adapter)
HTTPリクエストを受け取り、メッセージとしてフローに渡せます。
@Bean
public IntegrationFlow httpInboundFlow() {
return IntegrationFlows
.from(Http.inboundGateway("/process"))
.channel("httpRequestChannel")
.get();
}
6.3 メッセージキュー(JMS, AMQP, Kafkaなど)
JMSやRabbitMQ、Kafkaなどと連携するアダプタが用意されています。
- JMS Inbound / Outbound Adapter
- AMQP(RabbitMQ)Adapter
- Kafka Adapter(別プロジェクトも含む)
6.4 メール、TCP/UDP との連携概要
- メール:IMAP/POP3で受信、SMTPで送信
- TCP/UDP:ソケット通信を扱うアダプタ
- これらもすべて「メッセージ」として扱うため、共通のフローに組み込める
7. 開発スタイルと設定方法
7.1 XML設定とJava DSLの違い
- 旧来: XML (int:channel, int:service-activator など) で定義
- 現在主流: Java DSL で IntegrationFlow をコードとして定義
Java DSLの利点は以下になります。
- IDE補完・型安全
- Javaコードとしてリファクタリングしやすい
- Spring Bootと相性が良い
7.2 サンプル構成:簡単なフロー定義
@Bean
public IntegrationFlow sampleIntegrationFlow() {
return IntegrationFlows.from("inputChannel")
.transform(String::toUpperCase)
.handle(System.out::println)
.get();
}
流れは以下になります。
- inputChannel に文字列メッセージが送られる
- 大文字変換
- System.out.println で出力
7.3 Spring Bootとの連携
spring-boot-starter-integration を使うことで、
- 自動設定
- application.yml/properties による設定の外出し
- Actuatorとの連携による監視
など、Bootエコシステムの恩恵を受けられます。
8. Spring Integrationを使うメリット
8.1 疎結合なアーキテクチャ
コンポーネント同士がチャネルを介して通信するため、
- 直接メソッド呼び出しに比べて依存がゆるくなる
- 後からルーティングや追加処理を挟みやすい
8.2 拡張性・保守性の向上
- フローを「部品の組み合わせ」として表現
- 新しい連携先や処理ステップの追加がしやすい
- ロギングや監視の仕組みを共通化しやすい
8.3 Springエコシステムとのシームレスな統合
- トランザクション制御
- Spring Security との連携
- Spring Boot による設定・デプロイの簡素化
など、Springの資産をそのまま利用できます。
9. Spring Integrationを使うべきケース / 向かないケース
9.1 向いているケース
- ファイル/MQ/HTTPなど複数プロトコルをまたぐ連携
- 非同期イベント駆動のワークフロー
- 既存モノリスを段階的に疎結合化したい場合
9.2 単純なパイプラインではオーバーキルなケース
- 単純な REST → DB の CRUD API だけのサービス
- 処理フローがほぼ1ステップで完結する場合
このような場合は、通常の Spring MVC / WebFlux + Service 層で十分なことが多いです。
9.3 他の選択肢が適するケース
- 単純なバッチ → Spring Batch単体で事足りることが多い
- 分散メッセージング中心 → Spring Cloud Streamを優先する選択肢
10. Spring Batch・Spring Cloud Streamとの違い
10.1 Spring Batchとの役割の違い
- Spring Batch:ジョブ・ステップ・リスタート・チャンク処理など「バッチ処理」をモデル化
- Spring Integration:システム間連携・メッセージングフローをモデル化
バッチの中で外部連携部分だけ Spring Integration を使う、といった併用も可能です。
10.2 Spring Cloud Streamとの比較
- Spring Cloud Stream:KafkaやRabbitMQなどのメッセージング基盤への接続をシンプルに隠蔽
- Spring Integration:より汎用的(ファイル、メール、TCPなども含む)
Cloud Stream内部でも、Spring Integrationのコンセプトが活用されています。
10.3 併用パターンの例
- 外部I/F(REST受付)は Spring MVC
- メッセージ処理フローは Spring Integration
- バッチジョブ管理は Spring Batch
- メッセージブローカー接続は Spring Cloud Stream
といったレイヤ分けがよくある構成です。
11. よくある設計パターンとアンチパターン
11.1 フローが複雑になりすぎる問題
- 1つの Flow にすべて詰め込むと可読性が低下
- サブフローに分割し、役割ごとに分ける
- 図(シーケンス図やフローチャート)で併せてドキュメント化する
11.2 ロギング・監視のポイント
- フローの入口/出口でメッセージログを出す
- エラーチャネル(errorChannel)を活用して共通エラーハンドリング
- Spring Boot Actuator と組み合わせてメトリクス監視を行う
11.3 テスト戦略の基本
- 個々のエンドポイント(Service Activator など)は通常の Spring テストとして検証
- IntegrationFlow 全体は、テスト用チャネルからメッセージを投入して検証
- モックアダプタで外部システム依存を切り離してテスト
12. まとめ
12.1 本記事の振り返り
- Spring Integrationは、EIPに基づく「メッセージング/システム連携」用フレームワーク
- メッセージ、チャネル、エンドポイント、アダプタという基本コンセプトでフローを構成
- ファイル、HTTP、MQなど多様な外部システム連携を一貫したモデルで扱える
12.2 次に学ぶと良いトピック
- 公式リファレンスの「Java DSL」章
- 実ユースケースに近いサンプル(フォルダ監視 → ファイル読込 → DB保存など)
- EIPの原著またはサマリー記事
12.3 公式ドキュメント・参考資料
- Spring Integration Reference Documentation
https://docs.spring.io/spring-integration/reference/ - Spring Integration Java DSL
https://docs.spring.io/spring-integration/reference/dsl/index.html