在application中添加定时器注解@EnableScheduling
@SpringBootApplication @EnableScheduling @MapperScan(basePackages ="touxian_ssm.ssm.Service.**") public class SsmApplication { public static void main(String[] args) { SpringApplication.run(SsmApplication.class, args); } }创建一个MydataPlan 代码如下
package touxian_ssm.ssm.Crontab; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Date; /** * @author 偷闲 * @date 2019/5/17 10:21 */ @Component public class MydataPlan { //fixedRate是两次执行任务之间的时间间隔 @Scheduled(fixedRate = 2000) public void fixedRate(){ System.out.println("1*"+new Date()); } //fixedDelay表示任务执行之间的时间间隔,具体是指本次任务结束到下次任务开始之前的时间间隔 @Scheduled(fixedDelay = 2000) public void fixedDelay(){ System.out.println("2*"+new Date()); } //initialDelay表示首次任务启动的延迟时间 @Scheduled(initialDelay = 2000,fixedDelay = 2000) public void initialDelay(){ System.out.println("3*"+new Date()); } }但是这种写法只能是过一段时间执行一遍,没法在指定的时间内进行,所有需要使用Cron表达式 cron的参数设置 例子:
//表示每隔五秒钟执行一次 @Scheduled(cron = "0/5 * * * * *") public void sch2(){ System.out.println("11111"); }一些常用的Corn表达式
“0 0 10,14,16 * * ?” 每天上午10点,下午2点,4点 “0 0/30 9-17 * * ?” 朝九晚五工作时间内每半小时 “0 0 12 ? * WED” 表示每个星期三中午12点 “0 0 12 * * ?” 每天中午12点触发 “0 15 10 ? * *” 每天上午10:15触发 “0 15 10 * * ?” 每天上午10:15触发 “0 15 10 * * ? " 每天上午10:15触发 “0 15 10 * * ? 2005” 2005年的每天上午10:15触发 “0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发 “0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发 “0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 “0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发 “0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发 “0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发 “0 15 10 15 * ?” 每月15日上午10:15触发 “0 15 10 L * ?” 每月最后一日的上午10:15触发 “0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发 “0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发 “0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发 "/5 * * * * ?” 每隔5秒执行一次 “0 */1 * * * ?” 每隔1分钟执行一次 “0 0 23 * * ?” 每天23点执行一次 “0 0 1 * * ?” 每天凌晨1点执行一次 “0 0 1 1 * ?” 每月1号凌晨1点执行一次 “0 0 23 L * ?” 每月最后一天23点执行一次 “0 0 1 ? * L” 每周星期天凌晨1点实行一次 “0 26,29,33 * * * ?” 在26分、29分、33分执行一次 “0 0 0,13,18,21 * * ?” 每天的0点、13点、18点、21点都执行一次corn表达式在线生成网站 http://cron.qqe2.com
Quartz在使用过程中,主要有两个关键点 一个是Job(要做的事情) 另一个是触发器 在springboot中使用Quartz需要加入Quartz依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>使用Quartz统一需要在application中开启定时任务注解
@SpringBootApplication @EnableScheduling @MapperScan(basePackages ="touxian_ssm.ssm.Service.**") public class SsmApplication { public static void main(String[] args) { SpringApplication.run(SsmApplication.class, args); } }Job有两种定义方式 首先创建job
在job1中定义
package touxian_ssm.ssm.Quartz.Job; import org.springframework.stereotype.Component; /** * @author 偷闲 * @date 2019/5/24 14:15 */ @Component public class Job1 { public String Job1(){ return "Job1创建成果"; } }这种定义方式最大的问题是,无法传入参数 如果你的定时任务不需要传入参数,可以用这种,比较方便
这种方式可以传参数 在job2中定义
public class Job2 extends QuartzJobBean { QuartzService quartzService; public QuartzService getQuartzService() { return quartzService; } public void setQuartzService(QuartzService quartzService) { this.quartzService = quartzService; } @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("错误开始"+new Date()); quartzService.alltype(); } }创建一个QuartzService
public class QuartzService { @Autowired BookService book_typeservice; public void alltype(){ System.out.println("正在查询***************"+new Date()); //查询当前表的数据 List<Book_type> alltype= book_typeservice.findall(); System.out.println(alltype.toString()); } }创建一个QuartzConfig
/** * 在QuartzConfig中配置JobBean和Trigger * JobBean的配置分为两种 * 1 MethodInvokingJobDetailFactoryBean 这种方式不支持传参,所以一般使用在自定义Bean定时任务的时候 * 2. JobDetailFactoryBean 这种方式支持传参可以将参数封装在JobDataMap中进行传递 * Trigger的配置也分为两种 * 1.SimpleTriggerFactoryBean 普通触发器 * 2.CronTriggerFactoryBean Cron表达式触发器 * 配置SchedulerFactoryBean初始化 */ @Configuration public class QuartzConfig { @Bean MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){ MethodInvokingJobDetailFactoryBean bean =new MethodInvokingJobDetailFactoryBean(); //选择目标job名称 bean.setTargetBeanName("job1"); //选择目标方法的名字 bean.setTargetMethod("job1"); return bean; } @Bean JobDetailFactoryBean jobDetailFactoryBean(){ JobDetailFactoryBean bean=new JobDetailFactoryBean(); bean.setJobClass(Job2.class); JobDataMap map=new JobDataMap(); map.put("quartzService",quartzService()); bean.setJobDataMap(map); return bean; } @Bean QuartzService quartzService(){ return new QuartzService(); } //普通触发器 @Bean SimpleTriggerFactoryBean simpleTriggerFactoryBean(){ SimpleTriggerFactoryBean bean=new SimpleTriggerFactoryBean(); //开始时间 bean.setStartTime(new Date()); //重复次数-1位无限循环 bean.setRepeatCount(5); //绑定一个job bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject()); //时间间隔单位为毫秒 bean.setRepeatInterval(3000); return bean; }; //cron表达式触发器 @Bean CronTriggerFactoryBean cronTrigger(){ CronTriggerFactoryBean bean=new CronTriggerFactoryBean(); bean.setCronExpression("0/10 * * * * ?"); bean.setJobDetail(jobDetailFactoryBean().getObject()); return bean; } @Bean SchedulerFactoryBean schedulerFactoryBean(){ SchedulerFactoryBean bean=new SchedulerFactoryBean(); bean.setTriggers(simpleTriggerFactoryBean().getObject(),cronTrigger().getObject()); return bean; } }启动项目
错误开始Mon May 27 10:03:10 CST 2019 正在查询***************Mon May 27 10:03:10 CST 2019 [Book_type{id=1, type_name='测试分类1', sort=1, remark='评论'}, Book_type{id=2, type_name='测试分类2', sort=2, remark='类型'}, Book_type{id=3, type_name='测试分类3', sort=3, remark='分类'}, Book_type{id=4, type_name='测试分类4', sort=4, remark='分类'}, Book_type{id=5, type_name='测试分类5', sort=5, remark='分类'}] Job1创建成果Mon May 27 10:03:12 CST 2019