簡體   English   中英

Spring 集成 Tcp 項目

[英]Spring Integration Tcp project

我有一個項目,它的一部分是使用 Tcp 連接,案例如下,我還將包括一個屏幕截圖。

我們有兩個客戶端,客戶端 1 和客戶端 2,它們是傳送帶,所以如果我們在客戶端 1 輸入上收到數據,我們應該將回復發送到客戶端 2 output 和虎鉗版本,我相信我們可以使用 Spring 集成 Z30B7FDEEBC3698E75 和可能的通道。 在這種情況下,我是否正確接近 Tcp 集成?

然而我沒有代碼實現,但開始在上面放一些東西。

在此處輸入圖像描述

聽起來您實現了聊天(或類似的用戶對用戶)通信。

不,網關在這里幫不了你。

您需要將TcpReceivingChannelAdapterTcpSendingMessageHandler連接到同一個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 以便最終生成所謂的回復給所需的客戶端。

您可能可以通過@EventListenerTcpConnectionOpenEvent做出反應,並使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM