Spring IntegrationでTCP通信する処理の流れを整理するために、煩雑ではありますがクライアント側のシーケンス図を描いてみました。
前段階
autoStartUp
が有効、つまりアプリケーション起動時にOutboundGateway
やConnectionFactory
が起動するケースを想定しています。そのため起点がおかしなことになってしまいました。
-
OutboundGateway
はConnectionFactory
を設定するメソッドを呼ぶ。 -
ConnectionFactory
は送受信者としてSender
・Listener
にOutboundGateway
を登録する(OutboundGateway
はTcpSender
・TcpListener
を実装している)。TcpSender
はメッセージを送信するためにコネクションファクトリから接続を確立するためのインターフェイスで、TcpListener
は受信したメッセージを接続から受け取るためのインターフェイスである。 -
ConnectionFactory
のライフサイクルをstart
にする。
TCP接続(ホストへ送信)
- Clientが業務処理を行いオブジェクトを
MessageGateway
に渡す。 -
MessagingTemplate
でオブジェクトをMessage
に変換し、AdvisedRequestHandler
を介してOutboundGateway
に渡す。 -
OutboundGateway
は接続を確立するためにConnectionFactory
を呼ぶ。 -
ConnectionFactory
は新しく接続を確立するためにTcpConnection
のbuildNewConnection()
を呼ぶ。接続を共有する場合(single-use=false
)は既に使える接続がないか先にチェックする。新しく接続を確立した場合はイベントを発行する。 -
OutboundGateway
は変数にTcpConnection
を保持する。 -
AsyncRepry
オブジェクトを生成する。これは受信メッセージが送信メッセージに紐づいたものかクライアント側でチェックしたり、非同期受信するまで送信処理を待機させるためのものである。 -
TcpConnection
のsend
を呼び、メッセージをSerializer
で直列化してホストに送る。
Interceptor
を定義している場合は6と7の間に呼び出されます。
TCP接続(ホストから受信)
-
TcpConnection
は受信したオブジェクトをMessageMapper
にメッセージオブジェクトにマッピングさせる。 -
MessageMapper
はヘッダを編集し、TcpConnection
にメッセージを返す。 -
TcpConnection
はOutboundGateway
にメッセージを渡す。 -
OutboundGateway
は受け取ったメッセージが送信したものに紐づいているかチェックし、AsyncRepry
に渡す。 -
AsyncRepry
はメッセージを受け取り、ラッチをカウントダウンする。 -
AsyncRepry
ラッチがカウントダウンされるか、タイムアウトするまで待機し、メッセージをOutboundGateway
に返す。受信処理の1~5は非同期で実行される。 - 接続を共有しない場合(
single-use=true
)は接続を閉じる。この場合イベントを発行する。 -
OutboundGateway
はMessageGateway
に結果を返す。 -
MessageGateway
はClientに結果を返す。
Interceptor
を定義している場合は3でOutboundGateway
にメッセージを渡す前に呼び出されます。
備考:
図では省略していますが、MessageGateway
とOutboundGateway
の間にはChannel
や各種エンドンポイントがあります。
投稿に至った経緯
案件でSpring Integrationを使ってTCP通信するをすることになり、調べた結果を整理する目的で
投稿しました。日本語のドキュメントが少ないため、悩んでる方の助けになったら幸いです。(ちなみにServer側は今の案件ではSpring Integrationを使う予定はないので、たぶん投稿し)ないです。
図の作成に使ったサービス
↑の図はWebSequenceDiagramsというサービスを利用して作成しました。サンプルを見ながら簡単にスクリプトでシーケンス図を描けます。デザインを変えられたり、画像として出力もできます。メールアドレスを登録すれば、サイト上にデータを保存することも可能です。しかし、出力される画像が低画質なのと右下にロゴが入ってしまう(課金すれば解決できるっぽい)ので、商用には使えなさそうですが、考えを整理するのには使えそうです。