SocketException: сброс соединения при каждом запросе + Spring Integration - PullRequest
0 голосов
/ 12 апреля 2020

Я вижу следующую строку журнала приложения.

ОШИБКА [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. Никаких других ошибок или исключений. Запрос и ответ работает отлично.

1 Ответ

1 голос
/ 12 апреля 2020

Я предполагаю, что сервер закрывает сокет после отправки ответа; это считается ошибкой на стороне клиента, если на фабрике клиентских соединений не установлено single-use в true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...