springboot+quartz 多任务-01

2017-12-12  本文已影响0人  愤怒的奶牛

一: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>

注意:同样的配置可以转换为java config 的形式。同样可以实现多任务。

上一篇下一篇

猜你喜欢

热点阅读