TCP 介面卡
提供了使用之前提到的連線工廠的 TCP 入站和出站通道介面卡。這些介面卡有兩個相關屬性:connection-factory
和 channel
。connection-factory
屬性指示用於管理介面卡連線的連線工廠。channel
屬性指定了訊息到達出站介面卡以及入站介面卡放置訊息的通道。雖然入站和出站介面卡可以共享連線工廠,但伺服器連線工廠總是由入站介面卡“擁有”。客戶端連線工廠總是由出站介面卡“擁有”。每種型別的介面卡只能獲取一個連線工廠的引用。以下示例展示瞭如何定義客戶端和伺服器 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"/>
另請參見 基於註解的配置 和 使用 Java DSL 配置 TCP 元件。
在上述配置中,到達 input
通道的訊息透過客戶端連線工廠建立的連線進行序列化,在伺服器端接收並放置在 loop
通道上。由於 loop
是 outboundServer
的輸入通道,訊息透過同一連線被回送,由 inboundClient
接收並存入 replies
通道。線上路上使用的是 Java 序列化。
通常,入站介面卡使用 type="server"
的連線工廠,該工廠監聽傳入的連線請求。在某些情況下,您可能希望反向建立連線,即入站介面卡連線到外部伺服器,然後在該連線上等待入站訊息。
透過在入站介面卡上設定 client-mode="true"
支援這種拓撲結構。在這種情況下,連線工廠必須是 client
型別,並且 single-use
必須設定為 false
。
另外兩個屬性支援此機制。retry-interval
指定(以毫秒為單位)框架在連線失敗後嘗試重新連線的頻率。scheduler
提供一個 TaskScheduler
來排程連線嘗試並測試連線是否仍然活動。
如果您不提供排程器,則使用框架的預設 taskScheduler bean。
對於出站介面卡,連線通常在傳送第一條訊息時建立。在出站介面卡上設定 client-mode="true"
會導致在介面卡啟動時建立連線。預設情況下,介面卡會自動啟動。同樣,連線工廠必須是 client
型別,並且 single-use="false"
。還支援 retry-interval
和 scheduler
。如果連線失敗,它會由排程器或在傳送下一條訊息時重新建立。
對於入站和出站介面卡,如果介面卡已啟動,您可以透過傳送 <control-bus />
命令:@adapter_id.retryConnection()
強制介面卡建立連線。然後您可以使用 @adapter_id.isClientModeConnected()
檢查當前狀態。