web-dev-qa-db-ja.com

Webアプリケーションでスケジュールされたタスク?

Java(Tomcatにデプロイされる)のサーブレットAPIを使用して構築された、オンラインゲームの統計アプリを構築しています。ゲームに統計サーバーにメッセージを送信させるのは簡単です。リクエストの処理はサーブレット/ Tomcatの目的であるため、ユーザーがログインするたびに。

また、統計サーバーで定期的にリクエストを開始する必要があります。たとえば、ゲームサーバーからオンラインユーザーの数を取得したり、Facebookページからファンの数を取得したりします。

アプリのメインサーブレットでスレッドを開始し、それでデータの取得を時々行うのは簡単ですが、他のすべてのスレッドはTomcatによって作成されているため、少し奇妙に感じます。

  1. そのようにして大丈夫ですか?
  2. そうでない場合、これを行うための推奨される方法は何ですか?
  3. このようなものにサーブレットを使用することも正しいですか?代替手段は何ですか?

最初の回答の後の注意:両方を簡単に処理できるため、タイミングまたは並行性の問題の解決策を探していません。サーブレットコンテナでプロアクティブなプロセスを適切に開始する方法を知る必要があります。

14

Quartzは最善の策であり、最も高度に構成可能です。ユースケースで必要な場合は、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> 
13
vaskin

次のことを考慮する必要があります。

車輪の再発明を気にしないでください。Quartzや他の製品はすでにスレッド/タイムアウト/同時実行の問題を処理しています!

9
Brian Clozel