irpas技术客

Springboot中如何使用quartz_Anphjava_quartz springboot

irpas 3899

首先我们导入依赖 1. 使用springboot在导包的时候首先应该想到看看官网是否有spring-boot-starter-* 类似的官方包 2. 其次再看是否有 *-boot-starter 这种第三方包 像quartz这种最常用的调度任务包springboot已经在官网默认集成了例如在官网文档中有如下图链接 有该配置类说明就有quartz的官方starter包 我们直接引入即可(2.1.6) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> 添加配置类 首先spring使用FactoryBean(不要与BeanFactory混淆了)去创建特殊的bean ,在spring中实现了两种与jobDetail有关的FactoryBean,一种JobDetailFactoryBean,一种MethodInvokingJobDetailFactoryBean 这两种的目的其实都是通过工厂创建jobDetail(job的定义类) 首先我们使用MethodInvokingJobDetailFactoryBean去集成quartz 第一步:定义quartz配置类 @Configuration public class QuartzConfig { } 第二步:在配置类中添加bean /** * 定义job * * @return */ @Bean public MethodInvokingJobDetailFactoryBean ctsJobDetail(Job job) { MethodInvokingJobDetailFactoryBean factoryBean = new MethodInvokingJobDetailFactoryBean(); factoryBean.setGroup("job"); factoryBean.setName("run"); //定义job类中的方法名 factoryBean.setTargetObject(job); //目标类也就是要执行job的类 factoryBean.setTargetMethod("exec"); factoryBean.setConcurrent(false); return factoryBean; } 第三步: 定义一个普通类 @Component public class Job { public void run() { System.out.println("我是job"); } } 在quartz配置类定义Trigger(与上面类似spring中也定义了两种Trigger的FactoryBean)(我们使用CronTriggerFactoryBean ) @Bean("ctsTriggerFactoryBean") public CronTriggerFactoryBean ctsTriggerFactoryBean(MethodInvokingJobDetailFactoryBean ctsJobDetail) { CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); cronTriggerFactoryBean.setName("ctsTrigger"); cronTriggerFactoryBean.setJobDetail(ctsJobDetail.getObject()); cronTriggerFactoryBean.setCronExpression("0 0/1 * * * ? "); return cronTriggerFactoryBean; }

按理来说我们还应该定义SchedulerFactoryBean调度器,但是springboot自动配置已经配置了默认调度器(所以我们无需配置) 这样我们就可以直接运行启动应用进行调度任务执行

但是使用MethodInvokingJobDetailFactoryBean虽然简单但是在使用quart jdbc模式时候会报无法序列化问题

因此我们使用第二种JobDetailFactoryBean

第一步定义JobDetailFactoryBean

@Bean(name = "jobDetail1") public JobDetailFactoryBean jobDetail1(){ JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean(); jobDetailFactoryBean.setJobClass(Job.class); jobDetailFactoryBean.setDurability(true); jobDetailFactoryBean.setName("job1"); jobDetailFactoryBean.setGroup("job1"); return jobDetailFactoryBean; } 第二步: 定义job类(必须继承QuartzJobBean) @DisallowConcurrentExecution //不开启并发 public class FillUpPhysicalStrengthHandler extends QuartzJobBean{ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("1"); } } 第三步:定义Trigger(与上边类似) @Bean(name = "cronTriggerFactoryBean1") public CronTriggerFactoryBean cronTriggerFactoryBean1 (@Qualifier(value = "jobDetail1") JobDetailFactoryBean jobDetail1) { CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); cronTriggerFactoryBean.setJobDetail(jobDetail1.getObject()); cronTriggerFactoryBean.setCronExpression("0 0/1 * * * ? "); return cronTriggerFactoryBean; } 第四步: 配置application spring: quartz: job-store-type: jdbc #使用数据库存储定时任务 jdbc: initialize-schema: always overwrite-existing-jobs: true #每次重启覆盖原有jobs 第五步 : 执行数据库脚本 导入quartz需要的表,在\org\quartz-scheduler\quartz\2.3.1\quartz-2.3.1.jar!\org\quartz\impl\jdbcjobstore 下有各种sql脚本按自己数据库导入即可。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Quartz #springboot #首先我们导入依赖 #1 #类似的官方包 #2