Тайм-аут ожидания исключения ответа в TcpOutboundGateway в Spring TCP Integration - PullRequest
0 голосов
/ 12 ноября 2019

В настоящее время я работаю над интеграцией с внешним поставщиком через Spring Integration TCP, где я отправляю на разные порты 2 IP (IP 1, порт 1, 2, 3 и IP 2 порт 1, 2 и 3), создавая разные @ServiceActivator для уникальной комбинации IP / порт.

Все нормально работает при обычной загрузке сообщений, однако, когда я увеличиваю нагрузку до 40-50 транзакций в секунду, я вижу, что сообщения получают тайм-аутожидание ответа.

Ниже приведен один из сервисных активаторов, а другие настроены аналогичным образом. Я использую FailoverClientConnectionFactory для восстановления после отказа, если мой основной ip не доступен. Я также использую CachingClientConnectionFactory, чтобы при каждом запросе мне не нужно было создавать дорогостоящее соединение.

@Bean
@ServiceActivator(inputChannel = "toRequest")
public MessageHandler serviceActivatorOne() {
    TcpOutboundGateway tcpOutputGateway = new TcpOutboundGateway();
    List<ServerNode> nodes = properties.getFailOver().getServers().subList(0,2);
    tcpOutputGateway.setConnectionFactory(createFailOverConnectionFactory(nodes));
    tcpOutputGateway.setReplyChannelName("bytesToObjectChannel");
    tcpOutputGateway.setRemoteTimeout(5000);
    return tcpOutputGateway;
}

...
...

private AbstractClientConnectionFactory createFailOverConnectionFactory(List<ServerNode> serverNodeList) {
        FailoverClientConnectionFactory connectionFactory =
                new FailoverClientConnectionFactory(createConnectionFactories(serverNodeList));
        connectionFactory.setSingleUse(true);
        connectionFactory.afterPropertiesSet();
        return connectionFactory;
    }

private AbstractClientConnectionFactory createDefaultConnectionFactory(String url, int port, String name) {
        TcpNetClientConnectionFactory connFactory = new TcpNetClientConnectionFactory(url, port);
        connFactory.setSerializer(byteArrayLengthHeaderSerializer());
        connFactory.setDeserializer(byteArrayLengthHeaderSerializer());
        connFactory.setSoTimeout(properties.getSocketTimeOut());
        connFactory.setSoKeepAlive(true);
        connFactory.setLookupHost(false);
        connFactory.setComponentName(name);
        connFactory.setSingleUse(true);

        if(properties.getPoolMaxSize() <= 0) {
            return connFactory;
        } else {
            CachingClientConnectionFactory cachingConnFactory =
                    new CachingClientConnectionFactory(connFactory, properties.getPoolMaxSize());
            cachingConnFactory.setConnectionWaitTimeout(properties.getPoolMaxWait());
            return cachingConnFactory;
        }
    }

Сведения об исключении:

[DEBUG]-[http-nio-9090-exec-103]-[11-Nov-2019;22:01:14.403]-[TcpOutboundGateway:handleRequestMessage:162]-Remote Timeout on 1980e8d4-3167-4610-b8ac-8fb0d20eb92a:1
[DEBUG]-[http-nio-9090-exec-103]-[11-Nov-2019;22:01:14.403]-[SimplePool:releaseItem:226]-Releasing TcpNetConnection:216.76.27.251:20303:54340:d9c78e03-ecbb-45af-b502-6aff9a9b0036 back to the pool
[ERROR]-[http-nio-9090-exec-103]-[11-Nov-2019;22:01:14.404]-[TcpOutboundGateway:handleRequestMessage:174]-Tcp Gateway exception
org.springframework.integration.MessageTimeoutException: Timed out waiting for response
    at org.springframework.integration.ip.tcp.TcpOutboundGateway.handleRequestMessage(TcpOutboundGateway.java:166)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:162)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:144)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:105)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:453)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:401)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:4

Я пытался найтинекоторые детали из ссылки Spring на TCP, но пока не удалось. Я не использую общий сокет, так как setSingleUse установлен как false. Любая помощь / подсказка приветствуется.

1 Ответ

1 голос
/ 12 ноября 2019

Похоже, что сервер, к которому вы подключаетесь, не может ответить вовремя в течение этого 5-секундного тайм-аута при большой нагрузке.

Кажется, что по умолчанию remoteTimeout равен 10 с, и я устанавливаю на 5 с, что, кажется, сервер можетответ с 5с. Я могу настроить remoteTimeout и проверить. Есть ли у вас какие-либо предложения, где я могу изменить какие-либо параметры интеграции Spring-TCP или это зависит только от медленной реакции сервера?

Правильно, это зависит от сервера. Я представляю ситуацию, когда с какой-то огромной нагрузкой даже этих 10 секунд будет недостаточно. Вам следует проконсультироваться с поставщиком вашего сервера, чтобы определить его пропускную способность.

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