要件:タイマーは運転操作の時間、および分散環境で展開する必要性を調整し、リアルタイムで切り替えることができます。
ソリューション:
1、構成の柔軟性:
現在のすべてのサーブレットを使用すると、タイマーを初期化し、そして時間の設定は、一緒にサーブレットの静的フィールドに保存されます。
これは、柔軟ユーザ設定に従って構成されたメモリとタイマ動作時間を可能にします。
2、分散環境でのデータの一貫性の問題:
① 分散排他ロック作成同じ時間に要求複数のノードには、相互に排他的でした。
② 各タイマは、タスクの実行前に、データベースの設定時間を同期させる必要それが適切な構成の変更、加える構成変更が見つかった場合、データベースとの同期設定が残ります。
③タスクが完了した後、10分タイマ睡眠は、問題のクロック差、繰り返しノード間で実行される同じタスクを防止します。
④サーブレットのdestroyメソッドは、すべてのタイマーをクリアします。
キーコード:
// 毎日特定の時間を実行するためにタイマーを作成します。
HがH =新しいTimer();
日taskDate =のgetDate( "12");
timer.schedule(新しいXXXTask()、taskDate、* 1000年24 * 60 * 60); //特定の時間、毎日のタスクを実行するには
// Dateクラスの特定の時間を取得します。
公共日のgetDate(文字列executeTime){
int型の時間= Integer.parseInt();
カレンダーカレンダー= Calendar.getInstance();
INT年= calendar.get(Calendar.YEAR)。
int型ヶ月= calendar.get(Calendar.MONTH)。
int型日= calendar.get(Calendar.DAY)。
calendar.set(年、月、日、時、00、00);
日taskDate = calendar.getTime();
もし(taskDate.before(新日)){
//明日のための時間を設定します
calendar.add(Calendar.DATE、1)。
taskDate = calendar.getTime()。
}
taskDateを返します。
}