Задержка чтения сообщения сокета в Spring-интеграции? - PullRequest
0 голосов
/ 09 мая 2018

Я использую spring-integration для отправки данных в сокет сервера и чтения из него.

Проблема: чтение из полученного потока данных сокета занимает в основном 1000 мс!Я тестирую на локальном сокет-сервере, который отвечает мгновенно.

Основная причина должна быть где-то в рамках среды Spring, потому что я изменил часть интеграции с Spring на собственную реализацию сокетов, и она работает мгновенно.

@Bean
@Primary
public AbstractClientConnectionFactory clientFactory() throws Exception {
    TcpConnectionFactoryFactoryBean fact = new TcpConnectionFactoryFactoryBean();
    fact.setType("client");
    fact.setHost("127.0.0.1");
    fact.setPort("9876");
    fact.setUsingNio(true); //delay is gone if I change this to false
    fact.setSingleUse(true);
    fact.setSoTimeout(timeout);
    fact.setDeserializer(new MyDeserializer());
    fact.afterPropertiesSet();
    return (AbstractClientConnectionFactory) fact.getObject();
}

/**
  * The same routine applied on a native java socket works instantly!
  * But the time measured if used in spring-integration is always at least 1000ms!
  */
static class MyDeserializer implements Deserializer<String> {
    @Override
    public String deserialize(InputStream inputStream) throws IOException {
        StringBuilder sb = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {

            StopWatch w = new StopWatch();
            w.start();

            String str;
            while ((str = br.readLine()) != null) {
                sb.append(str).append("\n");
            }

            w.stop();
            System.out.println("time taken: " + w.getTotalTimeMillis());

            return sb.toString();
        }
    }
}

В основном время десериализации составляет около 1005-1010 мс.На моем родном сокете та же самая процедура составляет 5-10 мс.Значит, где-то на TcpNioConnection.ChannelInputStream от весны должно быть что-то, что вызывает здесь вторую задержку?

Sidenote: Я только что обнаружил, что задержка исчезла, если я изменил fact.setUsingNio(false).Как это может повлиять на использование nio?

1 Ответ

0 голосов
/ 09 мая 2018

Спасибо за сообщение - это ошибка - я открыл INT-4465 .

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