本章主要演示定时器的操作,本项目主要实验以下内容:
- SpringTask的实验,包括三种定时器FixDelay、Cron、FixRate
- 分布式环境下的quartz处理
这是单机使用的推荐方案,集成在Spring-Context中,所以不需要其他依赖,三种定时器都是不交叉执行,区别在于场景和效率,具体如下:
Spring Task集成步骤
- 工程主类开启@EnableScheduling注解
- 新增定时器,标注@Component
- 定时器的方法采用 @Scheduled,参数可以选择FixDelay、Cron、FixRate(具体详见代码)
小结:Task的计划任务是单线程阻塞的,严格又带点古板
本项目主要是单机版的两种配置方式,持久化分布式方案可参考这里,因目前主流xxl-job由点评网牵头开源,后续再补充。
quartz集成步骤如下:
- pom引入依赖
<!-- 实现对 Quartz 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>- job类设计,这是具体的执行逻辑,继承QuartzJobBean,重写executeInternal方法,另外接口实现方式,可参看上面连接!
public class FirstJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//……
}
}quartz自动配置,新增一个配置类,填充jobDetail和trigger
@Configuration
public class QuartzConfig {
@Bean
public JobDetail jobDetail1() {
// ……
}
@Bean
public Trigger trigger1() {
// ……
}
}quartz手动配置,新建一个bean实现ApplicationRunner接口,重写run方法,实现jobDetail、Cron、Trigger
@Component
public class JobInit implements ApplicationRunner {
@Autowired
private Scheduler scheduler;
@Override
public void run(ApplicationArguments args) throws Exception {
JobDetail jobDetail = JobBuilder.newJob(SecondJob.class)
.withIdentity(ID + " 01")
.storeDurably()
.build();
CronScheduleBuilder scheduleBuilder =
CronScheduleBuilder.cronSchedule("0/5 * * * * ? *");
// 创建任务触发器
Trigger trigger = TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withIdentity(ID + " 01Trigger")
.withSchedule(scheduleBuilder)
.startNow() //立即執行一次任務
.build();
// 手动将触发器与任务绑定到调度器内
scheduler.scheduleJob(jobDetail, trigger);
}
}
