目录
一 Springboot整合Scheduled
1、导入Scheduled依赖
不需要额外的依赖,只需要导入springboot web依赖即可;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、开启定时任务
在项目的启动类上添加 @EnableScheduling注解即可;
@SpringBootApplication
@EnableScheduling
public class SpringbootexampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootexampleApplication.class, args);
}
}
3、配置定时任务
@Component
public class MyTask {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)
public void sendTask(){
System.out.println(dateFormat.format(new Date()));
}
}
其中 "fixedRate = 5000"表示在当前任务执行5秒后开启另一个任务;
"fixedDelay = 5000"表示在当前任务执行结束5秒后开启另一个任务;
"initialDelay = 5000"表示首次执行的延迟时间;
相关定时任务配置规则可参考:https://www.bejson.com/othertools/cron/
二 Springboot整合Quartz
Quartz的核心要素
任务(Job):我们要执行的某件事情,代码逻辑;
任务详情(JobDetail):描述 Job 的实现类及其他相关的静态信息,以便运行时通过 newInstance() 的反射机制实例化 Job。(不懂,自古牛逼多反射;)
调度器(Scheduler):所有的调度都有它来控制;
触发器(Trigger):决定什么时候来执行任务;
1、导入Quartz依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、编写Job任务
@Component
public class MyJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String msg = (String) jobExecutionContext.getJobDetail().getJobDataMap().get("msg");
String time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
System.out.println(time+"------"+msg);
}
}
3、编写Quartz配置文件
@Configuration
public class QuartzConfig {
//构建 JobDetail
@Bean
public JobDetail myJobDetail() {
return JobBuilder.newJob(MyJob.class)
//给JobDetail起了一个名字;
.withIdentity("myJobDetail")
//每个JobDetail内部都有一个map,包含了关联到这个Job的数据,在Job类中可以通过context获取;
.usingJobData("msg","HelloQuartz")
//即使没有Trigger关联时,也不需要删除该JobDetail
.storeDurably()
.build();
}
//构建Trigger和Scheduler
@Bean
public Trigger MyJobTrigger() {
return TriggerBuilder.newTrigger()
//关联上面的JobDetail;
.forJob(myJobDetail())
//给Trigger起了一个名字;
.withIdentity("MyJobTrigger")
//cron 表达式设置每隔 5 秒执行一次
.withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ? *"))
.build();
}
}