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

