美文网首页
springboot+quartz 多任务-01

springboot+quartz 多任务-01

作者: 愤怒的奶牛 | 来源:发表于2017-12-12 15:50 被阅读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 的形式。同样可以实现多任务。

    相关文章

      网友评论

          本文标题:springboot+quartz 多任务-01

          本文链接:https://www.haomeiwen.com/subject/pmknixtx.html