Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
© 2019 NTT DATA Corporation
2019年12月18日
NTTデータ 技術革新統括本部 システム技術本部 生産技術部
インテグレーション技術センタ 太田浩介
システム間連携を担うSpring Integrationのエン...
© 2019 NTT DATA Corporation 2
自己紹介
太田浩介
株式会社NTTデータ
技術革新統括本部システム技術本部生産技術部インテグレーション技術センタ(長い)
一年目
Javaをゴリゴリ勉強中
最近ハマっていること
...
© 2019 NTT DATA Corporation 3
 やっていたこと(大学)
Python+flask+Bootstrapでwebアプリ開発
– ロボット操作デスクトップアプリをwebアプリに移行
– レスポンシブデザインの適用
 ...
© 2019 NTT DATA Corporation 4
所属組織の活動
© 2019 NTT DATA Corporation 5
エンタープライズ利用における当社知見をベースに、
Springを最大限活用したフレームワーク
Spring Boot Dependencies
Spring
Security
Spri...
© 2019 NTT DATA Corporation 6
Springイベントのスポンサーおよび講演
Springの当社プレゼンスを向上するため
積極的に講演活動およびイベントスポンサーに取り組む
2015年より毎年、世界最大のSpringプ...
© 2019 NTT DATA Corporation 7
「Spring Integration」をテーマにしたきっかけ
• DXの中で、既存システム活用のためのシステム間連携技術
が脚光を浴びている
• Spring Integration...
© 2019 NTT DATA Corporation 8
今日お話しする内容
• システム連携の背景
• Spring Integrationについて
• 実際に使ってみる
• 実案件での適用
• 概要
• 工夫と苦労
© 2019 NTT DATA Corporation 9
システム連携の背景
• システム連携の背景
• Spring Integrationについて
• 実際に使ってみる
• 実案件での適用
概要
工夫と苦労
© 2019 NTT DATA Corporation 10
昨今のシステム連携事情
全く異なる仕様・ハードウェア・アーキテクチャを持ったシステム間の連携
は昔からの大きな課題
近年はオンプレ×クラウドの連携も増加
クラウド、オンプレ、etc…...
© 2019 NTT DATA Corporation 11
Enterprise Integration Patterns(以下EIP)
• Gregor Hohpe氏によってまとめられた企業システム連携手法の
ベストプラクティス
• (邦訳...
© 2019 NTT DATA Corporation 12
ファイル転送 データベース共有
リモート手続き呼び出し 非同期メッセージング
EIPが挙げる連携パターン
共有データ
アプリケー
ションA
アプリケー
ションB
アプリケー
ションA...
© 2019 NTT DATA Corporation 13
ファイル転送 データベース共有
リモート手続き呼び出し 非同期メッセージング
EIPが挙げる連携パターン
共有データ
アプリケー
ションA
アプリケー
ションB
アプリケー
ションA...
© 2019 NTT DATA Corporation 14
非同期メッセージング
非同期メッセージングとは
• 受け取った情報を「Message」
という単位に抽象化
• Messageは「Message Bus」を通じて、
他のアプリケーシ...
© 2019 NTT DATA Corporation 15
非同期メッセージング
メリット
• アーキテクチャの差異を吸収
• 送信側の待機が無い
• 受信側の状態に影響されない
• 多対多の連携が可能
非同期メッセージングは疎結合なシステム...
© 2019 NTT DATA Corporation 16
じゃあどうやって実装するの?
© 2019 NTT DATA Corporation 17
EIPはあくまでインテグレーションのカタログ
⇒各環境でどのように実装するかは書かれていない
EIPをSpringで実現したのがSpring Integration
© 2019 NTT DATA Corporation 18
Spring Integrationについて
• システム連携の背景
• Spring Integrationについて
• 実際に使ってみる
• 実案件での適用
概要
工夫と苦労
© 2019 NTT DATA Corporation 19
Spring Integrationのゴール
• エンタープライズなシステム連携を実現する実装手段を提供
• Springベースで非同期メッセージングを実現
• Spring Fra...
© 2019 NTT DATA Corporation 20
連携元
Application
End
point
Spring Integrationのメッセージフロー
① 連携元ApplicationがEndpointにデータを送信する
② ...
© 2019 NTT DATA Corporation 21
Message
• システム間で送受信する最小単位
• 実体はジェネリクス型のクラス
• HeaderとPayloadから構成される
• Headerはメッセージの受け渡しに
必要な...
© 2019 NTT DATA Corporation 22
Channel
• 各コンポーネント間を繋ぐパイプの役割
• Messageの流通方式や受信方式を決定する
流通方式の一例
受信方式の一例
• Messageの生成、変換等には関与し...
© 2019 NTT DATA Corporation 23
DirectChannel Messageを単一スレッドで処理する
る 最も基本的なChannel
PublishSubscribeChannel 受信したMessageをすべての後...
© 2019 NTT DATA Corporation 24
Endpoint
Endpointは大きく2種類
①始点・終点で使うEndpoint
アプリケーションと連携しMessageを生成・出力
②メッセージフローの内部で使うEndpoin...
© 2019 NTT DATA Corporation 25
①始点・終点で使うEndpoint(1/2)
• Adapter
アプリケーションから任意のプロトコルで受け取り、メッセージを生成
Channelに対し、Messageの入出力操作を...
© 2019 NTT DATA Corporation 26
①始点・終点で使うEndpoint(2/2)
Adapter, Gatewayごとに違いはあるが、以下のプロトコルやサービスに
対応している
• HTTP
• ローカルファイル
• ...
© 2019 NTT DATA Corporation 27
②メッセージフローの内部で使うEndpoint(1/3)
• Transformer
Messageのヘッダ、ペイロードの値や型・形式を変換する処理を行う。
Javaの Object...
© 2019 NTT DATA Corporation 28
②メッセージフローの内部で使うEndpoint(2/3)
• Router
Channelから受け取ったMessageの内容に応じて、
適切なChannelへ割り振りを行う
• Fi...
© 2019 NTT DATA Corporation 29
②メッセージフローの内部で使うEndpoint(3/3)
• Service Activator
Channelから受け取ったMessageのヘッダやペイロードを引数として、
独自に...
© 2019 NTT DATA Corporation 30
実際に使ってみる
• システム連携の背景
• Spring Integrationについて
• 実際に使ってみる
• 実案件での適用
概要
工夫と苦労
© 2019 NTT DATA Corporation 31
実際に使ってみる
どんなアプリケーション?
toUpperCase
メソッド
ローカルファイル
End
point
Endpoint
(Service
Activator)
Chan...
© 2019 NTT DATA Corporation 32
実際に使ってみる
① pom.xmlに依存ライブラリを記述
② mainメソッドでspring-integration.xml読み込み
③ ChannelとAdapterを
spri...
© 2019 NTT DATA Corporation 33
①pom.xml
pom.xml
spring-integration-coreは必須の依存関係
サポートしたいプロトコルによって、spring-integration-http, ...
© 2019 NTT DATA Corporation 34
public class SpringIntegrationDemoApplication {
public static void main(String[] args) {
Ap...
© 2019 NTT DATA Corporation 35
③ChannelとAdapterの定義
spring-intergration.xml
BeanとしてChannelとAdapterを作成
3秒ごとにtxtファイルをポーリングし、フ...
© 2019 NTT DATA Corporation 36
④ServiceActivatorの定義(1/2)
ChannelとAdapterに続き、ServiceActivatorを定義する
ref、method属性で実行するクラスのメソッ...
© 2019 NTT DATA Corporation 37
④ServiceActivatorの定義(2/2)
受け取ったMessageのpayloadをFileとして受け取り、
大文字に変換した後ServiceActivatorに返すメソッ...
© 2019 NTT DATA Corporation 38
実際に使ってみる
アプリケーションを通して変換処理されたテキストファイルがされる
ローカルファイル
SpringIntegrationDemo
アプリケーション
連携先
ディレクトリ...
© 2019 NTT DATA Corporation 39
実際に使ってみた所感
• 今回使用しなかったが、Spring Initialzrに対応しているので簡単に
雛形を作成可能
• ChannelやEndpointなどの各要素は、xmlで...
© 2019 NTT DATA Corporation 40
実案件での適用
~概要~
• システム連携の背景
• Spring Integrationについて
• HelloWorld
• 実案件での適用
概要
工夫と苦労
© 2019 NTT DATA Corporation 41
決済中継システム
決済中継システムの概要
決済
システムA
金融機関
システム1
アーキテクチャの差異
を吸収
決済
システムB
決済
システムC
金融機関
システム2
金融機関
シ...
© 2019 NTT DATA Corporation 42
連携元
Application
End
point
Spring Integrationのメッセージフロー(再掲)
1. 連携元ApplicationがEndpointにデータを送信...
© 2019 NTT DATA Corporation 43
決済中継システムに適用すると…
決済中継システムにおける最小構成
• Gateway: 外部システムと様々な方法で接続
• Transformer: 業務処理に応じてMessageを...
© 2019 NTT DATA Corporation 44
実案件での適用
~工夫と苦労~
• システム連携の背景
• Spring Integrationについて
• HelloWorld
• 実案件での適用
概要
工夫と苦労
© 2019 NTT DATA Corporation 45
Spring Integrationはシステム連携に有効
エンタープライズな場面で使おうとすると課題があるのも事実
実案件への適用
その一方で…
課題
① 連携するシステム数に応じて...
© 2019 NTT DATA Corporation 46
NTTデータでは、このような課題に対し、様々な工夫を行っている
実案件への適用
課題 解決策
連携するシステム数に応じてコンポーネントが増える ① コンポーネントの再利用
自由度が高...
© 2019 NTT DATA Corporation 47
中継アプリケーション
①コンポーネントの再利用
決済
システムA
金融機関
システム1
業務処理
決済
システムB
金融機関
システム2
業務処理
業務処理
業務処理
必要なコンポー...
© 2019 NTT DATA Corporation 48
①コンポーネントの再利用
再利用性を考慮し、処理をパーツ化した場合
決済
システムA
金融機関
システム1
データ変換
A⇒1
決済
システムB
金融機関
システム2
データの入出力...
© 2019 NTT DATA Corporation 49
②処理の標準化
決済
システムA
金融機関
システム1
データ変換
A⇒1
決済
システムB
金融機関
システム2
各システムと接続する一連の処理を、内部の実装も含めて
「サービスコ...
© 2019 NTT DATA Corporation 50
REST channel
channel
Spring
Integration
SpringMVC
リクエストログ
interceptor
Gateway
gateway
例外分岐
...
© 2019 NTT DATA Corporation 51
REST channel
channel
Spring
Integration
SpringMVC
リクエストログ
interceptor
Gateway
gateway
例外分岐
...
© 2019 NTT DATA Corporation 52
REST channel
channel
リクエストログ
interceptor
Gateway
gateway
例外分岐
router
例外発生時
レスポンス生成
transfor...
© 2019 NTT DATA Corporation 53
③Interceptorによるログ出力
• エラー発生時にどこで発生したか把握することは必須の要件
• 業務処理で毎回実装した場合、エンドポイントが増えてしまい
メッセージフローが複...
© 2019 NTT DATA Corporation 54
③Interceptorによるログ出力
• InterceptorはSpring Integrationの機能(ChannelでもEndpointでもない)
• MessageがCh...
© 2019 NTT DATA Corporation 55
Interceptorのインタフェース
インターフェースを実装すれば、あとはbeanに記述するだけで呼び出し可能
定義一つで、ログの出力を簡単に実現
③Interceptorによるロ...
© 2019 NTT DATA Corporation 56
④ServiceActivatorの拡張
REST channel
channel
リクエストログ
interceptor
Gateway
gateway
例外分岐
router
例...
© 2019 NTT DATA Corporation 57
④ServiceActivatorの拡張
エンタープライズの一般的な要件
• TraceIdのようなメタ情報を予め用意したい
• DBなどを参照して行う複合チェックは、業務処理の中で...
© 2019 NTT DATA Corporation 58
④ServiceActivatorの拡張
ServiceActivatorを拡張したクラスでは、引数として必要な入出力や、
業務に依存する複合チェックの例外処理があらかじめ用意されて...
© 2019 NTT DATA Corporation 59
実案件への適用
課題 解決策
連携するシステム数に応じてコンポーネントが増える
える
① コンポーネントの再利用
自由度が高い反面、実装が無秩序に ② 処理の標準化
ログ出力時にメッ...
© 2019 NTT DATA Corporation 60
まとめ
• Spring Integrationは、連携先システムのアーキテクチャや
プロトコルの差異を非同期メッセージングによって解決
• 弱点もあるが、提供されている機能の活用や...
© 2019 NTT DATA Corporation
「TERASOLUNA」及びそのロゴは、日本及び中国における株式会社NTTデータの商標または登録商標です。
その他、記載されている会社名、商品名、サービス名は各社の登録商標または商標です。
Prochain SlideShare
Chargement dans…5
×

システム間連携を担うSpring Integrationのエンタープライズ開発での活用

1 111 vues

Publié le

異なるアーキテクチャを採用したシステムを連携させる手法として、Enterprise Integration Pattern(EIP)と呼ばれるベストプラクティスが存在します。
Spring IntegrationはそのEIPをSpringで実現するフレームワークです。
本セッションでは、Spring Integrationの基本的な使用方法やメッセージ送受信の仕組みを理解しつつ、
実際にエンタープライズ開発に適用した際の工夫や考慮事項を紹介します。

Publié dans : Logiciels
  • Soyez le premier à commenter

システム間連携を担うSpring Integrationのエンタープライズ開発での活用

  1. 1. © 2019 NTT DATA Corporation 2019年12月18日 NTTデータ 技術革新統括本部 システム技術本部 生産技術部 インテグレーション技術センタ 太田浩介 システム間連携を担うSpring Integrationのエンタープライズ開発での活用
  2. 2. © 2019 NTT DATA Corporation 2 自己紹介 太田浩介 株式会社NTTデータ 技術革新統括本部システム技術本部生産技術部インテグレーション技術センタ(長い) 一年目 Javaをゴリゴリ勉強中 最近ハマっていること 自宅のスマートホーム化
  3. 3. © 2019 NTT DATA Corporation 3  やっていたこと(大学) Python+flask+Bootstrapでwebアプリ開発 – ロボット操作デスクトップアプリをwebアプリに移行 – レスポンシブデザインの適用  今やっていること 公共系システムのTERASOLUNAフレームワーク への移行支援 – Struts ⇒Spring Framework – Pythonとの違いに苦戦 自己紹介
  4. 4. © 2019 NTT DATA Corporation 4 所属組織の活動
  5. 5. © 2019 NTT DATA Corporation 5 エンタープライズ利用における当社知見をベースに、 Springを最大限活用したフレームワーク Spring Boot Dependencies Spring Security Spring MVC JPA MyBatis 1. OSSを組み合わせ、独自部分を極小化 2. OSSの機能を最大限に活かして開発す るためのベストプラクティスを提供するこ とに注力 開発ガイドライン http://terasolunaorg.github.io/ TERASOLUNAフレームワークの開発
  6. 6. © 2019 NTT DATA Corporation 6 Springイベントのスポンサーおよび講演 Springの当社プレゼンスを向上するため 積極的に講演活動およびイベントスポンサーに取り組む 2015年より毎年、世界最大のSpringプロジェクトイベント 「SpringOne Platform」のスポンサーとして協賛 SpringOne Platform 2019 参加レポート 「VMwareとPivotalの今後の関係、開発者が直面するクラウドネイティブの複雑さと、それを扱うための考え方」 https://codezine.jp/article/detail/11805
  7. 7. © 2019 NTT DATA Corporation 7 「Spring Integration」をテーマにしたきっかけ • DXの中で、既存システム活用のためのシステム間連携技術 が脚光を浴びている • Spring Integrationを既に社内で活用していたが、 積極的に外部発信していなかった • 個人的に知見を高めたい
  8. 8. © 2019 NTT DATA Corporation 8 今日お話しする内容 • システム連携の背景 • Spring Integrationについて • 実際に使ってみる • 実案件での適用 • 概要 • 工夫と苦労
  9. 9. © 2019 NTT DATA Corporation 9 システム連携の背景 • システム連携の背景 • Spring Integrationについて • 実際に使ってみる • 実案件での適用 概要 工夫と苦労
  10. 10. © 2019 NTT DATA Corporation 10 昨今のシステム連携事情 全く異なる仕様・ハードウェア・アーキテクチャを持ったシステム間の連携 は昔からの大きな課題 近年はオンプレ×クラウドの連携も増加 クラウド、オンプレ、etc…クラウド、オンプレ、etc… 疎結合な連携が 求められる Primary System Subsystem DB Primary System
  11. 11. © 2019 NTT DATA Corporation 11 Enterprise Integration Patterns(以下EIP) • Gregor Hohpe氏によってまとめられた企業システム連携手法の ベストプラクティス • (邦訳は出版されていない) • 連携パターンは4つ紹介されている 公式サイトでは各パターンの概要が公開されている enterpriseintegrationpatterns.com Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions 著者:Gregor Hohpe,Bobby Woolf 出版元: Addison-Wesley Professional 2003年10月3日初版 ISBN-13: 978-0321200686 ISBN-10: 9780321200686
  12. 12. © 2019 NTT DATA Corporation 12 ファイル転送 データベース共有 リモート手続き呼び出し 非同期メッセージング EIPが挙げる連携パターン 共有データ アプリケー ションA アプリケー ションB アプリケー ションA アプリケー ションB アプリケー ションC import export アプリケー ションA アプリケー ションB ス タ ブ ス ケ ル ト ン Invoke Result アプリケー ションA アプリケー ションB アプリケー ションC Message Bus 共通DB
  13. 13. © 2019 NTT DATA Corporation 13 ファイル転送 データベース共有 リモート手続き呼び出し 非同期メッセージング EIPが挙げる連携パターン 共有データ アプリケー ションA アプリケー ションB アプリケー ションA アプリケー ションB アプリケー ションC import export アプリケー ションA アプリケー ションB ス タ ブ ス ケ ル ト ン Invoke Result アプリケー ションA アプリケー ションB アプリケー ションC Message Bus 共通DB インターフェースに依存した 入出力の実装が必要 アプリケーションがDBの 実装に依存 処理の待機時間あり メソッドの熟知が必要
  14. 14. © 2019 NTT DATA Corporation 14 非同期メッセージング 非同期メッセージングとは • 受け取った情報を「Message」 という単位に抽象化 • Messageは「Message Bus」を通じて、 他のアプリケーションに送信される アプリケー ションA アプリケー ションB アプリケー ションC Message Bus メッセージ メッセージ メッセージ
  15. 15. © 2019 NTT DATA Corporation 15 非同期メッセージング メリット • アーキテクチャの差異を吸収 • 送信側の待機が無い • 受信側の状態に影響されない • 多対多の連携が可能 非同期メッセージングは疎結合なシステム連携を実現する アプリケー ションA アプリケー ションB アプリケー ションC Message Bus メッセージ メッセージ メッセージ
  16. 16. © 2019 NTT DATA Corporation 16 じゃあどうやって実装するの?
  17. 17. © 2019 NTT DATA Corporation 17 EIPはあくまでインテグレーションのカタログ ⇒各環境でどのように実装するかは書かれていない EIPをSpringで実現したのがSpring Integration
  18. 18. © 2019 NTT DATA Corporation 18 Spring Integrationについて • システム連携の背景 • Spring Integrationについて • 実際に使ってみる • 実案件での適用 概要 工夫と苦労
  19. 19. © 2019 NTT DATA Corporation 19 Spring Integrationのゴール • エンタープライズなシステム連携を実現する実装手段を提供 • Springベースで非同期メッセージングを実現 • Spring Frameworkとの高い親和性
  20. 20. © 2019 NTT DATA Corporation 20 連携元 Application End point Spring Integrationのメッセージフロー ① 連携元ApplicationがEndpointにデータを送信する ② Endpointは受け取ったデータをMessageに変換する ③ MessageはChannelを通り、指定された別のEndpointに送られる ④ 様々な処理を行い、送信用のEndpointに送られる ⑤ EndpointがMessageを適切な形式に変換し、連携先Applicationに送信する Endpoint 連携先 Application ChannelChannel Message End point ① ⑤② ③ ④
  21. 21. © 2019 NTT DATA Corporation 21 Message • システム間で送受信する最小単位 • 実体はジェネリクス型のクラス • HeaderとPayloadから構成される • Headerはメッセージの受け渡しに 必要なメタデータ、 Payloadは連携する情報を格納 Message ID , TimeStamp ... • xml • json • java.lang.String • java.io.file etc… Header Payload
  22. 22. © 2019 NTT DATA Corporation 22 Channel • 各コンポーネント間を繋ぐパイプの役割 • Messageの流通方式や受信方式を決定する 流通方式の一例 受信方式の一例 • Messageの生成、変換等には関与しない Channel 受動的に受信 バッファリング不可 能動的に受信 バッファリング可 Point-to-Point Pub/Sub Subscribable Pollable
  23. 23. © 2019 NTT DATA Corporation 23 DirectChannel Messageを単一スレッドで処理する る 最も基本的なChannel PublishSubscribeChannel 受信したMessageをすべての後続の のEndpointに送信する QueueChannel メッセージをFIFO(先入れ先出し)で扱 で扱う。 PriorityChannel 基本的にQueueChannelと同じだが、 が、メッセージの優先順位を制御でき できる Channel Channelの主な実装クラス Point-to-Point Point-to-Point Point-to-Point Pub/Sub Subscribable Subscribable Pollable Pollable
  24. 24. © 2019 NTT DATA Corporation 24 Endpoint Endpointは大きく2種類 ①始点・終点で使うEndpoint アプリケーションと連携しMessageを生成・出力 ②メッセージフローの内部で使うEndpoint Messageの加工・ルーティング等 Endpoint
  25. 25. © 2019 NTT DATA Corporation 25 ①始点・終点で使うEndpoint(1/2) • Adapter アプリケーションから任意のプロトコルで受け取り、メッセージを生成 Channelに対し、Messageの入出力操作を行う⇒一方通行 • Gateway Adapterと異なり、接続先からのレスポンスを待機する⇒双方向 Application Adapter Adapter Application GatewayApplication ApplicationGateway
  26. 26. © 2019 NTT DATA Corporation 26 ①始点・終点で使うEndpoint(2/2) Adapter, Gatewayごとに違いはあるが、以下のプロトコルやサービスに 対応している • HTTP • ローカルファイル • FTP/FTPS • JDBC • JPA • MQTT • RMI • SFTP • STOMP • TCP/UDP etc… https://docs.spring.io/spring-integration/docs/5.2.1.RELEASE/ reference/html/endpoint-summary.html#spring-integration-endpoints
  27. 27. © 2019 NTT DATA Corporation 27 ②メッセージフローの内部で使うEndpoint(1/3) • Transformer Messageのヘッダ、ペイロードの値や型・形式を変換する処理を行う。 Javaの Object・MapやXML・JSON等、良く用いられる形式の 変換処理を提供 Transformer 変換処理 Channel Channel json xml
  28. 28. © 2019 NTT DATA Corporation 28 ②メッセージフローの内部で使うEndpoint(2/3) • Router Channelから受け取ったMessageの内容に応じて、 適切なChannelへ割り振りを行う • Filter Messageを後続のChannelに送信するかどうかの制御を行う • Splitter Messageを分割してChannelに送る
  29. 29. © 2019 NTT DATA Corporation 29 ②メッセージフローの内部で使うEndpoint(3/3) • Service Activator Channelから受け取ったMessageのヘッダやペイロードを引数として、 独自に実装したメソッドを実行する 独自 メソッド Service Activator Channel Channel
  30. 30. © 2019 NTT DATA Corporation 30 実際に使ってみる • システム連携の背景 • Spring Integrationについて • 実際に使ってみる • 実案件での適用 概要 工夫と苦労
  31. 31. © 2019 NTT DATA Corporation 31 実際に使ってみる どんなアプリケーション? toUpperCase メソッド ローカルファイル End point Endpoint (Service Activator) ChannelChannel Message End point 連携先 ディレクトリ ローカルから受け取ったテキストファイルの中身を大文字に変換し、別のディレクトリに配置 aaa.txt bbb.txt ccc.txt aaa.txt bbb.txt ccc.txt aaa.txt 通常の英文が記された txtファイル 全てのアルファベットが大文字に 置き換えられたtxtファイル
  32. 32. © 2019 NTT DATA Corporation 32 実際に使ってみる ① pom.xmlに依存ライブラリを記述 ② mainメソッドでspring-integration.xml読み込み ③ ChannelとAdapterを spring-integration.xmlにBeanとして記述(※) ④ ServiceActivatorは spring-integration.xmlとJavaのクラスとして実装 ※EndpointはJava Configとxmlのどちらでも記述可能 作成ステップ
  33. 33. © 2019 NTT DATA Corporation 33 ①pom.xml pom.xml spring-integration-coreは必須の依存関係 サポートしたいプロトコルによって、spring-integration-http, xml, mail, jdbcなどが必要 <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-core</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-file</artifactId> </dependency>
  34. 34. © 2019 NTT DATA Corporation 34 public class SpringIntegrationDemoApplication { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/spring-integration.xml"); } } ②mainメソッド SpringIntegrationDemoApplication.java mainメソッドでspring-integration.xmlを呼び出し
  35. 35. © 2019 NTT DATA Corporation 35 ③ChannelとAdapterの定義 spring-intergration.xml BeanとしてChannelとAdapterを作成 3秒ごとにtxtファイルをポーリングし、ファイルがあれば1つずつ Messageに格納しChannelに流す <!-- Channel --> <int:channel id="localFileInputChannel" /> <int:channel id="outputFileInputChannel" /> <!-- Adaptor --> <int-file:inbound-channel-adapter id="localFileInbound" directory="file:src/main/resources/input" channel="localFileInputChannel"> <int:poller fixed-delay="3000" /> </int-file:inbound-channel-adapter> <int-file:outbound-channel-adapter id="localFileOutbound" channel="outputFileInputChannel" directory="file:src/main/resources/output" />
  36. 36. © 2019 NTT DATA Corporation 36 ④ServiceActivatorの定義(1/2) ChannelとAdapterに続き、ServiceActivatorを定義する ref、method属性で実行するクラスのメソッドを指定する <!-- ServiceActivator --> <int:service-activator input-channel="localFileInputChannel" output-channel="outputFileInputChannel" ref="toUpperCaseService" method="toUpperCase" /> <bean id="toUpperCaseService" class="com.example.demo.integration.endpoint.service.ToUpperCaseService" /> spring-intergration.xml
  37. 37. © 2019 NTT DATA Corporation 37 ④ServiceActivatorの定義(2/2) 受け取ったMessageのpayloadをFileとして受け取り、 大文字に変換した後ServiceActivatorに返すメソッド ToUpperCaseService.java public class ToUpperCaseService { public String toUpperCase(File file) throws IOException { StringBuilder input = new StringBuilder(); FileReader fileReader = new FileReader(file); //省略:ファイルの内容をinputに読み込む処理 String output = input.toString().toUpperCase(); return output; } }
  38. 38. © 2019 NTT DATA Corporation 38 実際に使ってみる アプリケーションを通して変換処理されたテキストファイルがされる ローカルファイル SpringIntegrationDemo アプリケーション 連携先 ディレクトリ The Merchant of Venice is one of William Shakespeare's best-known plays, written sometime between 1596 and 1598. …… THE MERCHANT OF VENICE IS ONE OF WILLIAM SHAKESPEARE'S BEST-KNOWN PLAYS, WRITTEN SOMETIME BETWEEN 1596 AND 1598. …… aaa.txt bbb.txt ccc.txt aaa.txt bbb.txt ccc.txt
  39. 39. © 2019 NTT DATA Corporation 39 実際に使ってみた所感 • 今回使用しなかったが、Spring Initialzrに対応しているので簡単に 雛形を作成可能 • ChannelやEndpointなどの各要素は、xmlで簡単に記述可能 (もちろん@Beanでもok) • 日本語のドキュメントはまだまだ少ない ⇒公式リファレンス熟読が王道かつ近道
  40. 40. © 2019 NTT DATA Corporation 40 実案件での適用 ~概要~ • システム連携の背景 • Spring Integrationについて • HelloWorld • 実案件での適用 概要 工夫と苦労
  41. 41. © 2019 NTT DATA Corporation 41 決済中継システム 決済中継システムの概要 決済 システムA 金融機関 システム1 アーキテクチャの差異 を吸収 決済 システムB 決済 システムC 金融機関 システム2 金融機関 システム3 ・ ・ ・ ・ ・ ・ 決済システムと金融機関を繋ぐ大規模システム ⇒将来決済中継システムと接続するシステムが増加する可能性が高い システムごとのアーキテクチャに依存しない設計が必要
  42. 42. © 2019 NTT DATA Corporation 42 連携元 Application End point Spring Integrationのメッセージフロー(再掲) 1. 連携元ApplicationがEndpointにデータを送信する 2. Endpopintは受け取ったデータをMessageに変換する 3. MessageはChannelを通り、指定された別のEndpointに送られる 4. 同様にChannelを通り、送信用のEndpointに送られる 5. EndpointがMessageを適切な形式に変換し、連携先Applicationに送信する Endpoint 連携先 Application ChannelChannel End point MessageAdaptor,Gateway Transformer,Router ServiceActivator etc… Adaptor,Gateway
  43. 43. © 2019 NTT DATA Corporation 43 決済中継システムに適用すると… 決済中継システムにおける最小構成 • Gateway: 外部システムと様々な方法で接続 • Transformer: 業務処理に応じてMessageを加工・変換 • ServiceActivator: Spring Integrationに関与しない業務特有の処理 決済 システム 金融機関 システム 業務 処理 TransformerGateway Service Activator Transformer Gateway
  44. 44. © 2019 NTT DATA Corporation 44 実案件での適用 ~工夫と苦労~ • システム連携の背景 • Spring Integrationについて • HelloWorld • 実案件での適用 概要 工夫と苦労
  45. 45. © 2019 NTT DATA Corporation 45 Spring Integrationはシステム連携に有効 エンタープライズな場面で使おうとすると課題があるのも事実 実案件への適用 その一方で… 課題 ① 連携するシステム数に応じてコンポーネントが増える ② 自由度が高い反面、実装が無秩序に ③ ログ出力時にメッセージフローが複雑化 ④ ServiceActivatorに毎回同じ処理を書くのは面倒
  46. 46. © 2019 NTT DATA Corporation 46 NTTデータでは、このような課題に対し、様々な工夫を行っている 実案件への適用 課題 解決策 連携するシステム数に応じてコンポーネントが増える ① コンポーネントの再利用 自由度が高い反面、実装が無秩序に ② 処理の標準化 ログ出力時にメッセージフローが複雑化 ③ Interceptorによるログ出力 ServiceActivatorに毎回同じ処理を書くのは面倒 ④ ServiceActivatorの拡張
  47. 47. © 2019 NTT DATA Corporation 47 中継アプリケーション ①コンポーネントの再利用 決済 システムA 金融機関 システム1 業務処理 決済 システムB 金融機関 システム2 業務処理 業務処理 業務処理 必要なコンポーネントは(連携元)×(連携先) TransformerGateway TransformerGateway TransformerGateway TransformerGateway Transformer Gateway Transformer Gateway Transformer Gateway Transformer Gateway Spring Integrationをそのまま利用した場合 ⇒ 多対多の連携は現実的ではない
  48. 48. © 2019 NTT DATA Corporation 48 ①コンポーネントの再利用 再利用性を考慮し、処理をパーツ化した場合 決済 システムA 金融機関 システム1 データ変換 A⇒1 決済 システムB 金融機関 システム2 データの入出力から業務処理までを1セットとして再利用 必要なコンポーネントは(連携元)+(連携先) データ変換 A⇒2 データ変換 B⇒1 データ変換 B⇒2 TransformerGateway 業務処理 TransformerGateway 業務処理 Transformer Gateway業務処理 Transformer Gateway業務処理 パーツ化
  49. 49. © 2019 NTT DATA Corporation 49 ②処理の標準化 決済 システムA 金融機関 システム1 データ変換 A⇒1 決済 システムB 金融機関 システム2 各システムと接続する一連の処理を、内部の実装も含めて 「サービスコネクタ」として標準化 データ変換 A⇒2 データ変換 B⇒1 データ変換 B⇒2 TransformerGateway 業務処理 Transformer Gateway業務処理 Transformer Gateway業務処理 TransformerGateway 業務処理 サービスコネクタA 自由度が高い反面、 実装が無秩序に…
  50. 50. © 2019 NTT DATA Corporation 50 REST channel channel Spring Integration SpringMVC リクエストログ interceptor Gateway gateway 例外分岐 router 例外発生時 レスポンス生成 transformer REST 送受信 controller レスポンスログ interceptor リクエスト送信 業務処理 ServiceActivator レスポンス受信 業務処理 ServiceActivator リクエスト メッセージ変換 transformer レスポンス メッセージ変換 transformer バリデーション ServiceActivator サービスコネクタAの実装例(RESTの場合) ②処理の標準化
  51. 51. © 2019 NTT DATA Corporation 51 REST channel channel Spring Integration SpringMVC リクエストログ interceptor Gateway gateway 例外分岐 router 例外発生時 レスポンス生成 transformer REST 送受信 controller レスポンスログ interceptor リクエスト送信 業務処理 ServiceActivator レスポンス受信 業務処理 ServiceActivator リクエスト メッセージ変換 transformer レスポンス メッセージ変換 transformer バリデーション ServiceActivator サービスコネクタAの実装例(RESTの場合) ②処理の標準化 RESTの受け取り Message生成 HibernateValidator実装 単項目・相関チェック実行 ログ出力 ServiceActivatorを拡張 送信・受信を分けて実装 catchした例外に応じて分岐 例外ごとのレスポンスを 業務処理へ返却
  52. 52. © 2019 NTT DATA Corporation 52 REST channel channel リクエストログ interceptor Gateway gateway 例外分岐 router 例外発生時 レスポンス生成 transformer REST 送受信 controller レスポンスログ interceptor リクエスト送信 業務処理 ServiceActivator レスポンス受信 業務処理 ServiceActivator リクエスト メッセージ変換 transformer レスポンス メッセージ変換 transformer バリデーション ServiceActivator ③Interceptorによるログ出力
  53. 53. © 2019 NTT DATA Corporation 53 ③Interceptorによるログ出力 • エラー発生時にどこで発生したか把握することは必須の要件 • 業務処理で毎回実装した場合、エンドポイントが増えてしまい メッセージフローが複雑化する そこで、メッセージフローに割り込みが可能な「Interceptor」を ログ出力のために利用している
  54. 54. © 2019 NTT DATA Corporation 54 ③Interceptorによるログ出力 • InterceptorはSpring Integrationの機能(ChannelでもEndpointでもない) • MessageがChannelを通る際に割り込んで処理行う • Endpointではないので、新たなメッセージ経路を用意必要がない • Messageを別のChannelに送信することが可能 ログ 出力 Gateway gateway リクエスト メッセージ変 換 transformer Channel ServiceActivatorで実装 ログ出力機能 interceptor Gateway gateway リクエスト メッセージ変 換 transformer Channel Interceptorを利用 Channel Interceptorとは?使うメリットは? Service Activator
  55. 55. © 2019 NTT DATA Corporation 55 Interceptorのインタフェース インターフェースを実装すれば、あとはbeanに記述するだけで呼び出し可能 定義一つで、ログの出力を簡単に実現 ③Interceptorによるログ出力 spring-Integration.xml public interface ChannelInterceptor { Message<?> preSend(Message<?> message, MessageChannel channel); void postSend(Message<?> message, MessageChannel channel, boolean sent); void afterSendCompletion(Message<?> message, MessageChannel channel, boolean sent, Exception ex); boolean preReceive(MessageChannel channel); Message<?> postReceive(Message<?> message, MessageChannel channel); void afterReceiveCompletion(Message<?> message, MessageChannel channel, Exception ex); } <!-- Interceptor --> <int:channel id="exampleChannel"> <int:interceptors> <ref bean="trafficMonitoringInterceptor" /> </int:interceptors> </int:channel>
  56. 56. © 2019 NTT DATA Corporation 56 ④ServiceActivatorの拡張 REST channel channel リクエストログ interceptor Gateway gateway 例外分岐 router 例外発生時 レスポンス生成 transformer REST 送受信 controller レスポンスログ interceptor リクエスト送信 業務処理 ServiceActivator レスポンス受信 業務処理 ServiceActivator リクエスト メッセージ変換 transformer レスポンス メッセージ変換 transformer バリデーション ServiceActivator
  57. 57. © 2019 NTT DATA Corporation 57 ④ServiceActivatorの拡張 エンタープライズの一般的な要件 • TraceIdのようなメタ情報を予め用意したい • DBなどを参照して行う複合チェックは、業務処理の中で行いたい ServiceActivatorで呼び出すクラスはPOJO 毎回同じ処理を書かなければならない public class SampleService { public String handle(String payload) { // 業務処理 return null; } } ServiceActivatorで呼び出すクラス
  58. 58. © 2019 NTT DATA Corporation 58 ④ServiceActivatorの拡張 ServiceActivatorを拡張したクラスでは、引数として必要な入出力や、 業務に依存する複合チェックの例外処理があらかじめ用意されている ため、業務処理で毎回書く手間が省かれている 拡張クラス Service Activator 業務処理 業務処理 業務処理 Service Activator POJO 例外処理 メタ情報 POJO 例外処理 メタ情報 POJO 例外処理 メタ情報 例外処理 メタ情報 業務処理をPOJOで実装した場合 拡張クラスを用意した場合
  59. 59. © 2019 NTT DATA Corporation 59 実案件への適用 課題 解決策 連携するシステム数に応じてコンポーネントが増える える ① コンポーネントの再利用 自由度が高い反面、実装が無秩序に ② 処理の標準化 ログ出力時にメッセージフローが複雑化 ③ Interceptorによるログ出力 ServiceActivatorに毎回同じ処理を書くのは面倒 ④ ServiceActivatorの拡張
  60. 60. © 2019 NTT DATA Corporation 60 まとめ • Spring Integrationは、連携先システムのアーキテクチャや プロトコルの差異を非同期メッセージングによって解決 • 弱点もあるが、提供されている機能の活用や独自の拡張によって、 エンタープライズ開発でも実用的なシステム連携が可能
  61. 61. © 2019 NTT DATA Corporation 「TERASOLUNA」及びそのロゴは、日本及び中国における株式会社NTTデータの商標または登録商標です。 その他、記載されている会社名、商品名、サービス名は各社の登録商標または商標です。

×