任务调度
任务系统,其实这里说的任务系统指的是定时任务。定时任务是企业级开发中必不可少的组成部分,在生活中,我们经常会制定一些”计划任务”,比如学校的上课和下课铃声等,即在某个时间点做某件事情.同样地,在企业级应用中,也会经常碰到类似的任务调度的需求。
下面来看几个例子.在购物网站,每天凌晨统计商品排名,每天晚上定点统计当日的销量,销售额,盈利等信息并生成报表,每15分钟查询用户的新订单并推送给对应的处理人.在社区网站,每天统计用户的在线时长,并按照某种规则给予一定的称号和奖励等.在后台服务中做系统维护,每个工作日的固定时间将数据进行备份.可见企业应用中离不开灵活的任务调度.
定时任务的实现方式
(1) Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务,使用这种方式可以让你的程序按照某一个频率执行,但不能再指定时间运行,一般用的比较少.
(2) 使用Quertz,这是一个功能比较强大的调度器,可以让你的程序在指定的时间执行,也可以按照某一个频率执行,但是配置起来比较复杂.
(3) Spring3.0以后自带的task,可以将它看着一个轻量级的Quartz,而且使用起来比Quartz简单许多.我们可以使用的就是该方式进行定时任务的调度.
Quartz的使用方式
先了解一下Quartz的一些概念
- 工作(Job):用于定义具体执行的工作
- 工作明细(JobDetail):用于描述定时工作相关的信息
- 触发器(Trigger):描述了工作明细与调度器的对应关系
- 调度器(Scheduler):用于描述触发工作的执行规则,通常使用cron表达式定义规则
简单说就是你定时干什么事情,这就是工作,工作不可能就是一个简单的方法,还要设置一些明细信息。工作啥时候执行,设置一个调度器,可以简单理解成设置一个工作执行的时间。工作和调度都是独立定义的,它们两个怎么配合到一起呢?用触发器。
下面开始springboot整合Quartz。
步骤①:导入springboot整合Quartz的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
步骤②:定义任务Bean,按照Quartz的开发规范制作,继承QuartzJobBean
public class MyQuartz extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("quartz task run...");
}
}
步骤③:创建Quartz配置类,定义工作明细(JobDetail)与触发器的(Trigger)bean
@Configuration
public class QuartzConfig {
@Bean
public JobDetail printJobDetail(){
//绑定具体的工作
return JobBuilder.newJob(MyQuartz.class).storeDurably().build();
}
@Bean
public Trigger printJobTrigger(){
ScheduleBuilder schedBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
//绑定对应的工作明细
return TriggerBuilder.newTrigger().forJob(printJobDetail()).withSchedule(schedBuilder).build();
}
}
工作明细中要设置对应的具体工作,使用newJob()操作传入对应的工作任务类型即可。
触发器需要绑定任务,使用forJob()操作传入绑定的工作明细对象。此处可以为工作明细设置名称然后使用名称绑定,也可以直接调用对应方法绑定。触发器中最核心的规则是执行时间,此处使用调度器定义执行时间,执行时间描述方式使用的是cron表达式。
cron在线表达式生成器:http://cron.ciding.cc/
Task的使用方式
基于Quartz,我们本来只想完成在某一个时间来触发某一个功能,却要做一些复杂的配置。
spring针对上述问题进行了简化,开发了自己的任务管理组件——Task
Task:要做定时任务总要告诉容器有这功能吧,然后定时执行什么任务直接告诉对应的bean什么时间执行就行了,就这么简单,一起来看怎么做
步骤①:开启定时任务功能,在引导类上开启定时任务功能的开关,使用注解@EnableScheduling
@SpringBootApplication
//开启定时任务功能
@EnableScheduling
public class SpringbootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTaskApplication.class, args);
}
}
步骤②:定义Bean,在对应要定时执行的操作上方,使用注解@Scheduled定义执行的时间,执行时间的描述方式还是cron表达式
@Component
public class MyTask {
//需要执行的任务 每十秒钟执行一次
//@Scheduled 定义定时任务的信息
// 属性 cron表达式:定义执行的时间
@Scheduled(cron="0/10 * * * * ?")
public void tesk1(){
System.out.println("tesk1.....["+new Date()+"]");
}
}
总结: