2

Установка: Apache Tomcat 8 Веб-сервер/Java Spring Framework/MVCJava Spring Framework: Множественные потоки и TaskExecutor

Справочная информация: У меня есть несколько серверов прикрепили балансировки нагрузки. Каждый раз, когда балансировщик нагрузки отправляет запрос на веб-сервер, сервер перенаправляет запрос в удаленную очередь.

Теперь я пытаюсь настроить несколько потоков в своем веб-приложении, чтобы эти потоки могли использоваться для обработки запросов в удаленной очереди (извлекать их из очереди и затем начинать работать с ними).

В прошлом я работал только с экземпляром одного сервера. Сервер будет получать запросы непосредственно из передней части Контроллера, а затем он будет генерировать несколько потоков для параллельной обработки запросов тезисов. Все вызовы (создание пула потоков и другие) запускаются после получения первого запроса (запросы, входящие в -> Создать потоки -> Обработать запросы).

Проблема: теперь, вместо того, чтобы создавать потоки после ввода запроса, я хочу создать потоки после запуска веб-приложения, чтобы он сразу начал вытаскивать запросы из удаленной очереди. Проще говоря, я хотел бы отделить создание потоков от обработки запросов. В идеале, я хотел бы, чтобы эти потоки (фиксированное число из них) работали все время, вытягивая запрос из очереди всякий раз, когда они простаивают. И в контроллере, когда сервер когда-либо получает запрос, я просто отправлю его в очередь.

Это мой первый опыт работы с фреймворком Spring, и поэтому я не уверен, что было бы лучшим подходом для того, чтобы делать то, что мне нужно. Контроллер (метод, который обрабатывает входящий запрос) был единственной точкой входа в программу, о которой я знаю. Поэтому я не знаю, как и где я могу создавать эти потоки при запуске приложения. Я хочу, чтобы потоки были очень надежными, потому что они собираются сделать тяжелую обработку запросов.

Ниже приведены некоторые из идей, которые я придумал: - Я думаю об использовании TaskExecutor для создания потоков, которые мне нужны при загрузке контекста (не уверен, что это хороший и надежный подход). Если я должен использовать TaskExecutor, как мне управлять жизненным циклом этих потоков и других ресурсов? - Во время моих исследований я также пришел на работу WorkManager. Я не уверен, что он делает то, что мне нужно.

Любые предложения и указатели приветствуются!

+0

По сути, я хочу создать эти потоки и использовать их для обработки запросов вне нормального рабочего потока веб-приложений (прием запроса и возвращаемого ответа). – Smirk

ответ

0

Я не думаю, что вам нужно беспокоиться о потоках самостоятельно. Весна имеет поддержку producing and consuming message queues. Просто подключите прослушиватель сообщений, и я думаю, что он должен начать использовать эти сообщения.

+0

Благодарим вас за указание на документацию. Интерфейс прослушивателя сообщений имеет метод on message, который является асинхронным. Означает ли это, что сообщение будет выведено из очереди без явного вызова приема? Потому что я хочу только вытащить сообщение из очереди, когда у меня есть потоки, чтобы справиться с ним. – Smirk

+0

Посмотрите на параметр 'concurrency' в контейнере слушателя @Smirk. Вы не начинаете нить, Spring заботится об этом. –