一、 SpringBoot实现简单的定时任务
1简单的小demo
a、在springboot的启动类上,加上注解@EnableScheduling
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling 定时的注解
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
}
b、编写测试类
@Component
public class Schedule {
Logger log = LoggerFactory.getLogger(Schedule.class);
//cron表达式:每隔5秒执行一次
@Scheduled(cron = "0/5 * * * * *")
public void scheduled(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh点mm分ss秒");
// 将date日期解析为字符串
String date = simpleDateFormat.format(new Date());
log.info("当前时间:" + date);
}
}
c、运行结果
2、手写corn生成工具类
a、创建CronEntity实体(需要导入Lombok的依赖)
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@EqualsAndHashCode()
public class CronEntity {
/**
* 周期: DAY:每天,WEEK:每周,MONTH:每月
*/
String cycle;
/** 一周的哪几天 */
String[] dayOfWeeks;
/** 一个月的哪几天 */
String[] dayOfMonths;
/** 频次,一天执行多少次 */
Integer frequency;
/** 时 */
Integer hour;
/** 分 */
Integer minute;
}
b、编写工具类 CronUtil
import lombok.extern.slf4j.Slf4j;
/**
* 构建日周月的Cron表达式
*/
@Slf4j
public class CronUtil {
public static String createCronExp(CronEntity cronEntity){
StringBuffer cronExp = new StringBuffer("");
if (cronEntity.getFrequency() == null){
cronEntity.setFrequency(1);
}
if (null != cronEntity.getMinute() && null != cronEntity.getHour()) {
cronExp.append(0).append(" ");
cronExp.append(cronEntity.getMinute()).append(" ");
cronExp.append(cronEntity.getHour()).append(" ");
if(cronEntity.getCycle().equals("DAY")){
cronExp.append("*/").append(cronEntity.getFrequency()).append(" ");
cronExp.append("* ");
cronExp.append("?");
}
else if(cronEntity.getCycle().equals("WEEK")){
cronExp.append("? ");
cronExp.append("* ");
String[] weeks = cronEntity.getDayOfWeeks();
for(int i = 0; i < weeks.length; i++){
if(i == 0){
cronExp.append(weeks[i]);
} else{
cronExp.append(",").append(weeks[i]);
}
}
}
else if(cronEntity.getCycle().equals("MONTH")){
String[] days = cronEntity.getDayOfMonths();
for(int i = 0; i < days.length; i++){
if(i == 0){
cronExp.append(days[i]);
} else{
cronExp.append(",").append(days[i]);
}
}
cronExp.append(" * ");
cronExp.append("?");
}
}else {
cronExp.append("Missing time parameter");
log.info("分钟小时参数未设置");
}
return cronExp.toString();
}
c、测试
//测试
public static void main(String[] args) {
CronEntity cronEntity = new CronEntity();
cronEntity.setCycle("WEEK");
String[] str = {"2","3"};
cronEntity.setDayOfWeeks(str);
cronEntity.setMinute(20);
cronEntity.setHour(12);
String cronExp = createCronExp(cronEntity);
log.info(cronExp); //0 20 12 ? * 2,3 每周二周三的12点20份执行
}
3、常用的Corn表达式
- 每隔5秒执行一次:*/5 * * * * ?
- 每隔1分钟执行一次:0 */1 * * * ?
- 每小时的20分执行一次:0 20 * * * ?
- 每天的两点35分执行一次:0 35 2 * * ?
- 每月的1日的凌晨2点调整任务:0 0 2 1 * ? *
- 每天上午10点,下午2点,4点 执行一次:0 0 10,14,16 * * ?
- 每周星期天凌晨1点实行一次 :0 0 1 ? * L
二、Quartz(更强大)简介:
1,Job 表示一个工作,要执行的具体内容。此接口中只有一个方法
2,JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
3,Trigger 代表一个调度参数的配置,什么时候去调。
4,Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。
a、导入依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
b、编写任务,继承QuartzJobBean
public class CornOfCopyDB extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info(jobExecutionContext.getFireInstanceId());
//执行的任务逻辑...
}
c、绑定JobDetail 和 Trigger并执行任务
@Configuration
public class QuartzConfiguration {
@Value("${corn}")
private String corn;
// 使用jobDetail包装job
@Bean
public JobDetail CornOfCopyDBDetail() {
return JobBuilder.newJob(CornOfCopyDB.class).withIdentity("CornOfCopyDB").storeDurably().build();
}
// 把jobDetail注册到Cron表达式的trigger上去
@Bean
public CronTrigger CornOfCopyDBTrigger() {
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(corn);
return TriggerBuilder.newTrigger()
.forJob(CornOfCopyDBDetail())
.withIdentity("CornOfCopyDBTrigger")
.withSchedule(cronScheduleBuilder)
.build();
}
}
自己实现的自定义开启定时任务:
public class QuartzUtils {
//StdSchedulerFactory工厂
private static StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
public static Scheduler startJob(String name,String cron) throws SchedulerException, ClassNotFoundException {
Class clazz = Class.forName(name);
//封装信息
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("name", name);
//创建jobDetail
JobDetail jobDetail = newJob(clazz)
.usingJobData(jobDataMap)
.build();
//创建cronScheduleBuilder
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
//创建trigger
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity(name)
.withSchedule(cronScheduleBuilder)
.build();
//配置scheduler,绑定任务和触发器
Scheduler scheduler = schedulerFactory.getScheduler();
//绑定任务和触发器
scheduler.scheduleJob(jobDetail, cronTrigger);
return scheduler;
}
}
定时任务精讲请看: