2017-08-24 43 views
0

我通過註釋配置了以下配置的簡單TcpOutboundGateway:Spring集成TCP「空有效載荷從連接」警告

@Bean 
@ServiceActivator(inputChannel="toTcpChannel") 
public TcpOutboundGateway outboundClient() { 
    TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway(); 
    tcpOutboundGateway.setConnectionFactory(clientFactory()); 
    tcpOutboundGateway.setRequiresReply(true); 
    tcpOutboundGateway.setReplyChannel(filterChannelInput()); 
    tcpOutboundGateway.setRequestTimeout(tcpRequestTimeout); 
    tcpOutboundGateway.setRemoteTimeout(tcpReplyTimeout); 
    return tcpOutboundGateway; 
} 

@Bean 
public AbstractClientConnectionFactory clientFactory() { 

    TcpNetClientConnectionFactory factory = new TcpNetClientConnectionFactory(tcpHost, Integer.parseInt(tcpPort));   
    factory.setSoKeepAlive(true); 
    factory.setSoReceiveBufferSize(tcpBufferSizeReal); 
    factory.setSoSendBufferSize(tcpBufferSizeReal); 
    factory.setSerializer(serializer()); 
    factory.setDeserializer(serializer());  
    factory.setSingleUse(false);  
    return factory; 
} 

設置factory.setSingleUse(false);我已經發現我的連接下面的隨機問題:

13:02:10,851 WARN [org.springframework.integration.ip.tcp.connection.TcpMessageMapper] (pool-6-thread-1) Null payload from connection XXXX.XXXX.XXXX.XXXX:9100:52940:22539566-1e50-4f68-a599-0b211ab3c6ef 
13:02:10,851 WARN [org.springframework.integration.ip.tcp.connection.TcpMessageMapper] (pool-6-thread-1) Null payload from connection XXXX.XXXX.XXXX.XXXX:9100:52940:22539566-1e50-4f68-a599-0b211ab3c6ef 
13:02:10,851 WARN [org.springframework.integration.ip.tcp.connection.TcpMessageMapper] (pool-6-thread-1) Null payload from connection XXXX.XXXX.XXXX.XXXX:9100:52940:22539566-1e50-4f68-a599-0b211ab3c6ef 
13:02:10,851 WARN [org.springframework.integration.ip.tcp.connection.TcpMessageMapper] (pool-6-thread-1) Null payload from connection XXXX.XXXX.XXXX.XXXX:9100:52940:22539566-1e50-4f68-a599-0b211ab3c6ef 
..... 
[Stackoverflow exception in JBOSS] 

好的,我改變了factory.setSingleUse(true);關閉每個連接的套接字,顯然設置日誌級別爲ERROR,但我不明白這個問題。是什麼原因? ¿無效的消息結束? ¿串行?

此外,我測試與Wireshark如果套接字接收空消息,但最後收到的消息(正確格式)後沒有消息。

¿有什麼建議嗎?

回答

0

您需要顯示您的serializer() bean。

這意味着您的deserialize()方法返回null它被忽略(和記錄)。

如果解串器檢測消息之間的套接字關閉,則必須拋出SoftEndOfStreamException這是一個信號,即我們正與此套接字接收消息做了框架。

+0

好吧,現在我看到了問題。我必須用字符串「」檢測消息的結尾,但我沒有正確實現序列化程序。我只看到有字節的例子,但是大數據流的ByteArrayOutputStream例子呢? AbstractPooledBufferByteArraySerializer序列化器可能是一個很好的起點? – crm86

+0

即將推出的5.0有一個新的['ByteArrayElasticRawDeserializer'](https://github.com/spring-projects/spring-integration/blob/master/spring-integration-ip/src/main/java/org/springframework/integration /ip/tcp/serializer/ByteArrayElasticRawDeserializer.java#L27)。但它使用套接字EOF來檢測消息的結束。我們可能應該增強其他人使用BAOS。 –