一、前言
最近,因项目需求在需实现定时器功能,在网上参考各种博客,或多或少都存在些许问题,于是我决定发表这篇博客,一方面将我的经验分享给大家,另一方面也方便日后温习,若文中有不足之处望大家多担待多指教。
二、创建spring boot项目
创建spring boot项目(spring boot项目创建过程这里就不详细介绍),添加quartz的maven依赖:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
三、编写任务类:
package com.yqjr.nmps.rest;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
/**
*@ClassName:QuartzRest
*@Description:
*@Author:sufengwu
*@Date:2018/11/28 11:53
**/
@Configuration
@Component
@EnableScheduling
public class QuartzRest {
public void sayHello() {
System.out.println("Hello world");
}
}
四、Quartz配置类
package com.yqjr.nmps.common.util;
import com.yqjr.nmps.rest.QuartzRest;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration
public class SchedledConfiguration {
/**
* attention:
* Details:配置定时任务
*/
@Bean(name = "detailFactoryBean")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(QuartzRest task) {// ScheduleTask为需要执行的任务
MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
/*
* 是否并发执行
* 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
* 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
*/
bean.setConcurrent(false);
/*
* 为需要执行的实体类对应的对象
*/
bean.setTargetObject(task);
/*
* sayHello为需要执行的方法
* 通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的sayHello方法
*/
bean.setTargetMethod("sayHello");
System.out.println("detailFactoryBean");
return bean;
}
/**
* attention:
* Details:配置定时任务的触发器,也就是什么时候触发执行定时任务
*/
@Bean(name = "jobTrigger")
public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean detailFactoryBean) {
CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
tigger.setJobDetail(detailFactoryBean.getObject());
tigger.setCronExpression("0 30 20 * * ?");// 初始时的cron表达式
System.out.println("cronJobTrigger");
return tigger;
}
/**
* attention:
* Details:定义quartz调度工厂
*/
@Bean(name="scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
bean.setOverwriteExistingJobs(true);
// 延时启动,应用启动1秒后
bean.setStartupDelay(1);
// 注册触发器
bean.setTriggers(cronJobTrigger);
System.out.println("schedulerFactory");
return bean;
}
}
五、定时方法:
package com.yqjr.nmps.rest;/**
* @ClassName:ScheduleRefreshDatabase
* @Description:
* @Author:sufengwu
* @Date:2018/11/28 15:33
*/
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
*@ClassName:ScheduleRefreshDatabase
*@Description:
*@Author:sufengwu
*@Date:2018/11/28 15:33
**/
@Configuration
@EnableScheduling
@Component
public class ScheduleRefresh {
@Resource(name = "detailFactoryBean")
private JobDetail jobDetail;
@Resource(name = "jobTrigger")
private CronTrigger cronTrigger;
@Resource(name = "scheduler")
private Scheduler scheduler;
@Scheduled(fixedRate = 1000*60)
public void scheduleUpdateCronTrigger() throws SchedulerException {
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(cronTrigger.getKey());
String currentCron = trigger.getCronExpression(); // 当前Trigger使用的
}
}
这样一个简单的定时器功能就完成了。
参考文章:https://blog.csdn.net/liuchuanhong1/article/details/60873295