2015-03-14 2 views
1

Это то, что моя конфигурация:при использовании протокола TCP въездного-шлюз, сокет таймаут ответа на него посылаются

<int-ip:tcp-connection-factory id="myServer" 
     type="server" port="${port}" deserializer="serializeDeserialize" 
     serializer="serializeDeserialize" single-use="true" 
     using-nio="true" so-linger="500" 
     backlog="100" so-timeout="10000" 
     lookup-host="false" /> 

    <bean id="serializeDeserialize" 
     class="org.springframework.integration.ip.tcp.serializer.ByteArrayRawSerializer" /> 


    <int-ip:tcp-inbound-gateway id="myGateway" 
     connection-factory="myServer" request-channel="inputMessagechannel" 
     error-channel="errorChannel" reply-timeout="10000"/> 

    <int:service-activator input-channel="inputMessagechannel" 
     ref="messageReceiver" method="process" /> 

В то время как служба активатор возвращает ответ в течение второго и до сих пор я вижу, что сокет закрыто. Вот список:

2015-03-14 11:48:15,806 WARN [pool-2-thread-1] (AbstractConnectionFactory.java:555) - Timing out TcpNioConnection 20124 : 101.222.165.210:46930:632ce959-35ca-4f8e-be7f-5be3ecc166b0 
2015-03-14 11:48:17,155 INFO [pool-2-thread-14] (InputMessageReceiver.java:69) - Message from <payload printed here> 
2015-03-14 11:48:17,156 ERROR [pool-2-thread-14] (TcpInboundGateway.java:105) - Connection not found when processing reply [Payload=RESPONSE][Headers={timestamp=1426313897156, id=2ae8bb69-859a-4632-ac13-1a52fa493e56, ip_tcp_remotePort=46930, ip_address=101.222.165.210, ip_hostname=101.222.165.210, ip_connectionId=101.222.165.210:46930:632ce959-35ca-4f8e-be7f-5be3ecc166b0}] for [Payload=[[email protected]][Headers={timestamp=1426313897154, id=a0c2dfc9-d097-448e-bf4d-15465903cf0c, ip_tcp_remotePort=46930, ip_address=101.222.165.210, ip_hostname=101.222.165.210, ip_connectionId=101.222.165.210:46930:632ce959-35ca-4f8e-be7f-5be3ecc166b0}] 

Любая идея, как заставить это работать? Я думаю, что serializeDeserialize имеет какое-то отношение к этому, потому что даже до того, как передача данных отправляется в SA, соединение тайм-аут или может быть передано при пересылке соединения, когда соединение завершено, обозначая его как конец сообщения :(Так что, если это так, то пожалуйста предложить любой подходящий serializeDerialize (те, по умолчанию, предоставляемые не пригодны для использования здесь в качестве сообщения ограничена «;» и только тогда, когда ответ на первое сообщение посылается последующие сообщения могут быть получены

ответ

0

Read the documentation

.. ByteArrayRawSerializer обнаруживает конец потока сверстником, закрывающим сокет, вам нужно использовать ByteArraySingleTerminatorSerializer, сконфигурированный для обнаружения ; в качестве символа завершения.

+0

Спасибо. Я попытаюсь с этим, но не уверен, будет ли dserialize работать, поскольку он не имеет никакого завершающего символа, отвечая на входящий поток сокета. Между тем, я немного взломал ByteArrayRawSerializer, выйдя из цикла while, когда этот завершающий символ найден, и он работал, поскольку ответ отправляется перед replyTimeout. –

+0

TCP - это поток; на данные не наложена структура. Вам понадобится пользовательский (де) сериализатор, если у вас нет согласованного/простого формата для разграничения сообщений из потока с одним из предоставленных классов. –