在Spring Boot 中要实现定时任务,有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用Quartz。
1.Scheduled 这种用法非常简单,涉及到的业务非常简单是可以使用该用法。
2. Quartz
quartz的核心类有以下三个需要牢记:
调度器:Scheduler
触发器:Trigger
作业类:JobDetail
该图片用了 DistressRroke _chen的文章中的图片
文章中讲的也很清楚,这里就不做搬运工了。
贴了几张图片,其实关键的代码见下面这部分:
/** * 定时任务框架Quartz的基本组成部分: * 调度器:Scheduler * 任务:JobDetail * 触发器:Trigger,包括SimpleTrigger和CronTrigger * * Scheduler * - - * - - * - - * - - * JobDetail Trigger * * 该部分代码主要完成两个事情: 在QuartzConfig 中配置 JobBean 和 Trigger * 1. 配置 JOb: * 两种方式: * 第一种方式使用 MethodInvokingJobDetailFactoryBean可以配置目标 Bean 的名字和目标方法的名字,这种方式不支持传参 * 第二种方式使用 JobDetailFactoryBean 构造出来的 JobBean ,任务类继承自 QuartzJobBean ,这种方式支持传参,将参数封装在JobDataMap中进行传递 * 2. 配置触发器 Trigger * * @author Administrator * @Description: * @Auther: liangsh * @Date: 2020/5/28 17:47 */ @Configuration public class QuartzConfig { /** * * @return */ @Bean MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() { MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean(); // 首字母小写,对应Myjob0这个类 bean.setTargetBeanName("myJob0"); // 对应Myjob0这个类里的hello()方法 bean.setTargetMethod("hello"); return bean; } @Bean SimpleTriggerFactoryBean simpleTriggerFactoryBean() { SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean(); //重复次数 bean.setRepeatCount(5); //重复间隔2秒 bean.setRepeatInterval(2000); bean.setStartTime(new Date()); bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject()); return bean; } /** * jobDetail * @return */ @Bean JobDetailFactoryBean jobDetailFactoryBean1() { JobDetailFactoryBean bean = new JobDetailFactoryBean(); bean.setJobClass(MyJob1.class); //可以不传递参数 // JobDataMap data = new JobDataMap(); // data.put("helloService", helloService()); // bean.setJobDataMap(data); return bean; } /** *JobDetail绑定指定的Job,每次Scheduler调度执行一个Job的时候,首先会拿到对应的Job,然后创建该Job实例, * 再去执行Job中的execute()的内容,任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。 * @return */ @Bean JobDetailFactoryBean jobDetailFactoryBean2() { JobDetailFactoryBean bean = new JobDetailFactoryBean(); bean.setJobClass(MyJob2.class); JobDataMap data = new JobDataMap(); // 使用JobDataMap 传递参数 data.put("helloService", helloService()); bean.setJobDataMap(data); return bean; } /** * CroTrigger是基于Cron表达式的,可以灵活设置定时器执行 * @return */ @Bean CronTriggerFactoryBean cronTriggerFactoryBean2() { CronTriggerFactoryBean bean = new CronTriggerFactoryBean(); // 每20秒触发 bean.setCronExpression("0/20 * * * * ?"); bean.setJobDetail(jobDetailFactoryBean2().getObject()); return bean; } /** * 触发器 * @return */ @Bean CronTriggerFactoryBean cronTriggerFactoryBean1() { CronTriggerFactoryBean bean = new CronTriggerFactoryBean(); // 每5秒触发 bean.setCronExpression("0/5 * * * * ?"); bean.setJobDetail(jobDetailFactoryBean1().getObject()); return bean; } /** * SchedulerFactoryBean为调度器 * @return */ @Bean SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean bean = new SchedulerFactoryBean(); // 添加Trigger,多个 Trigger 可以用逗号分隔 bean.setTriggers(simpleTriggerFactoryBean().getObject(), cronTriggerFactoryBean2().getObject()); //bean.setTriggers(cronTriggerFactoryBean1().getObject(), cronTriggerFactoryBean2().getObject()); return bean; } @Bean HelloService helloService() { return new HelloService(); } }
关键的关键还是要自己敲代码,光看不写,理解的还是不深刻,是懂非懂的。 该文章没有几个字,全部靠图片和代码来凑了。
需要注意的地方:
***************************
APPLICATION FAILED TO START
***************************
Description:
A component required a bean named 'MyJob0' that could not be found.
Action:Consider defining a bean named 'MyJob0' in your configuration.
Process finished with exit code 0
应用程序启动,说是 MyJob0 这个bean没有找到,但是之前明明用@Component注册过MyJob0 这个类。
解决办法:
方法一:给@Component注解加入value=“MyJob0 ”属性,这样就不怕找不到了
方法二:把QuartzConfig里的bean.setTargetBeanName()里的Bean名称首字母换成小写就好了。
运行结果如下:
_江南一点雨 的文章写得非常好,但是一定要自己写代码跑一跑。https://blog.csdn.net/u012702547/article/details/102748267?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159062802619724848342011%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159062802619724848342011&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_default-2-102748267.pc_v2_rank_blog_default&utm_term=quartz