springboot添加定时任务
搬砖中学习使用定时任务定时执行一些业务逻辑
一、@Scheduled注解
1、启动类添加@EnableScheduling
2、@Component添加至任务类,开启定时任务
3、@Scheduled添加至方法上,添加定时任务
可以指定cron、fixedRate、fixedDelay、initialDelay等属性。
过程:
(1)拦截“@Scheduled”注解的方法,并解析相应的的注解参数,放入“定时任务列表”等待后续处理;之后在“定时任务列表”中统一执行相应的定时任务(任务为顺序执行,先执行cron,之后再执行fixedRate)
(2)获取scheduled类参数,之后根据参数类型、相应的延时时间、对应的时区,将对应类型的定时器放入相应的“定时任务列表”中。
(3)定时任务先执行corn,判断定时任务的执行时间,计算出相应的下次执行时间,放入线程中,到相应的时间后进行执行。之后执行按“频率”(fixedRate)执行的定时任务,直到所有任务执行结束。
@Scheduled的一个缺点是定时时间不能动态更改,它适用于具有固定任务周期的任务,若要修改任务执行周期,实现SchedulingConfigurer接口,重写configureTasks方法。
参考:https://cloud.tencent.com/developer/article/1507776
二、使用quartz
Quartz是一个轻量级任务调度框架(库):
- Scheduler - 用于与调度程序交互的主程序接口,调度程序。
- Job - 预先定义的能被调度程序执行的任务类,实现org.quartz.Job接口。
- JobDetail - 使用JobDetail来定义定时任务的实例。
- Trigger - 触发器,表明任务在什么时候会执行。
- JobBuilder -用于声明一个任务实例,也可以定义关于该任务的详情比如任务名、组名等,这个声明的实例将会作为一个实际执行的任务。
- TriggerBuilder - 触发器创建器,用于创建触发器trigger实例。
- JobDataMap-初始化定义信息,key-value形式。
引入依赖
启动类调用如下方法开启调度:
private void buildSchedule() {
try {
String cronParam = "0/1 * * * * ?";
//基于Quartz属性文件创建Quartz Scheduler 调度程序
StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
Properties prop = new Properties();
//配置属性
prop.setProperty("org.quartz.scheduler.instanceName", "taskSchduler");
prop.setProperty("org.quartz.threadPool.threadCount", "1");
prop.put("org.quartz.scheduler.instanceId", "AUTO");
prop.put("org.quartz.scheduler.rmi.export", "false");
prop.put("org.quartz.scheduler.rmi.proxy", "false");
prop.put("org.quartz.scheduler.wrapJobExecutionInUserTransaction", "false");
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount", "3");
prop.put("org.quartz.threadPool.threadPriority", "5");
prop.put("org.quartz.jobStore.class", "org.quartz.simpl.RAMJobStore");
schedulerFactory.initialize(prop);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("userManagerService", userService);
JobDetail job = newJob(Task.class)
.withDescription("定时task")
.withIdentity("job" , "group")
.setJobData(jobDataMap)
.build();
Trigger trigger = newTrigger().withIdentity("trigger", "group")
.withSchedule(CronScheduleBuilder.cronSchedule(cronParam))
// .withSchedule(SimpleScheduleBuilder.simpleSchedule()
// .withIntervalInSeconds(1)//每隔1s执行一次
.build();
Scheduler scheduler = schedulerFactory.getScheduler();
// 使用定义的触发器trigger安排执行任务job
scheduler.scheduleJob(job, trigger);
//启动任务调度程序
scheduler.start();
}catch(SchedulerException e){
e.printStackTrace();
}
}
/**
* 具体任务,实现job接口
*/
public class Task implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
IUserManagerService userService = (IUserManagerService)jobDataMap.get("userManagerService");
System.out.println("执行job!! 用户:"+userService.getUserById("077ddaa6f1e94731ba1dce3825efe732").getUserName());
}
}
参考:https://blog.csdn.net/zixiao217/article/details/53053598