首页 > 技术文章 > spring整合Quartz

lichangyun 2018-02-06 21:56 原文

整合前的概述:与spring整合实质上就是把quartz的内部实现交给spring管理,很好的体现的spring的价值所在。

1.既然要用到spring,必要的步骤就是在web.xml中配置监听器器和加载核心配置文件

 <!-- spring配置文件位置 -->
     <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:applicationContext.xml</param-value>
     </context-param>
     <!-- spring核心监听器 -->
     <listener>
         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>

2.首先在Spring核心配置文件中applicationContext.xml文件中配置三个重要的对象,分别是JobDetailFactoryBean,trigger,Scheduler:将trigger交给大管家

 

  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
       
      <!-- Spring与Quartz的配置 -->
      
      
 <!-- 第一步:配置JobDetail -->
     <bean id="helloJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
         <!-- 注入job的类型 -->
         <property name="jobClass" value="cn.quartz.job.HelloJob" />
     </bean>
     <!-- 第二步:配置trigger :简单任务-->
     <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
         <!-- 注入 JobDetail任务-->
         <property name="jobDetail" ref="helloJobDetail" />
         <!-- 服务启动后第一次执行的间隔时间:毫秒 -->
         <property name="startDelay" value="5000" />
         <!-- 每隔多长时间执行一次 -->
         <property name="repeatInterval" value="2000" />
     </bean>
     <!-- 第三步:配置Scheduler -->
     <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     
     <!-- 注入覆盖默认的jobFactory -->
         <property name="jobFactory" ref="jobFactory"/>    
     
         <property name="triggers">
             <list>
                 <!-- 注入trigger -->
                 <ref bean="simpleTrigger" />
             </list>
         </property>
     </bean>
            
      <!-- 注解扫描 -->
      <context:component-scan base-package="cn"></context:component-scan>
 </beans>

 

3.编写任务对象(执行的任务继承Job),可以在该类里面调用业务层或者dao层

  package cn.quartz.job; 
  import org.quartz.Job;
  import org.quartz.JobExecutionContext;
  import org.quartz.JobExecutionException;
  import org.springframework.beans.factory.annotation.Autowired;
  import cn.service.QuartzService;
  
  public class MyJob implements Job{
     
     @Autowired
     private QuartzService quartzService;
     
     @Override
     public void execute(JobExecutionContext context) throws JobExecutionException {
 
 //        调用业务层或者dao层
         quartzService.say();
     }
 }

4.将上面的任务对象转换为Bean,由Spring来调用

  package cn.service;
  import org.quartz.spi.TriggerFiredBundle;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
  import org.springframework.scheduling.quartz.AdaptableJobFactory;
  import org.springframework.stereotype.Service;
  
  @Service("jobFactory")
 public class JobFactory extends AdaptableJobFactory {
     @Autowired
     //将普通的java对象放入spring容器中变成bean
     private AutowireCapableBeanFactory capableBeanFactory;
 
     @Override
     protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
         // 调用父类的方法:quartz基于配置job类型生产了一个job对象(没有在spring容器中)
         Object jobInstance = super.createJobInstance(bundle);
         // 将Quartz生产出来的job对象,注入到spring容器,该job对象就变成了bean
         capableBeanFactory.autowireBean(jobInstance);
         return jobInstance;
     }
 }

5.需要在配置文件中Scheduler注入 jobFactory 

<!-- 注入覆盖默认的jobFactory -->

<property name="jobFactory" ref="jobFactory"/>

 

 

推荐阅读