Quartz插件的使用

 林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

       Quartz 框架提供了几种用于扩展平台能力的方式。通过使用各种 "钩子" (通常指的就是扩展点),Quartz 变得很容易被扩展和定制化来适应你的需要。其中一个最简单的扩展框架的方法就是使用 Quartz 插件。本章就来看看如何使用插件机制让 Quartz 进入到之前 Quartz 用户没去过的领域。


一、使用Quartz自带插件范例

   下面将使用插件实现从XML得到JOB,不用手工的把job和trigger加到Scheduler中去再来运行,这样就很方便。如果要更改任务,直接在xml中配置就可以了。不用再写Java代码。


1、首先是job类:

  1. package com.mucfc;  
  2.   
  3. import java.util.Date;  
  4. import java.util.Set;  
  5.   
  6. import org.quartz.DisallowConcurrentExecution;  
  7. import org.quartz.InterruptableJob;  
  8. import org.quartz.Job;  
  9. import org.quartz.JobDataMap;  
  10. import org.quartz.JobExecutionContext;  
  11. import org.quartz.JobExecutionException;  
  12. import org.quartz.JobKey;  
  13. import org.quartz.PersistJobDataAfterExecution;  
  14. import org.quartz.UnableToInterruptJobException;  
  15. import org.slf4j.Logger;  
  16. import org.slf4j.LoggerFactory;  
  17.   
  18. @PersistJobDataAfterExecution  
  19. @DisallowConcurrentExecution  
  20. public class SimpleJob implements Job {  
  21.   
  22.     private static Logger log = LoggerFactory.getLogger(SimpleJob.class);  
  23.     private JobKey jobkey=null;  
  24.   
  25.     @Override  
  26.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  27.         jobkey = context.getJobDetail().getKey();  
  28.           
  29.         log.info("Excuting job: " + jobkey + " executing at " + new Date()+" fire by: "+context.getTrigger().getKey());  
  30.           
  31.         if(context.getMergedJobDataMap().size()>0){  
  32.              Set<String>  keys=   context.getMergedJobDataMap().keySet();  
  33.              for (String key : keys) {  
  34.                 String value= context.getMergedJobDataMap().getString(key);  
  35.                 log.info(" jobdatamap entry: "+key+" = "+value);  
  36.             }  
  37.              context.setResult("hello");  
  38.         }  
  39.           
  40.           
  41.     }  
  42.      
  43. }  

2、job触发时间配置,使用quartz_data.xml
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"  
  5.     version="1.8">  
  6.       
  7.     <pre-processing-commands>  
  8.         <delete-jobs-in-group>*</delete-jobs-in-group>  <!-- clear all jobs in scheduler -->  
  9.         <delete-triggers-in-group>*</delete-triggers-in-group> <!-- clear all triggers in scheduler -->  
  10.     </pre-processing-commands>  
  11.       
  12.     <processing-directives>  
  13.         <!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them -->  
  14.         <overwrite-existing-data>true</overwrite-existing-data>  
  15.         <!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error -->  
  16.         <ignore-duplicates>false</ignore-duplicates>   
  17.     </processing-directives>  
  18.       
  19.     <schedule>  
  20.         <job>  
  21.             <name>TestJob1</name>  
  22.             <job-class>com.mucfc.SimpleJob</job-class>  
  23.         </job>  
  24.           
  25.         <job>  
  26.             <name>TestDurableJob</name>  
  27.             <job-class>com.mucfc.SimpleJob</job-class>  
  28.             <durability>true</durability>  
  29.             <recover>false</recover>  
  30.         </job>  
  31.           
  32.         <trigger>  
  33.             <simple>  
  34.                 <name>TestSimpleTrigger1AtFiveSecondInterval</name>  
  35.                 <job-name>TestJob1</job-name>  
  36.                 <repeat-count>-1</repeat-count> <!-- repeat indefinitely  -->  
  37.                 <repeat-interval>5000</repeat-interval>  <!--  every 5 seconds -->  
  38.             </simple>  
  39.         </trigger>  
  40.       
  41.         <job>  
  42.             <name>TestJob2</name>  
  43.             <group>GroupOfTestJob2</group>  
  44.             <description>This is the description of TestJob2</description>  
  45.             <job-class>com.mucfc.SimpleJob</job-class>  
  46.             <durability>false</durability>  
  47.             <recover>true</recover>  
  48.             <job-data-map>  
  49.                 <entry>  
  50.                     <key>someKey</key>  
  51.                     <value>someValue</value>  
  52.                 </entry>  
  53.                 <entry>  
  54.                     <key>someOtherKey</key>  
  55.                     <value>someOtherValue</value>  
  56.                 </entry>  
  57.             </job-data-map>  
  58.         </job>  
  59.           
  60.         <trigger>  
  61.             <simple>  
  62.                 <name>TestSimpleTrigger2AtTenSecondIntervalAndFiveRepeats</name>  
  63.                 <group>GroupOfTestJob2Triggers</group>  
  64.                 <job-name>TestJob2</job-name>  
  65.                 <job-group>GroupOfTestJob2</job-group>  
  66.                 <start-time>2010-02-09T10:15:00</start-time>  
  67.                 <misfire-instruction>MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT</misfire-instruction>  
  68.                 <repeat-count>5</repeat-count>  
  69.                 <repeat-interval>10000</repeat-interval>  
  70.             </simple>  
  71.         </trigger>  
  72.           
  73.         <trigger>  
  74.             <cron>  
  75.                 <name>TestCronTrigger2AtEveryMinute</name>  
  76.                 <group>GroupOfTestJob2Triggers</group>  
  77.                 <job-name>TestJob2</job-name>  
  78.                 <job-group>GroupOfTestJob2</job-group>  
  79.                 <job-data-map>  
  80.                     <entry>  
  81.                         <key>someKey</key>  
  82.                         <value>overriddenValue</value>  
  83.                     </entry>  
  84.                     <entry>  
  85.                         <key>someOtherKey</key>  
  86.                         <value>someOtherOverriddenValue</value>  
  87.                     </entry>  
  88.                 </job-data-map>  
  89.                 <cron-expression>0 * * ? * *</cron-expression>  
  90.             </cron>  
  91.         </trigger>  
  92.       
  93.         <trigger>  
  94.             <cron>  
  95.                 <name>TestCronTrigger2AtEveryMinuteOnThe45thSecond</name>  
  96.                 <group>GroupOfTestJob2Triggers</group>  
  97.                 <job-name>TestJob2</job-name>  
  98.                 <job-group>GroupOfTestJob2</job-group>  
  99.                 <start-time>2015-05-12T12:26:00.0</start-time>  
  100.                 <end-time>2015-05-16T12:26:00.0</end-time>  
  101.                 <misfire-instruction>MISFIRE_INSTRUCTION_SMART_POLICY</misfire-instruction>  
  102.                 <cron-expression>45 * * ? * *</cron-expression>  
  103.                 <time-zone>America/Los_Angeles</time-zone>  
  104.             </cron>  
  105.         </trigger>  
  106.     </schedule>      
  107. </job-scheduling-data>  

3、配置文件
  1. #============================================================================  
  2. # Configure Main Scheduler Properties    
  3. #============================================================================  
  4.   
  5. org.quartz.scheduler.instanceName: TestScheduler  
  6. org.quartz.scheduler.instanceId: AUTO  
  7.   
  8. org.quartz.scheduler.skipUpdateCheck: true  
  9.   
  10. #============================================================================  
  11. # Configure ThreadPool    
  12. #============================================================================  
  13.   
  14. org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool  
  15. org.quartz.threadPool.threadCount: 3  
  16. org.quartz.threadPool.threadPriority: 5  
  17.   
  18. #============================================================================  
  19. # Configure JobStore    
  20. #============================================================================  
  21.   
  22. org.quartz.jobStore.misfireThreshold: 60000  
  23.   
  24. org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore  
  25.   
  26. #org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX  
  27. #org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate  
  28. #org.quartz.jobStore.useProperties: false  
  29. #org.quartz.jobStore.dataSource: myDS  
  30. #org.quartz.jobStore.tablePrefix: QRTZ_  
  31. #org.quartz.jobStore.isClustered: false  
  32.   
  33. #============================================================================  
  34. # Configure Datasources    
  35. #============================================================================  
  36.   
  37. #org.quartz.dataSource.myDS.driver: org.postgresql.Driver  
  38. #org.quartz.dataSource.myDS.URL: jdbc:postgresql://localhost/dev  
  39. #org.quartz.dataSource.myDS.user: jhouse  
  40. #org.quartz.dataSource.myDS.password:   
  41. #org.quartz.dataSource.myDS.maxConnections: 5  
  42.   
  43.   
  44.   
  45. #============================================================================  
  46. # Configure Plugins   
  47. #============================================================================  
  48.   
  49. org.quartz.plugin.triggHistory.class: org.quartz.plugins.history.LoggingJobHistoryPlugin  
  50. org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin  
  51. org.quartz.plugin.jobInitializer.fileNames: quartz_data.xml  
  52. org.quartz.plugin.jobInitializer.failOnFileNotFound: true  
  53. org.quartz.plugin.jobInitializer.scanInterval: 120  
  54. org.quartz.plugin.jobInitializer.wrapInUserTransaction: false  

其中org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin会自动加载quartz_data.xml中的trigger和job到Scheduler

3、测试

  1. package com.mucfc;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5. import java.util.GregorianCalendar;  
  6.   
  7. import org.quartz.DateBuilder;  
  8. import org.quartz.JobBuilder;  
  9. import org.quartz.JobDetail;  
  10. import org.quartz.Matcher;  
  11. import org.quartz.Scheduler;  
  12. import org.quartz.SchedulerFactory;  
  13. import org.quartz.SchedulerMetaData;  
  14. import org.quartz.SimpleScheduleBuilder;  
  15. import org.quartz.SimpleTrigger;  
  16. import org.quartz.Trigger;  
  17. import org.quartz.TriggerBuilder;  
  18. import org.quartz.impl.StdSchedulerFactory;  
  19. import org.quartz.impl.calendar.AnnualCalendar;  
  20. import org.quartz.impl.matchers.KeyMatcher;  
  21. import org.slf4j.Logger;  
  22. import org.slf4j.LoggerFactory;  
  23.   
  24. public class PluginExample {  
  25.     public static void run() throws Exception {  
  26.         Logger log = LoggerFactory.getLogger(PluginExample.class);  
  27.         SchedulerFactory sf = new StdSchedulerFactory();  
  28.         Scheduler sche = sf.getScheduler();  
  29.   
  30.   
  31.            sche.start();  
  32.            
  33.             try {  
  34.                 Thread.sleep(300000L);  
  35.              } catch (Exception e) {  
  36.             }  
  37.               
  38.             sche.shutdown();  
  39.            SchedulerMetaData metaData = sche.getMetaData();  
  40.            log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");  
  41.        }  
  42.   
  43.     public static void main(String[] args) {  
  44.         PluginExample simpleExample = new PluginExample();  
  45.         try {  
  46.             simpleExample.run();  
  47.         } catch (Exception e) {  
  48.             e.printStackTrace();  
  49.         }  
  50.     }  
  51. }  

4、结果:


看到了没,不用再把job和trigger手工加到Scheduler中去,它会自动加载XML中定义好的任务,需要做的只是start就行了。

 林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值