首先导入quartz依赖,这里我就不演示导入springboot,自己随意导入一个版本就好了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
然后我们就可以直接编写要执行的任务类了,这里我们选择继承QuartzJobBean这个类
public class TestTask extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("任务执行了。。。。");
}
}
创建好了需要执行的任务我们就需要去创建一个任务调度器,还有一个时间调度器,任务调度器是用来执行你需要执行的哪个类,时间调度器则是用来在你指定的间隔执行 一次任务
我们创建一个Configuration配置
然后将任务调度器和时间调度器都注入到bean中
@Configuration
public class config {
@Bean
public JobDetail testJob(){
return JobBuilder.newJob(TestTask.class).withIdentity("test", "group1").storeDurably().build();
}
@Bean
public Trigger testTrigger(){
//从第五秒开始每秒执行一次
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("5/1 * * * * ? ");
return TriggerBuilder.newTrigger().forJob(testJob()).withIdentity("testTrigger").withSchedule(cronScheduleBuilder).build();
}
}
最后启动springboot即可看到效果
spring注解Scheduled
也可以使用spring自带的Scheduled注解来完成简单开发,但是无法指定任务名称,可以直接使用cron表达式,不建议使用这种
首先还是导入springboot-quartz整合的包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
为什么要导入quartz整合的包呢,因为springboot和quartz整合的包里面有我们需要的几个依赖,为了方便就直接导入使用就可以了,当然也可以单独导入spring-context包,这个是spring的依赖,要用到@Scheduled需要spring的包
导入完成后就可以直接在启动类上加上启动Scheduled的注解
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
然后再编写一个component类即可启动
@Component
public class Task2 {
@Scheduled(cron = "55/1 * * * * ? ")
public void process() {
System.out.println("任务在一分钟的55秒后执行,每秒执行一次");
}
}
这种方式虽然便捷,但是没有找到能指定任务名称和调度器名称的注解属性,所以一般只用来做简单的功能,比如我想指定一个任务让他停下来但是又没有名称还是不行的。
暂停、恢复任务
首先我们定义好了springboot和quartz整合的任务以及调度器,并且能够正常运行,但是我们中途想让他停下来应该怎么做呢,停止整个项目肯定是不行的,那么我们可以做一个接口,发送请求就可以达到停止和开启的效果
我们先注入一下Scheduler,Scheduler是quartz提供的
@Autowired
Scheduler scheduler;
我们先来了解一下停止的方法pauseJob
@RequestMapping("/stop")
public String stopJob() throws SchedulerException {
JobKey jobKey = JobKey.jobKey("test", "group1");
scheduler.pauseJob(jobKey);
return "ok";
}
也可以关闭一整个组的任务,我们可以把想要关闭的任务都放在同一个任务组中
@RequestMapping("/stopJobs")
public String stopJobs() throws SchedulerException {
GroupMatcher<JobKey> jobKeyGroupMatcher = GroupMatcher.jobGroupEquals("group1");
scheduler.pauseJobs(jobKeyGroupMatcher);
return "ok";
}
开启一个任务
@RequestMapping("/start")
public String startJob() throws SchedulerException {
JobKey jobKey = JobKey.jobKey("test", "group1");
scheduler.resumeJob(jobKey);
return "ok";
}
开启一个组的任务
@RequestMapping("/startJobs")
public String startJobs() throws SchedulerException {
GroupMatcher<JobKey> jobKeyGroupMatcher = GroupMatcher.jobGroupEquals("group1");
scheduler.resumeJobs(jobKeyGroupMatcher);
return "ok";
}