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"/>
在先前的組態中,到達 input
通道的訊息會透過 client
連線工廠建立的連線序列化,在伺服器端接收,並放置在 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()
檢查目前狀態。