8

ポッドキャスト #15 で、Jeff は通常のイベントを通常の機能であるかのようにバックグラウンドで実行する方法について Twitter で投稿したと述べました - 残念ながら、Twitter でそれを見つけることができないようです。今、私は同様のことをする必要があり、大衆に質問を投げかけるつもりです.

私の現在の計画は、最初のユーザー (おそらく私) がサイトに入ると、割り当てられた時間 (1 時間ごと) まで待機するバックグラウンド スレッドを開始し、他のユーザーをブロックするイベントを開始することです (私は職業上の Windows プログラマーなので、イベントと WaitOnMultipleObjects) の観点から、完了するまで考えます。

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

4

5 に答える 5

12

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

あなたの状況 (Web アプリケーションでバックグラウンド タスクを実行する必要がある) では、ディストリビューションに含まれている ServletContextListener を使用して、Web コンテナーの起動時にエンジンを初期化できます。

その後、バックグラウンド タスク (ジョブ) を開始 (トリガー) する可能性がいくつかあります。たとえば、カレンダーや cron のような式を使用できます。あなたの状況では、おそらく、固定された定期的な間隔でジョブを実行できるSimpleTriggerで解決する必要があります。

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

于 2008-09-07T11:25:27.407 に答える
5

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

クラスタリングや持続性に関心がある場合は、非同期実行に JMS キューを使用できますが、バックグラウンド タスクを遅らせる何らかの方法が必要になります (Quartz または ScheduledExecutorService を使用してこれを行うことができます)。

于 2008-09-07T11:35:15.887 に答える
3

Jeff のメカニズムは、ASP.Net が一定の間隔で自動的に再作成する、ある種のキャッシュ オブジェクトを作成することでした。これは ASP.Net 固有のソリューションのように見えたので、おそらく Java の世界ではあまり役に立ちません。

https://stackoverflow.fogbugz.com/default.asp?W13117を参照してください。

Atwood: 最初は Twitter で質問しました。軽いものが欲しかったからです。Windows サービスを書くのは本当に好きではありませんでした。それは帯域外のコードのように感じました。さらに、実際に作業を行うコードは実際には Web ページです。私にとって、それは Web サイトでの論理的な作業単位が Web ページだからです。つまり、実際には Web サイトにコールバックしているようなものであり、Web サイト内の別のリクエストのようなものです。そのため、インラインのままにしておく必要があるものと見なし、Twitter で推奨された小さなアプローチを思いつきました。基本的に、有効期限が固定されたアプリケーションキャッシュに何かを追加することでした。その後、コールバックがあり、有効期限が切れると、作業を行う特定の関数が呼び出され、同じ有効期限でキャッシュに追加されます。だから、ちょっとね、たぶん」

私のアプローチは常に、OS (つまり、Cron または Windows タスク スケジューラ) が特定の URL を一定の間隔でロードし、その URL でページをセットアップしてそのキューをチェックし、必要なタスクを実行する必要がありましたが、私はより良い方法があるかどうかを聞くことに興味があります。

トランスクリプトから、FogBugz は URL アプローチをロードする Windows サービスも使用しているようです。

Spolsky: それで、heartbeat.asp という特別なページがあります。そして、そのページはいつでも、誰でもいつでも叩くことができます。しかし、そのページが実行されると、待機中のタスクのキューをチェックして、実行する必要があるものがあるかどうかを確認します。そして、何かする必要がある場合は、1 つのことを実行してから、そのキューをもう一度調べます。他に何かする必要がある場合は、プラスを返します。返される Web ページ全体は、プラスが付いた 1 文字だけです。初期化。他に何もすることがなければ、キューは空になり、マイナスを返します。したがって、誰でもこれを呼び出して何度でも押すことができます。web ブラウザーに heartbeat.asp をロードして、プラスではなくマイナスが表示されるまで Ctrl-R Ctrl-R Ctrl-R Ctrl-R を押します。そして、あなたが' これで、FogBugz は必要なメンテナンス作業をすべて完了することができました。これが最初の部分で、2 番目の部分は非常に単純な Windows サービスで、実行されます。全体の仕事は、heartbeat.asp を呼び出し、プラスの場合はすぐにもう一度呼び出し、マイナスの場合は再度呼び出すことです。繰り返しますが、しばらくの間ではありません。基本的に、常に実行されているこの Windows サービスがあります。このサービスは、URL をヒットし、それがプラスかマイナスかを確認し、次に実行するかどうかに基づいて再実行するタイミングをスケジュールするという非常に非常に単純なタスクを実行します。プラスかマイナスになりました。もちろん、このテーマではどんな種類のバリエーションでも作成できます。たとえば、実際には、プラスまたはマイナスだけを返す代わりに、「60 秒後に電話してください」または「」と言うことができます。つまり、メンテナンス サービスは実行されるだけです。つまり、そのメンテナンス サービスを実行するコードの半分のページのようなものであり、変更する必要はなく、そこにはロジックがまったく含まれていません。これらの Web ページが特定の保証された頻度で呼び出される原因となるくすぐりが含まれています。そして、その web ページの heartbeat.asp には、実行する必要があるタスクのキューを保持し、経過時間を調べて、深夜のメンテナンスを行い、7 日ごとに古いメッセージをすべて削除するコードがあります。スパムおよびあらゆる種類のメンテナンス バックグラウンド タスクとしてマークされています。そして、ええと、それがそれを行う方法です。つまり、メンテナンス サービスは実行されるだけです。つまり、そのメンテナンス サービスを実行するコードの半分のページのようなものであり、変更する必要はなく、そこにはロジックがまったく含まれていません。これらの Web ページが特定の保証された頻度で呼び出される原因となるくすぐりが含まれています。そして、その web ページの heartbeat.asp には、実行する必要があるタスクのキューを保持し、経過時間を調べて、深夜のメンテナンスを行い、7 日ごとに古いメッセージをすべて削除するコードがあります。スパムおよびあらゆる種類のメンテナンス バックグラウンド タスクとしてマークされています。そして、ええと、それがそれを行う方法です。そこにロジックは何もありません。これらの Web ページを特定の保証された頻度で呼び出す原因となるくすぐりが含まれているだけです。そして、その web ページの heartbeat.asp には、実行する必要があるタスクのキューを保持し、経過時間を調べて、深夜のメンテナンスを行い、7 日ごとに古いメッセージをすべて削除するコードがあります。スパムおよびあらゆる種類のメンテナンス バックグラウンド タスクとしてマークされています。そして、ええと、それがそれを行う方法です。そこにロジックは何もありません。これらの Web ページを特定の保証された頻度で呼び出す原因となるくすぐりが含まれているだけです。そして、その web ページの heartbeat.asp には、実行する必要があるタスクのキューを保持し、経過時間を調べて、深夜のメンテナンスを行い、7 日ごとに古いメッセージをすべて削除するコードがあります。スパムおよびあらゆる種類のメンテナンス バックグラウンド タスクとしてマークされています。そして、ええと、それがそれを行う方法です。深夜のメンテナンスと 7 日ごとに、スパムとしてマークされたすべての古いメッセージと、あらゆる種類のメンテナンス バックグラウンド タスクのみを削除します。そして、ええと、それがそれを行う方法です。深夜のメンテナンスと 7 日ごとに、スパムとしてマークされたすべての古いメッセージと、あらゆる種類のメンテナンス バックグラウンド タスクのみを削除します。そして、ええと、それがそれを行う方法です。

于 2008-09-07T10:31:41.373 に答える
2

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

于 2008-09-07T15:55:20.160 に答える
1

StackOverflow.com での方法は次のとおりです。

https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

于 2008-09-07T10:37:54.260 に答える