序文
Quartz を使用して構成可能なタイミング タスクを実装し、タイミング タスク Quartz をデータベースに書き込みます。ここで、プロジェクトの開始時にスケジュールされたタスクを自動的にトリガーしたいと思います。実装方法は次のとおりです。
プロジェクトのセルフスタート
Spring BootではApplicationRunnerを利用してプロジェクト起動直後の業務運用を実装していますが、
このブログではプロジェクト起動後の業務自動化の実装について詳しく解説しています。スケジュールされたタスクによって呼び出されるメソッド インターフェイスを run メソッドに追加するだけです。
log.info("启动定时任务");
quartzService.startQuartz();
スケジュールされたタスクの開始
スケジュールされたタスク情報をデータベースから取得する
public void startQuartz(){
String jobGroup ="MySyncTask";
String jobName ="定时人数";
try {
//先已有的任务
List<Quartz> list = quartzMapper.findList(jobGroup, jobName);
if(list != null && list.size()>0){
log.info("项目启动后,启动定时任务:{}",list.get(0).getJobName());
doQuatrz(list.get(0));
}
}catch (Exception e){
e.printStackTrace();
log.error("项目启动后,启动定时任务发生异常:{}",e.getMessage());
API.e("项目启动后,启动定时任务发生异常");
}
}
時間指定タスクのクエリとトリガー
private void doQuatrz(Quartz quartz){
try {
//直接启动
Class cls = Class.forName(quartz.getJobClassName()) ;
cls.newInstance();
//构建job信息
JobDetail job = JobBuilder.newJob(cls).withIdentity(quartz.getJobName(),quartz.getJobGroup()).withDescription(quartz.getDescription()).build();
// 触发时间点
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartz.getCronExpression());
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger_"+quartz.getJobName(), quartz.getJobGroup()).withDescription(quartz.getDescription()).startNow().withSchedule(cronScheduleBuilder).build();
//交由Scheduler安排触发
scheduler.scheduleJob(job, trigger);
quartz.setJobStatus(JobStatus.RUN.getStatus());
quartzRepository.save(quartz);
}catch (Exception e){
e.printStackTrace();
log.error("执行任务发生异常:{}",e.getMessage());
API.e("执行任务发生异常");
}
}