第一种我们可以使用java原生提供的api去实现一个定时任务
利用Timer这个api,去实现定时任务,用Timertask去创建一个任务
public class javaJob {
public static void main(String[] args) {
//利用java的api Timer来完成一个定时任务
Timer timer = new Timer();
//其实这个技术也是基于java的线程去做的
TimerTask task=new TimerTask() {
@Override
public void run() {
System.out.println("这是一个定时任务");
}
};
timer.schedule(task,0,2000);
}
}
其中完成定时的 timer.schedule(task,0,2000);
解释一下这个里面的含义,首先task这个就是你要定时的一个任务,delay代表延迟多久执行,我们这里为了测试设置为0就就是不延迟,period就是每个多久执行一次,我们为了看到效果设置为2000,也就是2秒执行一次
下面来看效果
好了这个时候我们利用javaAPI做的一个定时任务就是完成了,其实这个就是基于java多线程去做的
但是现在在我们企业级应用中定时任务的应用非常广泛,于是就出现了完成定时任务的技术
比如Quarze,这个技术在现在市面上非常流行
你要想在springboot中整合这个技术,我们首先来了解几个词
>工作(job):用于执行具体的任务
>工作明细(jobDetail):用于定义定时工作的信息
>触发器(Trigger):用于描述触发工作的规则,和定义调度通常用Cron来进行定义调度的规则
>调度(scheduler):用于描述工作明细和触发器之间的关系
理解以上的四个词的含义我们来进行整合Quarze
1.第一步就是来导入整合Quarze的坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
因为springboot中已经提供了版本号了我们这里就用springboot提供的默认版本号
2,这里我们不需要做Quarze的配置,我们要做的是去继承一个quarze的一个抽象类QuartzJobBean,代表这个是一个Job然后是实现这个抽象类中的方法就是我们具体的工作
public class Myquartz extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("hhhh我是quartz");
}
}
这里我们就完成我们上面所讲的一个工作的创建。
创建完一个job后我们是不是要创建一个jobDetail工作明细来绑定我们的工作,再创建一个触发器来绑定工作明细,再由时间调度说明jobDetail和Tigger的关系
这是不是属于一个配置啊。那么我们此时不再配置中配置这些信息了,我们创建一个配置类来让这些bean加载到spring容器中。
//这个类主要是做配置类去配置JobDetail,Trigger即配置工作明细,和触发器,
@Configuration
public class QuartzConfig {
@Bean
public JobDetail jobDetail(){
//在这里工作明细要绑定一个job
//现在这个工作就完成了这里必须要加上storeDurably,这个作用是当这个任务没有被执行也会一直存在保持持久化
return JobBuilder.newJob(Myquartz.class).storeDurably().build();
}
@Bean
public Trigger trigger(){
//这里触发器要绑定一个工作明细JobDetail 同时要完成调度
//这里要说明一下withSchedule是完成调度的下面这行代码是实现时间调度的要
//要说明一下0 0 0 0 0 0,分别代表 秒 分 时 日 月 星期 其中日 和星期会有冲突通常我们都只配一个 另一个用?代替
//ScheduleBuilder<? extends Trigger> schdule=CronScheduleBuilder.cronSchedule("0 0 0 0 0 0") ;
//如CronScheduleBuilder.cronSchedule("0 0 0 1 2 ?")这就代表了2月的第一天0秒0分0时 我们还可以配*代表任意 ;
//还可以如CronScheduleBuilder.cronSchedule("0/15 * * * * ?")代表没个15秒执行一次
ScheduleBuilder schdule=CronScheduleBuilder.cronSchedule("0/5 * * * * ?") ;
//forJob就时绑定工作明细
return TriggerBuilder.newTrigger().forJob(jobDetail()).withSchedule(schdule).build();
}
}
这段代码完成后我们就把这些事请都做完了。在这里我要提醒一下特别要注意
ScheduleBuilder schdule=CronScheduleBuilder.cronSchedule("0/5 * * * * ?") ;
如何对调度进行配置我上面的代码是每个间隔十五秒执行一次在任意时刻。在上面代码块中有我对这部分有对应的解释。
下面就是开启引导类做一下测试就ok了
下面我们来讲解第三种完成定时任务的技术
其实在springboot中,已经为我们提供了一个完成定时任务的技术。SpringTask这个技术。
它比起Quarze更加的方便。可以使用注解的方式进行。
和Quarze整合一样我们先导入springtask的坐标依赖,但由于这个技术是spring提供的我们不用导入就有这个功能
我们要做的是进行配置
# 配置springtask 定时任务相关的配置
spring:
task:
scheduling:
pool:
size: 10
thread-name-prefix: hanhan
execution:
shutdown:
# 线程关闭时是否等所有任务结束
await-termination: false
# 线程最大的等待时间,防止线程陷入循环关不掉
await-termination-period: 10s
对于 thread-name-prefix 这个配置其实就是给你的任务加个前缀便于区分。和你使用线程一样。
size就是规定线程池的大小。 await-termination: 就是当你将线程关闭时还有任务没有完成是否等待它完成后关闭 await-termination-period: 就是为了防止你的任务是个无限执行的任务,设置一个最大等待时间。
下面要做的事情就是开启我们定时任务的功能。
首先在引导类上使用@EnableScheduling注解开启定时任务
@SpringBootApplication
@EnableScheduling //这个注解的作用就是开启定时任务功能 利用springtask即时spring的自己的技术
public class Springbooot2TaskApplication {
public static void main(String[] args) {
SpringApplication.run(Springbooot2TaskApplication.class, args);
}
}
在然后我们只要在你要执行的任务上使用@Scheduled代表这是一个定时任务
@Component
public class SpringTaskJob {
@Scheduled(cron ="0/1 * * * * ?")
public void task(){
System.out.println(Thread.currentThread().getName()+"韩波hhh");
}
}
同时在注解中定义调度。和Quarze一样需要配置调度。但是这里是不是比Quarze简单许多
到这里我们使用springtask完成一个定时任务已经完成。
这里出现的同时还有我刚刚使用Quarze技术完成的定时任务
好了这里我们springboot三种完成定时任务的方法已经完成