Javaカスタムタイマー
6038 ワード
Javaカスタムタイマー
多くの場合、データ統計、タスクタイミングなど、タイマを使用して操作する必要があります.しかし、多くの場合、タイミングタスクをキャンセルしたり、時間を再設定したりする必要があるなど、Javaが持参したTimerを使うのは簡単ではない場合があるので、Timerを拡張してカスタムタイマーの効果を実現したいと思っています.タイミングタスクインタフェース:
抽象的な実装:
具体的なタイマー、例えばレポート生成、コードは以下の通りです.
使用中にSpringの注釈を使う必要があります!!!ReportTaskは、特定のタイミングタスクです.他のサービスを再起動する必要がある場所でreportTimer.restartTimer()を再起動すればよい.タイマーを閉じるのはreportTimer.stopTimer()です.
多くの場合、データ統計、タスクタイミングなど、タイマを使用して操作する必要があります.しかし、多くの場合、タイミングタスクをキャンセルしたり、時間を再設定したりする必要があるなど、Javaが持参したTimerを使うのは簡単ではない場合があるので、Timerを拡張してカスタムタイマーの効果を実現したいと思っています.タイミングタスクインタフェース:
public interface StartTimer {
/**
* startNextTimer
* @ :
* @ : zhuxl
* @ : 2016 8 29
*/
public abstract void startNextTimer();
/**
* startTimer
* @ :
* @ : zhuxl
* @ : 2016 8 29
*/
public abstract void startTimer();
/**
* stopTimer
* @ :
* @ : zhuxl
* @ : 2016 8 29
*/
public abstract void stopTimer();
/**
* restartTimer
* @ :
* @ : zhuxl
* @ : 2016 8 30
*/
public abstract void restartTimer();
}
抽象的な実装:
/**
*
* @author zhuxl
*
*/
public abstract class StartTimerImpl implements StartTimer {
/**
*
*/
protected Timer timer;
@Override
public void stopTimer() {
if(timer!=null){
timer.cancel();
}
}
@Override
public void restartTimer() {
startTimer();
}
}
具体的なタイマー、例えばレポート生成、コードは以下の通りです.
@Component("reportTimer")
public class ReportTimerImpl extends StartTimerImpl{
private Logger logger=Logger.getLogger(ReportTimerImpl.class);
@PostConstruct
public void init(){
this.startTimer();
}
@Override
public void startNextTimer() {
if(timer!=null){
timer.cancel();
logger.info(" !!");
}
timer=new Timer(true);
Date nextDate=computeNextDate(false);
if(nextDate==null){
logger.info(" !!");
return ;
}
logger.info(" , :"+nextDate);
timer.schedule(new ReportTask(),nextDate);
}
/**
* computeNextDate
* @ :
* @ : zhuxl
* @ : 2016 8 30
* @return
*/
private Date computeNextDate(boolean flag){
...
//
}
@Override
public void startTimer() {
if(timer!=null){
timer.cancel();
logger.info(" !!");
}
timer=new Timer(true);
Date nextDate=computeNextDate(true);
if(nextDate==null){
logger.info(" !!");
return ;
}
logger.info(" , :"+nextDate);
timer.schedule(new ReportTask(),nextDate);
}
}
使用中にSpringの注釈を使う必要があります!!!ReportTaskは、特定のタイミングタスクです.他のサービスを再起動する必要がある場所でreportTimer.restartTimer()を再起動すればよい.タイマーを閉じるのはreportTimer.stopTimer()です.