Я использую 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?