У меня есть простое приложение Spring Boot, состоящее из трех сервисов. Сервисы общаются через HTTP REST вызовы. Ниже приведено краткое описание услуг.
Планировщик миссии
- Организует "планирование" миссии. Вызывает службы Route Generator и Route Assessor для выполнения работы. Действие «запланировать миссию» запускается POST от «клиента». Простое ответное сообщение возвращается вызывающей стороне.
Генератор маршрутов
- Создает «маршрут» при вызове планировщиком миссии. Возвращает ответное сообщение планировщику миссии. Служба имеет искусственно настраиваемую задержку (5 секунд) для имитации длительной задачи.
Route Assessor
- Оценивает сгенерированный «маршрут» когда вызывается планировщиком миссии. Возвращает ответное сообщение планировщику миссии. Служба имеет искусственно настраиваемую задержку (5 секунд) для имитации длительной задачи.
Имея эту информацию в руках, когда запускается задача «планирование миссии», она пройдет не менее 10 секунд, прежде чем весь процесс будет завершен.
Когда эти службы работают нормально, все работает как положено. Тем не менее, я пытался собрать некоторые интеграционные тесты и использовал Postman, чтобы легко стимулировать процесс «планирования миссии». Я получаю неожиданный ответ.
Я запускаю 3 службы, а затем отправляю запрос на запуск от Почтальона. Через несколько секунд я получаю ответ «503 Сервис недоступен». Я также заметил, что в журнале консоли планировщика миссий появляется интересное исключение:
2020-02-12 15:34:54.941 WARN 11752 --- [qtp875761527-48] o.eclipse.jetty.server.HttpChannelState : java.lang.NullPointerException while invoking onTimeout listener org.eclipse.jetty.server.AsyncContextState$WrappedAsyncListener@b362e65
2020-02-12 15:34:54.999 WARN 11752 --- [qtp875761527-48] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]
Как ни странно, запрос POST фактически дошел до планировщика миссии. У меня есть записи в службах, которые показывают, когда поступают запросы и возвращаются ответы. Все они показывают, что я ожидаю от этой операции.
Чтобы добавить к тайне, я изменил искусственные задержки в службах маршрутизации на 0 и снова провел эксперимент. На этот раз Почтальон получает ожидаемый ответ от планировщика миссии. Кроме того, исключение выше - , а не . Все остальные сообщения были получены, как и раньше. Я увеличил задержку до 100 мс, и она все еще работает, как и ожидалось. Я проверил настройки в Postman и время ожидания запроса установлено в 0 (бесконечность).
У кого-нибудь есть идеи, что происходит? Я не понимаю, почему я получаю ответ 503 или исключение. Есть ли ошибка в Jetty? Нужно ли устанавливать / изменять некоторые специфические c параметры конфигурации для Jetty (или что-то еще)?
ОБНОВЛЕНИЕ :
Забыли добавить информацию о версии:
- Java: 1.8.0_201
- Пружинный ботинок: 2.1.6. ВЫПУСК (включая пружину-стартер-пристань)
- Пристань: 9.4.19 .v20190610 (из журнала консоли)
- Почтальон: 7.18.0
ОБНОВЛЕНИЕ :
Провел быстрый эксперимент, в котором все три службы запускается, а затем запускается клиентская служба, которая периодически отправляет POST «планировать миссию» планировщику миссии. Также обратите внимание, что задержки для сервисов маршрутизации были сброшены до 5 секунд каждая. Службы общаются так, как должны, но я заметил кое-что, что ранее пропустил.
Каждый раз, когда клиент отправляет запрос POST «планирование миссии», указанное выше исключение выдается службой планирования миссии, так же, как когда я использовал Почтальон .