Настройка - 2 службы Rest, весенняя загрузка 2.x, встроенный tomcat 8.x
Служба A вызывает Службу B с использованием restTemplate, в цикле тестирования, выполняемом 300 раз, на каждом 100-м интервале в пределахцикл генерирует исключение «Исключение неправильного заголовка куска».
Включена отладка (<logger name="org.apache.http" level="DEBUG"/>
), следующий анализ:
Первые 99 итераций - заголовки запроса / ответа имеют соединение: keep-aliveи тело / поток заканчивается возвратом каретки \ r \ n
Заголовки запроса
"GET /rest/customers/1000000030 HTTP/1.1[\r][\n]"
"Accept-Language: en-us[\r][\n]"
"Accept: application/json[\r][\n]"
"Content-Type: application/json[\r][\n]"
"Host: localhost:9192[\r][\n]"
"Connection: Keep-Alive[\r][\n]"
"User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_25)[\r][\n]"
"Accept-Encoding: gzip,deflate[\r][\n]"
"[\r][\n]"
Заголовки ответа
"HTTP/1.1 200 [\r][\n]"
"X-Content-Type-Options: nosniff[\r][\n]"
"X-XSS-Protection: 1; mode=block[\r][\n]"
"Cache-Control: no-cache, no-store, max-age=0, must-revalidate[\r][\n]"
"Pragma: no-cache[\r][\n]"
"Expires: 0[\r][\n]"
"X-Frame-Options: DENY[\r][\n]"
"X-Content-Type-Options: nosniff[\r][\n]"
"X-Content-Type-Options: nosniff[\r][\n]"
"X-Content-Type-Options: nosniff[\r][\n]"
"Cache-Control: no-cache, no-store, max-age=0, must-revalidate[\r][\n]"
"Pragma: no-cache[\r][\n]"
"Expires: 0[\r][\n]"
"Connection: close[\r][\n]"
"Transfer-Encoding: chunked[\r][\n]"
"Date: Wed, 03 Oct 2018 00:31:53 GMT[\r][\n]"
"Content-Type: application/json;charset=UTF-8[\r][\n]"
"[\r][\n]"
"{"customerNumber":"1000000030"}[\r][\n]"
На 100-м вызове -Заголовки запроса имеют Connection: keep-alive, но у заголовка ответа есть Connection: close и body / stream БЕЗ возврата каретки \ r \ n
http-outgoing-0 << "конец потока" <br>Ошибка ввода-вывода при запросе GET для "http://localhost:9192/rest/customers/1000000030": Неверный заголовок блока
Заголовки запроса
"GET /rest/customers/1000000030 HTTP/1.1[\r][\n]"
"Accept-Language: en-us[\r][\n]"
"Accept: application/json[\r][\n]"
"Content-Type: application/json[\r][\n]"
"Host: localhost:9192[\r][\n]"
"Connection: Keep-Alive[\r][\n]"
"User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_25)[\r][\n]"
"Accept-Encoding: gzip,deflate[\r][\n]"
"[\r][\n]"
Заголовки ответа
"HTTP/1.1 200 [\r][\n]"
"X-Content-Type-Options: nosniff[\r][\n]"
"X-XSS-Protection: 1; mode=block[\r][\n]"
"Cache-Control: no-cache, no-store, max-age=0, must-revalidate[\r][\n]"
"Pragma: no-cache[\r][\n]"
"Expires: 0[\r][\n]"
"X-Frame-Options: DENY[\r][\n]"
"X-Content-Type-Options: nosniff[\r][\n]"
"X-Content-Type-Options: nosniff[\r][\n]"
"X-Content-Type-Options: nosniff[\r][\n]"
"Cache-Control: no-cache, no-store, max-age=0, must-revalidate[\r][\n]"
"Pragma: no-cache[\r][\n]"
"Expires: 0[\r][\n]"
"Connection: close[\r][\n]"
"Transfer-Encoding: chunked[\r][\n]"
"Date: Wed, 03 Oct 2018 00:31:53 GMT[\r][\n]"
"Content-Type: application/json;charset=UTF-8[\r][\n]"
"[\r][\n]"
"{"customerNumber":"1000000030"}" <- MISSING \r\n
a. Почемусервер закрывает соединение после 100 звонков?
Похоже, этоИспользовать Tomcat 8 с разъемами NIO по умолчанию:
- Максимальные соединения, которые могут быть обработаны каждым сервером: maxConnections = 10000
- Время ожидания каждого соединения connectionTimeout = 60 секунд
- Максимальное количество потоков определяет в каждом соединении, сколько одновременных запросов может быть обработано. MaxThreads = 200
- Минимальные запасные потоки, которые всегда доступны (не соединения) = minSpareThreads = 10
- Максимальное количество запросов на поддержание активности в пределахconnection maxKeepAliveRequests = 100 (похоже, это закрывает соединение и не отправляет возврат каретки как часть тела ответа, генерирующего исключение ввода-вывода чтения буфера)
b.Почему при закрытии соединения сервер не отправляет завершение или возврат каретки?Это весна или проблема Томата?
c.Как или какие настройки необходимо изменить, чтобы избежать этого?Параметр maxKeepAliveRequests не отображается в свойствах приложения Spring, единственный способ переопределить это реализовать клиентский контейнер, реализующий WebServerFactoryCustomizer, а затем переопределить вручную.
Сообщите, если это ошибка при закрытии соединения на сервере?