一:spring boot 整合 quartz 可以有两种形式:javaConfig 和 xml。使用哪种 方式看项目需求。这里采用xml ,源码:https://github.com/yoxiyoxiiii/springbootQuartzDemo.git
1:pom.xml 配置:(排除springboot 的基本配置,springboot 也有 和 quartz 整合的启动依赖,可以参看 github 上 springboot 的 spring-boot-samples:
https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples)
quartz 的pom:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<!--spring 对quartz 的支持:可以理解为 整合quartz 需要的jar-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<!--事务的支持
quartz 会依赖
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<!-- lombok 插件依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
启动类 App.java
/**
* Hello world!
* 使用 xml 的方式来配置 quartz 的job
* @ImportResource(locations = "classpath:quartz-spring.xml") 加载 配置文件
在resources 下创建 quartz-spring.xml
*/
@SpringBootApplication
@ImportResource(locations = "classpath:quartz-spring.xml")
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
定义jobFactory 使在quartz 中注入bean
/**
* 使 容器中的bean 可以注入在 quartz 框架中。
*/
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
自定义job、job2
---job1:
@Slf4j
public class TestJob {
public void job() {
log.info("TestJob.job {}" ,"run ..");
}
}
------------
job2:
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TestJob2 {
public void job2() {
log.info("TestJob2 job2 {}", "run ....");
}
}
将自定义的job 配置到 quartz 需要以下几个步骤:
1:将 自定义的 job 和配置 到 jobDetail 中,jobDetail 是quartz 中对job的基本描述。
2:配置 触发器(定时器Trigger)并将定时器和 jobDetail 关联。
3:将触发器配置到 调度器中(scheduler)。
下面开始配置:在quartz-spring.xml 中配置
1:配置job(job2 同样的配置方法)
<!--自定义job 由spring 管理-->
<bean id="testJob" class="com.swust.quartz.TestJob"/>
<bean id ="jobDetail-testJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--配置 quartz 需要执行的job 对应的类-->
<property name="targetObject" ref="testJob"/>
<!--具体的job 方法
也就是说 quartz 框架执行的是 自定义的 com.swust.quartz.TestJob 中的 job() 方法。
-->
<property name="targetMethod" value="job"/>
</bean>
2:配置触发器
<!--配置定时器(触发器)
给每个Job都绑定一个触发器,一个job 可以有多个触发器
-->
<bean id="cronTrigger-testJob" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!--定时器 绑定 任务-->
<property name="jobDetail" ref="jobDetail-testJob"/>
<!--每5s 执行一次-->
<property name="cronExpression">
<value>*/5 * * * * ?</value>
</property>
</bean>
3:配置 scheduler 任务调度器
<!--配置调度器
autowire="no" 关闭自动注入,防止依赖破坏
lazy-init="false" 关闭懒加载,即应用启动开始执行任务。
-->
<bean id="scheduler" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory"/>
<!--在 调度器中 配置 需要执行job 的触发器
可以多个 ,所以可以实现多任务。
-->
<property name="triggers">
<list>
<ref bean="cronTrigger-testJob"/>
<ref bean="cronTrigger-testJob2"/>
</list>
</property>
</bean>
网友评论