2008-09-07 2 views
8

ポッドキャスト#15で、Jeffはバックグラウンドで定期的なイベントをバックグラウンドで実行する方法についてtwitterで言いました。残念ながらTwitterでこれを見つけることはできません。今私は同様のことをする必要があり、大衆に質問を投げるつもりです。Javaウェブアプリケーションで通常のバックグラウンドイベントを実行する

私の現在の計画は、最初のユーザー(たぶん私)がサイトに入ったときに、アロートタイム(時間単位)まで待ってからバックグラウンドスレッドを開始し、私はイベントとWaitOnMultipleObjectsの面で考える)ので、それは完了するまで。

JeffはどのようにAsp.Netでそれを行い、彼の方法はJavaのWebアプリケーションの世界に適用できますか?

答えて

12

私は、バックグラウンドタスクを実行するためのカスタムソリューションを開発することは常に価値がないと思うので、私は中Quartz Schedulerを使用することをお勧めしますJava。

状況に応じて(Webアプリケーションでバックグラウンドタスクを実行する必要がある)、配布に含まれるServletContextListenerをinitialize the engine at the startup of your web containerに使用できます。

その後、バックグラウンドタスク(ジョブ)を開始(トリガー)するためのさまざまな方法があります。カレンダーやcronのような表現を使用することができます。あなたの状況では、ほとんどの場合、一定の間隔でジョブを実行できるように、SimpleTriggerで解決する必要があります。

ジョブ自体はQuartzでも簡単に記述できますが、実行する必要のあるものについては詳細を提供していないため、その領域では提案はできません。

3

Jeffのメカニズムは、ASP.Netが何らかの間隔で自動的に再作成されるようなキャッシュされたオブジェクトを作成することでした。ASP.Net固有のソリューションと思われたので、おそらくあなた(または私) Javaの世界では

https://stackoverflow.fogbugz.com/default.asp?W13117アトウッドを参照してください:私はちょうど軽量何かをしたかったので、まあ、私はもともと、Twitterで尋ねました。私は本当にWindowsサービスを書くのが好きではありませんでした。私はそれが帯域外のコードであるように感じました。実際に仕事をするコードは実際にはウェブページです。なぜなら、それはウェブサイト上の論理的な作業単位であるためです。だから、実際にはウェブサイトに戻ってくるようなものです。ウェブサイトの別のリクエストと同じように、私はそれをインラインにしておくべきものと見ていました。私たちが思いついた小さなアプローチはTwitterで私に勧められました基本的に一定の有効期限を持つアプリケーションキャッシュに何かを追加することでした。その後、コールバックすることで、期限が切れたときに作業を行う特定の関数が呼び出され、同じ有効期限を持つキャッシュに再び追加されます。ですから、ちょっとですが、おそらく「ゲットー」は正しい言葉です。

私のアプローチは、OS(つまり、CronやWindowsタスクスケジューラ)が一定の間隔で特定のURLを読み込んでそのURLにページを設定してキューをチェックし、必要なのですが、もっと良い方法があれば聞くことに興味があります。

FogBugzは、URLアクセスをロードするWindowsサービスも使用しているようです。

Spolsky:この特別なページはheartbeat.aspです。そして、あなたがそれを打つといつでも誰でもそれを打つことができる:そのページは傷つきません。しかし、そのページが実行されると、待ちタスクの待ち行列がチェックされ、何かが必要かどうかが確認されます。そして、実行する必要のあるものがあれば、それは1つのことを行い、次にそのキューを探します。実行する必要があるものがあれば、それはプラスを返し、それが返すウェブページ全体は、その中に。そして何もする必要がなければ、キューは空になり、それはマイナスを返します。だから、誰でもこれを呼び出して何度もヒットすることができます。あなたのWebブラウザにheartbeat.aspをロードして、Ctrl + R Ctrl-R Ctrl-Rを押します。それを済ませたら、FogBugzは必要なメンテナンス作業をすべて完了します。これは最初の部分です.2番目の部分は実行される非常に単純なWindowsサービスであり、heartbeat.aspを呼び出し、プラスを取得した場合はすぐにもう一度呼び出し、マイナスの呼び出しを受け取った場合それはもう一度ですが、しばらくはありません。だから、基本的には、常に実行されているこのWindowsサービスがあります。URLを打つだけで、プラスかマイナスになるかどうかを調べて、それがいつ実行されるかをスケジューリングしますそれはプラスまたはマイナスを持っています。そして、明らかに、あなたはこのテーマでどんな種類のバリエーションをもできます。たとえば、実際には、「プラス60秒で私に電話してください」とか、私はもっ​​と多くの仕事をしなければならない」そして、それはどのように動作するのですか...メンテナンスサービスが実行されるように、そのメンテナンスサービスを実行するコードの半分のページがあります。変更する必要はありません。そこに論理の中には、特定の保証された頻度でこれらのWebページが呼び出されるようなくすぐりが含まれています。そのWebページのheartbeat.aspには、実行する必要があるタスクのキューを管理するコードがあり、どれくらいの時間が経過したかを確認し、深夜の保守と7日ごとに古いメッセージをすべて削除しますスパムとメンテナンスのバックグラウンドタスクのすべての種類としてマークされています。そして、それがそうする方法です。ここで

5

前述のように、Quartzは標準的なソリューションの1つです。再起動時のバックグラウンドタスクのクラスタリングや永続性について気にしない場合は、組み込みのThreadPoolサポート(Java 5,6)を使用できます。 ScheduledExecutorServiceを使用する場合は、実行前に特定の時間待機するバックグラウンドスレッドプールにRunnablesを置くことができます。

クラスタリングや永続性を気にする人は、非同期実行のためにJMSキューを使用することができます。ただし、バックグラウンドタスクを遅らせる方法が必要です(QuartzまたはScheduledExecutorServiceを使用してこれを行うことができます)。

2

スケジュールされたバックグラウンドタスクにはjtcronを使用します。 それはうまくいきます。そして、あなたがcronを理解するなら、それはあなたに合っているはずです。

関連する問題