定时任务
在项目中存在一种操作,这个操作需要在未来的某一天开始执行,不需要人定时到时候再去写,而是提前写好定时进行执行
在java项目中提供有对应的API,下面就是java中原始的操作
public class shijian {public static void main(String[] args) {//创建一个定时对象Timer timer=new Timer();//创建一个任务对象,通过重写抽象方法run,在其中定义任务操作TimerTask task=new TimerTask() {@Overridepublic void run() {System.out.println("定时任务的执行");}};//通过方法完成定时任务操作,第一个参数是任务对象,第二个是起始时间,第三个参数是需要等待周期的时间timer.schedule(task,0,2000);}
}
但是由于提供的API太过于简单,现在市场上推出了流行的定时任务技术:Quartz
Quartz相关概念:
工作(job):用于定义具体执行的工作
工作明细(jobdetil):用于描述定时工作相关的信息
触发器(Trigger):用于描述触发工作的规则,通常使用cron表达式定义调度规则
调度器(Scheduler):描述了工作明细与触发器的关系
首先导入依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
然后写一个继承自QuartzJobBean的工作类,其中可以定义工作操作:
public class testquartz extends QuartzJobBean {@Overrideprotected void executeInternal(org.quartz.JobExecutionContext context) throws JobExecutionException {System.out.println("开始执行");}
}
其中的参数JobExecutionContext context是一个工作的上下文对象,通过这个对象可以获取工作时的一些信息
触发器需要绑定工作明细,工作明细中指定工作,在控制类中进行两者的绑定:
@Configuration
public class Quartztest {@Bean//返回类型时工作明细接口,此处绑定工作public JobDetail bangding(){//JobBuilder建立一个工作明细,参数是工作对应的类名.storeDurably()是判断如果长期不使用该方法,是否持久化return JobBuilder.newJob(testquartz.class).storeDurably().build();}@Bean//返回类型触发器,此处绑定工作明细public Trigger mingxi(){//通过Cron表达式描述任务时间并创建调度器对象,000表示秒,分钟,小时 000表示日,月,星期,但是星期一般是?意思是根据前方进行匹配ScheduleBuilder<? extends Trigger> schedBuilder=CronScheduleBuilder.cronSchedule("0 0 0 0 0 0");//通过触发器构造类创建一个触发器,绑定工作明细,并配置调度器对象return TriggerBuilder.newTrigger().forJob(bangding()).withSchedule(schedBuilder).build();}
}
Spring Task
通过注解完成上述繁杂的内容
首先通过注解开启定时任务功能:
@SpringBootApplication
@EnableScheduling
public class springboot22TaskApplication{public static void main(String[] args){}
}
然后再在所需要的方法上面添加注解 @Scheduled
@Component
public class ScheduledBean{@Scheduled(cron="0/5 * * * * ?")public void printLog(){System.out.println(Thread.currentThread().getName()+"run..")}
}
同时在spring可以对task进行一定的配置:
spring:task:scheduling:#任务调度线程池大小pool:size: 1# 调度线程名称前缀thread-name-prefix: ssm_shutdown:#线程池关闭时等待所有任务完成await-termination: false# 调度线程关闭前最大的等待时间,确保最后一定关闭await-termination: 10s