JavaWebアプリケーションで定期的に1つの関数を実行する必要があります。あるクラスの関数を定期的に呼び出す方法は?サーバーの高負荷などのイベントが発生したときに関数を呼び出す方法はありますか?crontabとは何ですか?それは定期的に機能しますか?
8 に答える
定期的に何かを呼び出すには、TimerTaskを参照してください
より堅牢なものが必要な場合は、Quartzを使用できます
crontab
Unixマシンのスケジューリングツールもそうです。
サーバーの負荷が高いときにメソッドを呼び出すには、少なくとも2つの方法があります。App Serverには、その動作を監視し、プログロマティックなアクションを実行できる管理フックがある場合があります。または、システム監視機能(TivoliやOpenViewなど)があり、「イベント」を生成します。JMSメッセージなどのイベントを配信してサーバーに取得させるのはそれほど難しくありません。
ただし、達成したいことについてもう少し説明したい場合があります。アダプティブアプリケーションの動作は、正しく理解するのが非常に難しい場合があります。
定期的に何かを実行したい場合は、Webサーバーで実行しないでください。それは非常に間違ったアプローチIMOになります。cron
Unixライクなオペレーティングシステムを使用している場合は、代わりに使用することをお勧めします。Windowsサーバーも同様の機能を提供します。
JavaWebアプリケーションで定期的に1つの関数を実行する必要があります
(1)したがって、デプロイメント記述子(web.xml)を調べて、起動時に起動するリスナーを定義します。
あるクラスの関数を定期的に呼び出す方法は?
(2)リスナーにタイマーを作成します。
サーバーの高負荷などのイベントが発生したときに関数を呼び出す方法はありますか?
(3)いくつかのスレッドを実行して、Javaでアクセス可能なシステム条件をチェックし、システムプログラム(稼働時間など)を実行して出力を解析します。
crontabは方法かもしれませんが、Javaを実行すると別のJVMが起動します。これは、サーブレットコンテナで非常にホットなことです。すべて同じJVMで実行されます。
java.util.concurrentを忘れないでください。単純なタイマー以上のものが必要な場合は、ScheduledThreadPoolExecutorなどのスケジューリング用のクラスがたくさんあります。
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html
Java 1.4へのバックポートもあります:http://backport-jsr166.sourceforge.net。
すでにSpringを使用している場合は、Springのタスク実行フレームワークを確認することをお勧めします。@Scheduledと@Asyncを使用して、メソッドにタスクとして注釈を付け、プロセッサに実際の作業をワーカーに委任する機能を実装します。
http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/
利点は、Springコンテキストでcronのような構文を使用してタイマーを定義でき、タスクの設定に特別なことは何も必要ないことです。また、Java EEアプリケーションに十分に統合されており、Webサーバー(カスタムスレッドは常に機能するとは限りません)。
あるクラスの関数を定期的に呼び出す方法は?
いくつかの解決策があります:タイマー、 cron4jのようなJava cron実装、Quartz、さらにはEJBタイマーAPI。どちらを選択するかは、アプリケーションの種類、使用するテクノロジー、ジョブの数など、コンテキストによって大きく異なります。
サーバーの高負荷などのイベントが発生したときに関数を呼び出す方法はありますか?
ジョブでJMXを使用して、情報にアクセスして監視し、特定の条件下でアクションをトリガーすることができます。ただし、これはイベントベースではなく、プルモードです。