[英]Spring Integration Tcp project
聽起來您實現了聊天(或類似的用戶對用戶)通信。
不,網關在這里幫不了你。
您需要將TcpReceivingChannelAdapter
和TcpSendingMessageHandler
連接到同一個AbstractServerConnectionFactory
。 TcpSendingMessageHandler
注冊為具有該連接的TcpSender
並且所有發送連接都存儲在Map<String, TcpConnection> connections
中。 當我們向此MessageHandler
生成消息時,它會嘗試像這樣查詢該注冊表:
private void handleMessageAsServer(Message<?> message) {
// We don't own the connection, we are asynchronously replying
String connectionId = message.getHeaders().get(IpHeaders.CONNECTION_ID, String.class);
TcpConnection connection = null;
if (connectionId != null) {
connection = this.connections.get(connectionId);
}
if (connection != null) {
因此,在接收端( TcpReceivingChannelAdapter
及其子流程),您需要以某種方式確保您確實設置了正確的IpHeaders.CONNECTION_ID
header 以便最終生成所謂的回復給所需的客戶端。
您可能可以通過@EventListener
對TcpConnectionOpenEvent
做出反應,並使用connectionId
注冊一些業務密鑰以供將來關聯。 當您發送消息時,您提供該目標用戶業務密鑰,在TcpReceivingChannelAdapter
子流程中您獲取該業務密鑰並從您的注冊表中獲取所需的connectionId
。 並將其豐富到IpHeaders.CONNECTION_ID
header 中,用於TcpSendingMessageHandler
中的自動邏輯。
當TcpConnectionCloseEvent
發生時,您必須從自定義注冊表中刪除其各自的條目。
由於 TCP/IP 沒有標頭支持,因此沒有任何開箱即用的機制來實現這種關聯特性。
雖然TcpConnectionOpenEvent
對您來說可能還不夠,因為建立連接時沒有任何業務信息。 也許您需要在TcpReceivingChannelAdapter
流中實現一些握手邏輯,以區分真實消息和連接元數據,以便在自定義注冊表中注冊。
在文檔中查看更多信息: https://docs.spring.io/spring-integration/docs/current/reference/html/ip.html#ip-correlation
對於您的用例來說,查看 WebSocket 支持可能會更好: https://docs.spring.io/html/spring-socketreferences/docs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.