2011-09-13 14 views
0

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

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

しかし、今は一度だけ実行しています。新しいメールを10分ごとにチェックすることで、タイムリーに処理することができます。

私はこれをTimer/Timertaskで処理できることを理解していますが、ここではリソースが見つかりました。http://www.ibm.com/developerworks/java/library/j-schedule/index.htmlではScheduler/SchedulerTaskを使用しています。しかし、私が恐れているのは、10分ごとに実行するように設定し、以前のセッションが既にデータを処理している場合、前のセッションが実行されると実行されるのを待っているスタックに新しいタスクを配置するということです。それで私が恐れているのは、最初の実行が5時間実行されていることです。その後、すべての時間が忙しかったので、その後、5 * 6-1 = 29が実行され、サーバーに休憩を与えずに何らかの処理を行います。

誰も私がこれを解決する方法を知っていますか?

P.S.私のアプリケーションを今設定しているのは、私がメインプログラムのシングルトンインスタンスを作成し、フェッチ/処理を行うためのメソッドを呼び出す、サーバーの起動時に起動するTomcatサーバー上でJavaサーブレットを使用していることです。そして、私が望むのは、毎回の "x"時間(10分程度)をフェッチ/処理することです。実際に実行するのは1インスタンスだけです。

+0

なぜイベントベースのアプローチを試してみませんか?あなたのスケジューラークラスは時間を変えることができるタスクを起動します。このタスクを起動すると、プロセス完了イベントをリッスンするリスナーも登録されます。可変耐久性のメール処理タスクが完了すると、スケジューラに通知されます。スケジューラは、10分後にトリガする別のタスクをエンキューできます。これにより、不要なタスクがタスクキューに入れられなくなります。 – Scorpion

答えて

1

実際、Timer + TimerTaskはこれをきれいに処理できます。 Timer.scheduleAtFixedRate()でスケジュールを設定した場合、長期間の実行期間を維持するために、遅いイベントを「補う」ことを試みることになります。しかし、これは、TimerTask.scheduledExecutionTime()を使用することによって克服することができます。その中の例では、タスクが遅すぎて実行することができないかどうかを知ることができ、何もする代わりに戻ることができます。実際には、これはTimerTaskの「キューをクリアする」でしょう。

注:TimerTaskは実行するために単一のスレッドを使用しているため、タスクの2つのコピーが並んで生成されません。

サイドノート部分では、キュー内のすべての10kメールを一度に処理する必要はありません。私はTimerTask.scheduledExecutionTime()を使用して一定の時間処理して、どれくらいの時間が経過したのかを判断してから、返すことをお勧めします。これにより、プロセスがより自由になり、実行の間にスタックがクリーンアップされ、集約を実行している場合は、タスクの途中でサーバーが再起動されるなど、あまりデータを再構築する必要がありません。しかし、この勧告は一般的なものに基づいています。なぜなら私はあなたが何をしているのか分からないからです。

関連する問題