Запланированная задача в веб-приложении?

Я создаю приложения статистики для онлайн-игры, построенные с использованием API сервлета в Java (для развертывания на Tomcat). Достаточно легко позволить игре отправлять сообщение на сервер статистики каждый раз, когда пользователь входит в систему, поскольку запросы обработки - это то, что для Servlets/Tomcat.

Мне также нужно периодически инициировать запросы на сервере статистики, хотя, например, чтобы получить количество онлайн-пользователей с игрового сервера или количество поклонников со страницы нашего Facebook.

Легко было бы просто начать поток в главном сервлете приложения, и пусть это время от времени извлекает данные, но это немного странно, потому что все остальные потоки создаются Tomcat.

  • Делает это так, как хорошо?
  • Если нет, то каков рекомендуемый способ сделать это?
  • Правильно ли использовать сервлеты для чего-то вроде этого? Какая альтернатива?

Примечание после первых ответов: я не ищу решение проблемы синхронизации или concurrency, потому что я могу легко справиться с обоими. Мне просто нужно знать, как правильно запустить проактивный процесс в контейнере сервлета.

Ответ 1

Кварц - ваш лучший выбор и наиболее настраиваемый. Он имеет интерфейс на основе CRON или более динамичный способ генерации заданий, которые относятся к определенному событию, если ваш случай использования вызывает его. Quartz может это сделать. Он имеет возможность сохранять задания в базе данных, чтобы они могли пережить перезагрузку.

http://www.quartz-scheduler.org/

Создайте конфигурации в web.xml, чтобы автоматически запустить его:

  <servlet> 
    <servlet-name>QuartzInitializer</servlet-name>
    <display-name>Quartz Initializer Servlet</display-name>
    <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
    <load-on-startup>1</load-on-startup>

    <init-param>
      <param-name>shutdown-on-unload</param-name>
      <param-value>true</param-value>
    </init-param>

    <init-param>
      <param-name>start-scheduler-on-load</param-name>
      <param-value>true</param-value>
    </init-param>

  </servlet> 

Ответ 2

Вы должны подумать:

Не пытайтесь изобретать колесо, кварц и другие продукты уже обрабатывают потоки/таймауты/ concurrency проблемы для вас!