Java & Spring - опрос конечной точки http, пока сервер не завершит обработку - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь подобрать правильный способ опроса сервера с постоянным интервалом (например, ~ 1 секунда).

Поток идет следующим образом

  • клиентское приложение получает сообщение, указывающее, что опрос может начаться с предоставленными параметрами (он не опрашивается, когда в этом нет необходимости)
  • клиентское приложение начинает опрос конечной точки http каждую ~ 1 секунду с параметрами, полученными с сообщением (например, параметром запроса)
  • приложение сервера отвечает со статусом в ожидании , что указывает на то, что клиент должен продолжить опрос
  • Серверное приложение отвечает со статусом Закончено и возвращает результат - нет необходимости продолжать опрос.

У нас может быть несколько потоков, поскольку клиентское приложение может получить несколько сообщений за короткое время - опрос должен начаться немедленно

Я не хочу изобретать велосипед, может, есть подходящий инструмент, который работает с Java / Spring, который я могу использовать?

Основные характеристики

  • опрос только при необходимости
  • опрос с пользовательскими параметрами (пользовательские параметры в строке запроса)
  • масштабный опрос, поскольку приложение может опрашивать несколько конечных точек одновременно с одинаковым интервалом

Я проходил различные библиотеки, такие как Apache Camel или Spring Integration PollableChannel, но я чувствую, что ни один из них не даст мне правильного решения из коробки.

Если такой библиотеки нет, я собираюсь написать ее самостоятельно, используя redis и простой цикл, но, возможно, кто-то сталкивался с подобной проблемой.

1 Ответ

0 голосов
/ 04 января 2019

Если я правильно понимаю вашу архитектуру, смысл в том, чтобы вызывать одну и ту же конечную точку HTTP из клиентского приложения до получения ожидаемого результата. В этом случае я бы предложил что-то вроде RequestHandlerRetryAdvice с AlwaysRetryPolicy и FixedBackOffPolicy (1 секунда по умолчанию).

Для имитации исключения я бы предложил ExpressionEvaluatingRequestHandlerAdvice с опцией propagateOnSuccessEvaluationFailures = true, чтобы повторно выдать исключение из onSuccessExpression, когда ответ от сервера pending.

Оба эти совета (в точном RequestHandlerRetryAdvice, ExpressionEvaluatingRequestHandlerAdvice) вам необходимо обратиться к @ServiceActivator для HttpRequestExecutingMessageHandler.

См. Дополнительную информацию в Справочном руководстве: https://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#message-handler-advice-chain

...