Я вижу следующую строку журнала приложения.
ОШИБКА [TcpNetConnection. java: 263] Чтение исключения rclegacy-dev.kkl.com:9103:48416:1a40a36a-8cb6-4a2a-9229-ae4fe5273966 SocketException: сброс соединения
Нет проблем с потоками запрос-ответ. Но я вижу вышеупомянутую строку в журналах каждый раз, когда запрос отправлен и получен. Я реализовал интеграцию Spring для связи по протоколу TCP и использование AbstractByteArraySerializer для настраиваемой (де) сериализации. Как я могу избавиться от этой ошибки?
Вот моя конфигурация SI.
<int:gateway id="gw" service-interface=" com.api.MyGateway"
default-request-channel="objectOut" />
<int:channel id="objectOut" />
<int-ip:tcp-connection-factory id="client"
type="client" host="#{configProperties.limitKeyMap['host']}" port="#{configProperties.limitKeyMap['port']}" single-use="false" so-timeout="50000000" using-nio="false" so-keep-alive="true"
serializer="customDSerializer" deserializer="customDSerializer" />
<bean id="customDSerializer" class="CustomSerializerDeserializer">
<property name="maxMessageSize" value="4096" />
</bean>
<int-ip:tcp-outbound-gateway id="outGateway"
request-channel="objectOut" reply-channel="toSA" connection-factory="client"
request-timeout="100000" reply-timeout="50000"/>
<int:service-activator input-channel="toSA"
ref="myService" method="parseResponse"/>
<bean id="myService" class="com.api.services.MyService"/>
<int:channel id="toSA" />
<int:channel id="bytesIn" />
CustomDeserializer
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.integration.ip.tcp.serializer.AbstractByteArraySerializer;
public class CustomSerializerDeserializer extends AbstractByteArraySerializer {
Logger streamLogger = LoggerFactory.getLogger(CustomSerializerDeserializer.class);
public CustomSerializerDeserializer() {
}
@Override
public void serialize(byte[] bytes, OutputStream outputStream) throws IOException {
int length = bytes.length;
outputStream.write(bytes);
}
@Override
public byte[] deserialize(InputStream inputStream) throws IOException {
byte[] messageBuffer = null;
messageBuffer = new byte[2400];
int bytesRead = read(inputStream, messageBuffer, false);
return messageBuffer;
}
protected int read(InputStream inputStream, byte[] buffer, boolean header)
throws IOException {
int lengthRead = 0;
int dataLength = buffer.length;
while (lengthRead < dataLength) {
int len;
len = inputStream.read(buffer, lengthRead,
dataLength - lengthRead);
if (len < 0 && header && lengthRead == 0) {
streamLogger.debug("[read] length<0 ? {}", len);
return len;
}
if (len < 0) {
throw new IOException("Stream closed after " + lengthRead + " of " + dataLength);
}
lengthRead += len;
if (this.logger.isDebugEnabled()) {
}
}
return lengthRead;
}
}
Пример Stacktrace
04/08 22:06:50:794 INFO [MyService.java:492] ThirdPayAmt|0.0|
04/08 22:06:50:797 ERROR [TcpNetConnection.java:263] Read exception revoposlegacy-cert.heb.com:9103:46506:3fdd2dff-5bcd-48bc-b6ca-cb03c1277a65 SocketException:Connection reset
04/08 22:06:50:802 INFO [MyService.java:500] Date |Wed Apr 08 22:06:00 CDT 2020|
Ошибка между печатью ответа TCP. Никаких других ошибок или исключений. Запрос и ответ работает отлично.