Spring Integration Tcp соединение одноразового использования VS setSoKeepAlive - PullRequest
0 голосов
/ 09 июля 2020

Я использовал

TcpNetClientConnectionFactory cf = new TcpNetClientConnectionFactory(host, port);

для TcpOutboundGateway, обычно TcpOutboundGateway работает с запросом / ответом, но в моем случае я расширяю TcpOutboundGateway для получения произвольных сообщений с MessageChannel. Вот почему я подумал, что мне следует использовать

cf.setLeaveOpen(true)

, чтобы соединение оставалось открытым.

Хотя я начал использовать эту опцию, спустя долгое время, когда я снова позвонил на tcp-сервер, я получил исключение например,

org.springframework.integration.MessageTimeoutException: Истекло время ожидания ответа

, но я не понял, почему я беру эту ошибку, потому что я установил «истина» на держать соединение открытым в моей фабрике соединений.

THEN

Я сделал несколько запросов в Google, и предполагалось использовать CachingClientConnectionFactory, я понимаю, что по умолчанию это single-use = true и не должно изменяться это false, но тогда я предполагаю, что соединение будет открываться и закрываться в каждой моей транзакции ответа на запрос, так что это препятствие для получения произвольных данных с сервера без какого-либо запроса от клиента?

OR

Как я должен поддерживать открытое соединение между клиентом и сервером? следует ли использовать

cf.setSoKeepAlive (true)?

, чтобы соединение оставалось открытым?

cf.setSoKeepAlive (true) и cf.setLeaveOpen (true)

одинаковы друг с другом?

EDIT

Также, когда я использую cf.setSoKeepAlive (true), через 1 час у меня тоже возникает такое же исключение.

Полный код:

private MessageChannel createNewSubflow(Message<?> message) {
    String host = (String) message.getHeaders().get("host");
    Integer port = (Integer) message.getHeaders().get("port");

    boolean hasThisConnectionIrregularChannel = message.getHeaders().containsKey("irregularMessageChannelName");


    Assert.state(host != null && port != null, "host and/or port header missing");
    String flowRegisterKey;

    if (hasThisConnectionIrregularChannel) {
        flowRegisterKey = host + port + ".extended";
    } else {
        flowRegisterKey = host + port;
    }

    TcpNetClientConnectionFactory cf = new TcpNetClientConnectionFactory(host, port);

    CachingClientConnectionFactory ccf = new CachingClientConnectionFactory(cf, 20);
    ccf.setSoKeepAlive(true);

    ByteArrayCrLfSerializer byteArrayCrLfSerializer = new ByteArrayCrLfSerializer();
    byteArrayCrLfSerializer.setMaxMessageSize(1048576);

    ccf.setSerializer(byteArrayCrLfSerializer);
    ccf.setDeserializer(byteArrayCrLfSerializer);

    TcpOutboundGateway tcpOutboundGateway;
    if (hasThisConnectionIrregularChannel) {
        String unsolicitedMessageChannelName = (String) message.getHeaders().get("irregularMessageChannelName");
        DirectChannel directChannel = getBeanFactory().getBean(unsolicitedMessageChannelName, DirectChannel.class);
        tcpOutboundGateway = new ExtendedTcpOutboundGateway(directChannel);
    } else {
        tcpOutboundGateway = new TcpOutboundGateway();
    }
    tcpOutboundGateway.setRemoteTimeout(20000);

    tcpOutboundGateway.setConnectionFactory(ccf);

    IntegrationFlow flow = f -> f.handle(tcpOutboundGateway);

    IntegrationFlowContext.IntegrationFlowRegistration flowRegistration =
        this.flowContext.registration(flow)
            .addBean(ccf)
            .id(flowRegisterKey + ".flow")
            .register();

    MessageChannel inputChannel = flowRegistration.getInputChannel();

    this.subFlows.put(flowRegisterKey, inputChannel);
    return inputChannel;
}

1 Ответ

0 голосов
/ 09 июля 2020

Почему вы используете CachingClientConnectionFactory? Это не нужно, когда вы оставляете соединение открытым; он предназначен для использования, когда вы хотите поддерживать несколько открытых соединений.

Истекло время ожидания ответа

Означает, что сокет был открыт нормально (с точки зрения клиента ) когда вы отправили запрос; мы просто не получили ответа. Это может означать, что какой-то сетевой компонент (маршрутизатор) незаметно закрыл сокет из-за бездействия. Keep-alives должны помочь в этом, но это зависит от вашей операционной системы и от того, как часто стек TCP настроен для отправки keepalive.

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