0

インターネット上のリソースで新しいメールをチェックするアプリケーションがあります。新しいメールがある場合、それらに対して何らかの処理を行います。これは、メールの量によっては、処理に数秒から数時間かかる場合があることを意味します。

現在、処理を行うオブジェクト/プログラムはすでにシングルトンです。だから今、私はすでにチェックと処理を処理しているインスタンスが1つしかないことに気を配っています.

ただし、今は一度しか実行していないので、継続的に実行して、タイムリーに処理するために、ほぼ 10 分ごとに新着メールをチェックしたいと考えています。

Timer/Timertask を使用してこれを処理できることを理解しています。または、Scheduler/SchedulerTask を使用するhttp://www.ibm.com/developerworks/java/library/j-schedule/index.htmlというリソースを見つけた方がよいでしょう。しかし、私が恐れているのは、10分ごとに実行するように設定し、前のセッションがすでにデータを処理している場合、前のセッションが完了すると、新しいタスクが実行されるのを待っているスタックに置かれることです。私が恐れているのは、たとえば、最初の実行が 5 時間実行され、その後ずっと忙しかったため、その後は 5*6-1=29 が開始され、お互いにメールをチェックしたり、/サーバーを中断せずに何らかの処理を行います。

これを解決する方法を知っている人はいますか?

PS、現在アプリケーションをセットアップしている方法は、Tomcat サーバーで Java サーブレットを使用していることです。これは、サーバーの起動時に起動され、メイン プログラムのシングルトン インスタンスを作成し、フェッチ/処理を行うメソッドを呼び出します。そして、私が望むのは、「x」時間ごと(10分程度)にそのフェッチ/処理を繰り返し、実際には1つのインスタンスのみがこれを実行していることを確認し、実行ごとに10分ほど休ませることです。

4

1 に答える 1

1

実際、Timer + TimerTask はこれをかなりきれいに処理できます。Timer.scheduleAtFixedRate()で何かをスケジュールすると、長期の実行期間を維持するために遅延イベントを「補う」ことを試みるとドキュメントに記載されていることに気付くでしょう。ただし、これはTimerTask.scheduledExecutionTime()を使用することで克服できます。その例では、タスクの実行が遅すぎて実行できないかどうかを判断でき、何もせずに戻ることができます。これにより、実質的に TimerTask の「キューがクリア」されます。

注: TimerTask は単一のスレッドを使用して実行するため、タスクの 2 つのコピーを並べて生成することはありません。

余談ですが、1 回の実行でキュー内の 1 万通の電子メールをすべて処理する必要はありません。TimerTask.scheduledExecutionTime() を使用して一定時間処理して、残り時間を把握してから戻ることをお勧めします。これにより、プロセスがより柔軟になり、実行間のスタックがクリーンアップされます。また、集計を行っている場合は、タスクの途中でサーバーが再起動された場合などに、大量のデータを再構築する必要がなくなります。ただし、この推奨事項は一般論に基づいています。タスクで何をしているのかわかりません:)

于 2011-09-13T04:43:52.290 に答える