私はインターネット上のリソースから新しいメールをチェックするアプリケーションを持っています。新しいメールがある場合、新しいメールが処理されます。つまり、メールの量によっては、処理に数秒から数時間かかることがあります。タスクを実行してタスクが実行中であることを確認する
処理を行うオブジェクト/プログラムは、すでにシングルトンです。だから、今私はすでに、実際にチェックと処理を処理しているインスタンスが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インスタンスだけです。
なぜイベントベースのアプローチを試してみませんか?あなたのスケジューラークラスは時間を変えることができるタスクを起動します。このタスクを起動すると、プロセス完了イベントをリッスンするリスナーも登録されます。可変耐久性のメール処理タスクが完了すると、スケジューラに通知されます。スケジューラは、10分後にトリガする別のタスクをエンキューできます。これにより、不要なタスクがタスクキューに入れられなくなります。 – Scorpion