как обрабатывать различное количество заданий по времени на сервере приложений

Я использую стеклянную рыбу с спящим режимом, пружиной и jpa для данных, поступающих в нашу систему и отображающих данные клиенту.

Однако мне также необходимо запускать несколько заданий каждую минуту для расчета данных на основе входящих данных.

Но я никогда не знаю количество заданий, и они могут измениться в любое время, так как они поступают из базы данных. У нас есть x клиентов, и у каждого клиента может быть от 1 до многих рабочих мест.

Итак, что мне действительно нужно сделать, это:

  1. прочитайте из таблицы, чтобы получить количество заданий для запуска
  2. запускать каждое из этих заданий каждую минуту
  3. если задание удалено из таблицы, прекратить обработку этого задания
  4. если задание добавлено в таблицу, добавить новое задание в список.
  5. каждое из этих заданий будет читать из таблицы, выполнять некоторые вычисления, а затем записывать результаты в таблицу.

Я читал о некоторых инструментах (quartz, ScheduledExecutorService и т. д.), но действительно ли они предоставляют эту функциональность? Или я должен написать свой собственный?


person Oggie    schedule 04.07.2013    source источник


Ответы (1)


Я бы начал с весеннего TaskScheduler:

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling-task-scheduler

Но независимо от того, что вы используете, вам придется написать нетривиальный код для поддержки всего этого. Вам нужно будет поддерживать такие вещи, как загрузка всех задач при запуске сервера, обеспечение выполнения задач только на одном сервере (если приложение развернуто на нескольких экземплярах Glassshish), мониторинг таблицы БД для удаленных пользователей/заданий и т. д.

person Keith    schedule 04.07.2013
comment
Хорошая мысль о кластеризации стеклянных рыбок и о том, что задача не выполняется более чем на одном экземпляре. Не знаю, как с этим справиться. Я хотел, чтобы все работало в стеклянной рыбе, чтобы использовать модуль сохранения состояния гибернации. - person Oggie; 04.07.2013
comment
Один из способов, которым я справлялся с подобными ситуациями: каждый сервер приложений загружает полный список. Они перебирают их по одному и пытаются обновить статус. (1) статус набора заданий обновления = РАСПИСАН, где статус = ГОТОВ. (2) совершать. № 1 и № 2 будут работать только для одного сервера приложений, и именно этот сервер будет выполнять эту задачу. Это оптимистичный параллелизм. Вы можете использовать встроенные функции гибернации для достижения той же цели: docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/ - person Keith; 05.07.2013
comment
У меня уже есть поле версии в наших таблицах БД, и спящий режим настроен на его использование. Так что спящий режим должен справиться с этим для меня. - person Oggie; 08.07.2013