目录
1.定时任务实现方法Timer和三方框架注解实现(@,@) 2.表达式
3、实现定时任务 3.1 任务/工作(Task/Job)
位于 org..Job 中的接口是 .job 中的核心任务接口。 实现一个自定义的定时任务(也就是我们要执行的业务/job),只需要实现这个接口即可。 也可以继承实现类。 重新在 () 方法里面。
3.2 触发器()
位于org..中,用于告诉作业什么时候被触发,也就是我们要设置任务触发的条件。 提供了五种触发器类型,但最常用的两种是 .
五种类型(触发器):
,,, r 和 。
3.3 调度器()
From org.. 是主界面,代表一个独立运行的容器。 调度程序维护触发器的注册表。 注册后,调度器负责在其关联的触发器触发时(当它们的预定时间到达时)执行作业。不难看出,其功能是将任务作业与触发器作业结合起来
3.4 任务执行上下文()
位于org..中的类是任务执行时注入的对象,用于保存任务的详细信息(如触发器、调度器、工作详情、任务入参等),我们可以得到任务在运行时通过这个对象数据,它也可以接受动态参数。
3.5. 任务详情()
位于org..中,用于绑定job,为job提供一些属性:
为什么要设计成 + Job 而不是直接使用 Job 呢?
定义了任务数据,真正的执行逻辑在Job中。
这是因为任务可以并发执行。 如果直接使用Job,会出现并发访问同一个Job实例的问题。 在&Job模式下,每次执行都会创建一个新的Job实例,这样就可以避免并发访问的问题。
3.6 应用演示
任务:
public class QuartzTask extends QuartzJobBean {
// 这种可以注入
@Autowired
private QuartzTaskController quartzTaskController;
// 这里不能注入Controller ?????
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
this.quartzTaskController.updateVectorParcelNumber();
}
}
简单的任务配置:
@Configuration
public class QuzrtzTaskConfiguration {
@Value("${cron}")
private String cron;
@Bean
public JobDetail getSimpleJobDetail() {
return JobBuilder.newJob(QuartzTask.class)
.storeDurably()
.build();
}
@Bean
public Trigger getSimpleTrigger() {
SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
simpleScheduleBuilder.withIntervalInMinutes(20)
.repeatForever();
return TriggerBuilder.newTrigger()
.forJob(getSimpleJobDetail())
.withIdentity("testSimpleScheduleBuilder")
.withSchedule(simpleScheduleBuilder)
.startNow() // 立即执行定时任务
.build();
}
}
Cron 表达式任务配置:
@Configuration
public class QuzrtzTaskConfiguration {
@Value("${cron}")
private String cron;
@Bean
public JobDetail getCronJobDetail() {
return JobBuilder.newJob(QuartzTask.class)
.withIdentity("ModifyVectorParcelNumberTask")
.storeDurably()
.build();
}
@Bean
public Trigger getCronTrigger() {
//CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 59/10 * * * ? *");
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(this.cron);
return TriggerBuilder.newTrigger()
.forJob(getCronJobDetail())
.withIdentity("testCronScheduleBuild")
.withSchedule(cronScheduleBuilder)
//.startNow() StartNow 应该只适用于 SimpleTrigger 触发器。
.build();
}
}