как использовать ExecutorService в веб-приложении - PullRequest
0 голосов
/ 07 июня 2018

У меня есть спокойное веб-приложение.Запрос может содержать большой набор данных.поэтому внутри логики остального веб-сервиса я хочу разделить обработку на 2 части.1-я часть получит данные, проверит данные и сохранит данные в базе данных.вторая часть действительно просматривает данные и применяет к ним бизнес-логику.Вторая часть может занять некоторое время, чтобы закончить.

, поэтому я думаю сделать 2-ю часть как Runnable и использовать ExecutorService, например,

`Executors.newCachedThreadPool()`

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

Но я не уверен насчет нескольких вопросов:

  1. это правильный способ использования ExecutorService?Есть ли лучший способ сделать это?

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

  2. как и когда я инициализирую завершение работы ExecutorService?

    Поскольку я 'Делая это как Singleton, я ожидаю, что этот экземпляр ExecutorService будет работать до тех пор, пока приложение не будет развернуто или сервер не завершит работу.Так когда и как может быть запущено shutdownNow ()?также, когда сервер выключен, даже задачи внутри ExecutorService не выполняются, я думаю, что у меня нет никакого контроля над ним.Могу ли я что-нибудь сделать, чтобы хоть что-то записать?

Спасибо, Хелен

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Можно использовать его таким образом.
Вы должны иметь возможность (не уверен в отношении wildfly) контролировать запуск и завершение работы, зарегистрировав прослушиватель контекста в вашем web.xml

<listener>
    <listener-class>com.stackOv.MyContextListener</listener-class>
</listener>

и реализовать егокак это

class MyContextListener implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent event) {
            // start
        }

        @Override
        public void contextDestroyed(ServletContextEvent event) {
            // shutdown
        }
}
0 голосов
/ 07 июня 2018

Синхронизирует ли вызывающая сторона API выходные данные шага 2 (обработка бизнес-логики)?Если нет, я бы предложил не выполнять 2-й шаг как часть REST API.

Вы можете предоставить API-интерфейс для выполнения только шага 1 (проверка и сохранение в БД).На шаге 2 у вас может быть демон, который периодически активируется и проверяет, есть ли какие-либо новые данные для обработки с момента последней обработки.Есть несколько способов реализовать эту запланированную задачу, например, Spring Scheduled Task

Таким образом, вы получаете разделение труда и асинхронную обработку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...