项目经常会用到定时任务,springboot自然是可以通过整合相关组件来实现的。
目前常用的定时任务的实现有两种:
通过spring 自带的定时器任务@Schedule来实现
通过Quartz来实现
本次借用上一篇《spring boot 整合Mybatis》的既有项目结构进行案例调试。
无论上面说的哪种实现方式,都需要用到cron表达式,因此不得不先介绍下它。
Cron表达式是一个字符串,由6或7个域组成,每个域有不同的含义,每个域之间用空格隔开。有2中格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year (7个域)
Seconds Minutes Hours DayofMonth Month DayofWeek (6个域)
每个域可能出现的值:
除了以上内容外,还可能出现一些特殊字符:
举例:
以上看上去有点复杂,不过不用担心,记住常用的就行了。另外,现在网上还有 在线Cron表达式生成器可以帮助我们设定确定相关表达式内容。
2. 代码实现
a、新建类JdkSchedule
里面的userService为上一次添加的内容
b、启动类添加注解,启动定时任务
3. 测试效果
每隔两秒打印一次:
Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间。它包括调度器、触发器、作业。
组成 | 描述 |
Job--任务 | 做什么事? |
Trigger--触发器 | 什么时候做? |
Scheduler--调度器 | 什么时候需要去做什么事情? |
a、引入依赖
b、创建job类
publicclass MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("...quartz job 触发执行..."); } }
需要实现Quartz的Job接口
c、编写测试类:
/** * quartz原生态用法 */publicclass JobTestMain { public static void main(String[] args) throws SchedulerException { //1.创建job JobDetail job = JobBuilder.newJob(MyJob.class).build(); //2.创建trigger CronTrigger trigger = TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ?")) .build(); //3.创建schedule Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(job, trigger); scheduler.start(); } }
d、执行测试类JobTestMain:
每三秒打印一次:
a、引入依赖
<!--添加schedule依赖--><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId></dependency><!--引入quartz依赖--><dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId></dependency><!--引入spring tx依赖--><dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId></dependency>
springboot整合的时候,需要添加这三个依赖。
编写配置类
/** * springboot整合quartz使用方法 */@Configurationpublicclass QuartzConfig { /** * 创建job对象 * @return */ @Bean public JobDetailFactoryBean jobDetailFactoryBean() { JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean(); jobDetailFactoryBean.setJobClass(MyJob.class); return jobDetailFactoryBean; } /** * 创建trigger对象 - cron表达式对象 * @param jobDetailFactoryBean * @return */ @Bean public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){ CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); cronTriggerFactoryBean.setCronExpression("0/5 * * * * ?"); // 关联JobDetail对象 cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject()); return cronTriggerFactoryBean; } /** * 创建trigger对象 - 一般对象 * @param jobDetailFactoryBean * @return */ @Bean public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) { SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean(); // 关联JobDetail对象 simpleTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject()); // 设置重复次数,这里配置的是重复次数,而不是总次数;总次数=重复次数+1,也就是说这里配置的次数是:执行完一次之后,再重复执行的次数 simpleTriggerFactoryBean.setRepeatCount(1); // 设置间隔时间 simpleTriggerFactoryBean.setRepeatInterval(2000); return simpleTriggerFactoryBean; } /** * 创建schedule对象 * @param triggerFactoryBean * @return */ @Bean public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean triggerFactoryBean){ SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setTriggers(triggerFactoryBean.getObject()); return schedulerFactoryBean; } }
这里需要注意下,schedulerFactoryBean()方法中传入的参数如果是CronTriggerFactoryBean,则执行的是cronTriggerFactoryBean()对应的设置;参数如果是SimpleTriggerFactoryBean,则执行的是simpleTriggerFactoryBean()对应的设置。
启动类添加注解
测试效果
每5秒钟执行一次:
如果前面的@Schedule和这里的Quartz的定时任务放在一起了,则执行效果为两个Job一起执行:
...quartz job 触发执行... User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **触发JDK 定时器*** User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **触发JDK 定时器*** User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **触发JDK 定时器*** ...quartz job 触发执行... User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **触发JDK 定时器*** User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **触发JDK 定时器*** User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} ...quartz job 触发执行...
以上即为本文全部内容。
来源:
https://www.toutiao.com/a7005166040321753614/?log_from=9c33004fc8254_1631498345246
“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com
IT大咖说 | 关于版权
由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!
感谢您对IT大咖说的热心支持!