Это то, что моя конфигурация:при использовании протокола 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 (те, по умолчанию, предоставляемые не пригодны для использования здесь в качестве сообщения ограничена «;» и только тогда, когда ответ на первое сообщение посылается последующие сообщения могут быть получены
Спасибо. Я попытаюсь с этим, но не уверен, будет ли dserialize работать, поскольку он не имеет никакого завершающего символа, отвечая на входящий поток сокета. Между тем, я немного взломал ByteArrayRawSerializer, выйдя из цикла while, когда этот завершающий символ найден, и он работал, поскольку ответ отправляется перед replyTimeout. –
TCP - это поток; на данные не наложена структура. Вам понадобится пользовательский (де) сериализатор, если у вас нет согласованного/простого формата для разграничения сообщений из потока с одним из предоставленных классов. –