上一篇: Quartz定时调度

使用xml配置文件加载quartz

在上节介绍中并没有用到任何的配置文件,而在我们项目工程中常使用xml来加载。Quartz支持配置文件,它的好处是比编写代码简单,且修改后不需要重新编译源码

  • 配置quartz.properties文件

该文件来配置quartz的各种属性,包括线程数,线程优先级,加载的job文件,扫描的时间间隔等一系列属性

新建quartz.properties在项目的classpath下,加载必要的jar包

项目代码:

#============================================================================  
# Configure Main Scheduler Properties  
#============================================================================

# 实例名
org.quartz.scheduler.instanceName = QuartzScheduler 
# 实例ID
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool  
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 线程个数
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#============================================================================
# Configure Plugins 
#============================================================================
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
# org.quartz.plugins.xml.JobInitializationPlugin是Quartz自带的插件,
# 默认时,这个插件会在 classpath 中搜索名为 quartz_jobs.xml 
# 的文件并从中加载 Job 和 Trigger 信息
# v1.8之前用JobInitializationPlugin
#org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval =10
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false

# 关闭quartz新版本检测功能
org.quartz.scheduler.skipUpdateCheck = true
  • 配置job.xml

加载触发器类型,定义触发器属性等一系列jobDetail操作

<?xmlversion="1.0"encoding="UTF-8"?> 
<job-scheduling-dataxmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.ogr/xml/job_scheduling_data_1_8.xsd" 
   version="1.8"> 
   <pre-processing-commands> 
       <!--在执行作业和触犯器之前执行的命令--> 
       <delete-jobs-in-group>*</delete-jobs-in-group> 
       <!--删除标示组中的所有作业,如果是“*”,则删除所有组中的作业,同时也会删除与作业有关的触犯器 --> 
       <delete-triggers-in-group>*</delete-triggers-in-group> 
       <!--删除标示组中的所有触犯器,如果是“*”,则删除所有组中的触发器 --> 
       <delete-job> 
           <!--删除指定的作业,同时也会删除与它关联的触犯器 --> 
           <name></name> 
           <group></group> 
       </delete-job> 
       <delete-trigger> 
           <!--删除指定的触犯器 --> 
           <name></name> 
           <group></group> 
       </delete-trigger> 
   </pre-processing-commands> 
 
   <processing-directives> 
       <!--在计划作业和触发器是应遵循的命令和原则 --> 
       <overwrite-existing-data>true or false</overwrite-existing-data> 
       <!--是否复写已经存在的任务计划数据,如果为false并且ingore-duplicates非false,那么文件中同名的触发器或作业将会继续存在,则会产生错误--> 
       <ignore-duplicates>true or false</ignore-duplicates> 
       <!--如果为true,计划中的任何同名的作业/触发器将会被忽略,不会产生错误--> 
   </processing-directives> 
 
   <schedule> 
       <job> 
           <name>JobName</name> 
           <group>JobGroup</group> 
           <description></description> 
           <job-class></job-class> 
           <job-listener-ref></job-listener-ref> 
           <!-- volatility,durability,recover必须按顺序设定 --> 
           <volatility></volatility> 
           <durability></durability> 
           <recover></recover> 
           <job-data-map> 
               <!-- entry可以设定多个--> 
               <entry> 
                   <key></key> 
                   <value></value> 
               </entry> 
           </job-data-map> 
       </job> 
       <trigger> 
           <!-- Trigger分为simple,cron,date-interval三种类型,一个trigger中只能指定一种类型--> 
           <simple> 
               <name></name> 
               <group></group> 
               <description></description> 
               <job-name></job-name> 
               <job-group></job-group> 
               <calendar-name></calendar-name> 
               <volatility></volatility> 
               <job-data-map> 
                   <entry> 
                       <key></key> 
                       <value></value> 
                   </entry> 
               </job-data-map> 
               <start-time></start-time> 
               <end-time></end-time> 
               <misfire-instruction></misfire-instruction> 
               <repeat-count></repeat-count> 
               <repeat-interval></repeat-interval> 
           </simple> 
           <cron> 
               <name></name> 
               <group></group> 
               <description></description> 
               <job-name></job-name> 
               <job-group></job-group> 
               <calendar-name></calendar-name> 
               <volatility></volatility> 
               <job-data-map> 
                   <entry> 
                       <key></key> 
                       <value></value> 
                   </entry> 
               </job-data-map> 
               <start-time></start-time> 
               <end-time></end-time> 
               <misfire-instruction></misfire-instruction> 
               <cron-expression></cron-expression> 
               <time-zone></time-zone> 
           </cron> 
           <date-interval> 
               <name></name> 
               <group></group> 
               <description></description> <job-group></job-group> 
              <job-data-map> 
                   <entry> 
                       <key></key> 
                       <value></value> 
                   </entry> 
               </job-data-map> 
               <start-time></start-time> 
               <end-time></end-time> 
               <misfire-instruction></misfire-instruction> 
               <repeat-interval></repeat-interval> 
               <repeat-interval-unit></repeat-interval-unit> 
           </date-interval> 
       </trigger> 
   </schedule> 
</job-scheduling-data>

本例使用的quartz版本为1.8.6,现在已经更新到2.0以上版本

本例quartz_job.xml

<?xmlversion="1.0"encoding="UTF-8"?>  
<job-scheduling-dataxmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd" 
   version="1.8">  
      
   <pre-processing-commands>  
       <delete-jobs-in-group>*</delete-jobs-in-group> <!-- clear all jobs in scheduler -->  
       <delete-triggers-in-group>*</delete-triggers-in-group><!-- clear all triggers in scheduler -->  
   </pre-processing-commands>  
      
   <processing-directives>  
       <overwrite-existing-data>true</overwrite-existing-data>  
       <ignore-duplicates>false</ignore-duplicates>   
   </processing-directives>  
      
   <schedule>  
       <job>  
           <name>helloQuartzJob</name>  
           <group>DEFAULT</group>  
           <description>简单的quartz使用</description>  
           <job-class>HelloQuartzJob</job-class>  
           <volatility>false</volatility>  
           <durability>true</durability>  
           <recover>false</recover>  
       </job>  
       <trigger>  
       <cron>
                <name>trigger</name>     
              <group>DEFAULT</group>     
              <job-name>helloQuartzJob</job-name>     
              <job-group>DEFAULT</job-group> 
             <cron-expression>30/5 * * * * ?</cron-expression>
       </cron>   
       </trigger>
   </schedule>      
</job-scheduling-data>
  • 建立测试用例

      public class HelloQuartzScheduling {
          @Test
          public void testQuartz() 
             throws SchedulerException, ParseException {
             //  加载quartz容器
             SchedulerFactory schedulerFactory = new StdSchedulerFactory();
             Scheduler scheduler = schedulerFactory.getScheduler();
    		   
             scheduler.start();              
          }   
      }
    

和spring相结合

在spring-content里加入bean

  <!--使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->    
    <!-- 定义目标bean和bean中的方法 -->  
    <bean id="SpringQtzJob" class="com.chenfan.server.HelloQuartzJob"/>  
    <bean id="SpringQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    <property name="targetObject">  
        <ref bean="SpringQtzJob"/>  
    </property>  
    <property name="targetMethod">  <!-- 要执行的方法名称 -->  
        <value>execute</value>  
    </property>  
</bean>  
  
<!-- ======================== 调度触发器 ======================== -->  
<bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">  
    <property name="jobDetail" ref="SpringQtzJobMethod"></property>  
    <property name="cronExpression" value="0/5 * * * * ?"></property>  
</bean>  
  
<!-- ======================== 调度工厂 ======================== -->  
<bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <property name="triggers">  
        <list>  
            <ref bean="CronTriggerBean"/>  
        </list>  
    </property>  
</bean>    

在web.xml里加载spring-content.xml

<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns="http://java.sun.com/xml/ns/javaee"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
         version="2.5">  
    <welcome-file-list>  
        <welcome-file>index.html</welcome-file>  
    </welcome-file-list>  
  
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>/WEB-INF/spring-config.xml</param-value>  
    </context-param>  
  
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>  
</web-app>
上一篇: Quartz定时调度