TCP アダプター

前述の接続ファクトリを使用する TCP 受信および送信 チャネルアダプターが提供されます。これらのアダプターには、connection-factory および channel という 2 つの関連する属性があります。connection-factory 属性は、アダプターの接続を管理するためにどの接続ファクトリを使用するかを示します。channel 属性は、メッセージが送信アダプターに到着するチャネル、およびメッセージが受信アダプターによって配置されるチャネルを指定します。受信アダプターと送信アダプターの両方が接続ファクトリを共有できますが、サーバー接続ファクトリは常に受信アダプターによって「所有」されます。クライアント接続ファクトリは、常に送信アダプターによって「所有」されます。接続ファクトリへの参照を取得できるのは、各型の 1 つのアダプターのみです。次の例は、クライアントとサーバーの TCP 接続ファクトリを定義する方法を示しています。

<bean id="javaSerializer"
      class="org.springframework.core.serializer.DefaultSerializer"/>
<bean id="javaDeserializer"
      class="org.springframework.core.serializer.DefaultDeserializer"/>

<int-ip:tcp-connection-factory id="server"
    type="server"
    port="1234"
    deserializer="javaDeserializer"
    serializer="javaSerializer"
    using-nio="true"
    single-use="true"/>

<int-ip:tcp-connection-factory id="client"
    type="client"
    host="localhost"
    port="#{server.port}"
    single-use="true"
    so-timeout="10000"
    deserializer="javaDeserializer"
    serializer="javaSerializer"/>

<int:channel id="input" />

<int:channel id="replies">
    <int:queue/>
</int:channel>

<int-ip:tcp-outbound-channel-adapter id="outboundClient"
    channel="input"
    connection-factory="client"/>

<int-ip:tcp-inbound-channel-adapter id="inboundClient"
    channel="replies"
    connection-factory="client"/>

<int-ip:tcp-inbound-channel-adapter id="inboundServer"
    channel="loop"
    connection-factory="server"/>

<int-ip:tcp-outbound-channel-adapter id="outboundServer"
    channel="loop"
    connection-factory="server"/>

<int:channel id="loop"/>

上記の構成では、input チャネルに到着したメッセージは、client 接続ファクトリによって作成された接続を介して直列化され、サーバーで受信され、loop チャネルに置かれます。loop は outboundServer の入力チャネルであるため、メッセージは同じ接続でループバックされ、inboundClient によって受信され、replies チャネルに格納されます。Java 直列化がワイヤ上で使用されます。

通常、受信アダプターは、受信接続リクエストをリッスンする type="server" 接続ファクトリを使用します。場合によっては、受信アダプターが外部サーバーに接続し、その接続で受信メッセージを待機するように、逆に接続を確立することができます。

このトポロジーは、受信アダプターで client-mode="true" を設定することでサポートされます。この場合、接続ファクトリの型は client でなければならず、single-use を false に設定する必要があります。

2 つの追加属性がこのメカニズムをサポートします。retry-interval は、接続障害後にフレームワークが再接続を試行する頻度(ミリ秒単位)を指定します。scheduler は TaskScheduler を提供して、接続試行をスケジュールし、接続がまだアクティブであることをテストします。

スケジューラを指定しない場合は、フレームワークのデフォルトの taskScheduler Bean が使用されます。

送信アダプターの場合、通常、最初のメッセージが送信されたときに接続が確立されます。送信アダプターの client-mode="true" により、アダプターの起動時に接続が確立されます。デフォルトでは、アダプターは自動的に開始されます。繰り返しますが、接続ファクトリは client 型であり、single-use="false" を持っている必要があります。retry-interval および scheduler もサポートされています。接続が失敗した場合、スケジューラによって、または次のメッセージが送信されたときに、接続が再確立されます。

受信と送信の両方で、アダプターが開始されている場合、<control-bus /> コマンド @adapter_id.retryConnection() を送信することにより、アダプターに強制的に接続を確立させることができます。その後、@adapter_id.isClientModeConnected() を使用して現在の状態を調べることができます。