LoginSignup
6
2

More than 5 years have passed since last update.

Spring IntegrationでTCP通信する処理の流れを調べてみた(クライアント編)

Last updated at Posted at 2017-12-05

Spring IntegrationでTCP通信する処理の流れを整理するために、煩雑ではありますがクライアント側のシーケンス図を描いてみました。

Spring IntegrationによるTCP接続のシーケンス

前段階

autoStartUpが有効、つまりアプリケーション起動時にOutboundGatewayConnectionFactoryが起動するケースを想定しています。そのため起点がおかしなことになってしまいました:confounded:

  1. OutboundGatewayConnectionFactoryを設定するメソッドを呼ぶ。
  2. ConnectionFactoryは送受信者としてSenderListenerOutboundGatewayを登録する(OutboundGatewayTcpSenderTcpListenerを実装している)。TcpSenderはメッセージを送信するためにコネクションファクトリから接続を確立するためのインターフェイスで、 TcpListenerは受信したメッセージを接続から受け取るためのインターフェイスである。
  3. ConnectionFactoryのライフサイクルをstartにする。

TCP接続(ホストへ送信)

  1. Clientが業務処理を行いオブジェクトをMessageGatewayに渡す。
  2. MessagingTemplateでオブジェクトをMessageに変換し、AdvisedRequestHandlerを介してOutboundGatewayに渡す。
  3. OutboundGatewayは接続を確立するためにConnectionFactoryを呼ぶ。
  4. ConnectionFactoryは新しく接続を確立するためにTcpConnectionbuildNewConnection()を呼ぶ。接続を共有する場合(single-use=false)は既に使える接続がないか先にチェックする。新しく接続を確立した場合はイベントを発行する。
  5. OutboundGatewayは変数にTcpConnectionを保持する。
  6. AsyncRepryオブジェクトを生成する。これは受信メッセージが送信メッセージに紐づいたものかクライアント側でチェックしたり、非同期受信するまで送信処理を待機させるためのものである。
  7. TcpConnectionsendを呼び、メッセージをSerializerで直列化してホストに送る。

Interceptorを定義している場合は6と7の間に呼び出されます。

TCP接続(ホストから受信)

  1. TcpConnectionは受信したオブジェクトをMessageMapperにメッセージオブジェクトにマッピングさせる。
  2. MessageMapperはヘッダを編集し、TcpConnectionにメッセージを返す。
  3. TcpConnectionOutboundGatewayにメッセージを渡す。
  4. OutboundGatewayは受け取ったメッセージが送信したものに紐づいているかチェックし、AsyncRepryに渡す。
  5. AsyncRepryはメッセージを受け取り、ラッチをカウントダウンする。
  6. AsyncRepryラッチがカウントダウンされるか、タイムアウトするまで待機し、メッセージをOutboundGatewayに返す。受信処理の1~5は非同期で実行される。
  7. 接続を共有しない場合(single-use=true)は接続を閉じる。この場合イベントを発行する。
  8. OutboundGatewayMessageGatewayに結果を返す。
  9. MessageGatewayはClientに結果を返す。

Interceptorを定義している場合は3でOutboundGatewayにメッセージを渡す前に呼び出されます。

備考:
図では省略していますが、MessageGatewayOutboundGatewayの間にはChannelや各種エンドンポイントがあります。

投稿に至った経緯

案件でSpring Integrationを使ってTCP通信するをすることになり、調べた結果を整理する目的で
投稿しました。日本語のドキュメントが少ないため、悩んでる方の助けになったら幸いです:sweat:。(ちなみにServer側は今の案件ではSpring Integrationを使う予定はないので、たぶん投稿し)ないです。

図の作成に使ったサービス

↑の図はWebSequenceDiagramsというサービスを利用して作成しました。サンプルを見ながら簡単にスクリプトでシーケンス図を描けます。デザインを変えられたり、画像として出力もできます。メールアドレスを登録すれば、サイト上にデータを保存することも可能です。しかし、出力される画像が低画質なのと右下にロゴが入ってしまう(課金すれば解決できるっぽい)ので、商用には使えなさそうですが、考えを整理するのには使えそうです。

WebSequenceDiagramsのスクリーンショット

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2