JobPlus知识库 IT 大数据 文章
【Quartz】插件的使用

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

 

一、使用Quartz自带插件范例

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

1、首先是job类:

  1. import java.util.Date;

  2. import java.util.Set;

  3. import org.quartz.DisallowConcurrentExecution;

  4. import org.quartz.InterruptableJob;

  5. import org.quartz.Job;

  6. import org.quartz.JobDataMap;

  7. import org.quartz.JobExecutionContext;

  8. import org.quartz.JobExecutionException;

  9. import org.quartz.JobKey;

  10. import org.quartz.PersistJobDataAfterExecution;

  11. import org.quartz.UnableToInterruptJobException;

  12. import org.slf4j.Logger;

  13. import org.slf4j.LoggerFactory;

  14. @PersistJobDataAfterExecution

  15. @DisallowConcurrentExecution

  16. public class SimpleJob implements Job {

  17. private static Logger log = LoggerFactory.getLogger(SimpleJob.class);

  18. private JobKey jobkey=null;

  19. @Override

  20. public void execute(JobExecutionContext context) throws JobExecutionException {

  21. jobkey = context.getJobDetail().getKey();

  22. log.info("Excuting job: " + jobkey + " executing at " + new Date()+" fire by: "+context.getTrigger().getKey());

  23. if(context.getMergedJobDataMap().size()>0){

  24.     Set<String>  keys= context.getMergedJobDataMap().keySet();

  25. for (String key : keys) {

  26. String value= context.getMergedJobDataMap().getString(key);

  27. log.info(" jobdatamap entry: "+key+" = "+value);

  28. }

  29. context.setResult("hello");

  30. }

  31. }

  32. }


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. <pre-processing-commands>

  7. <delete-jobs-in-group>*</delete-jobs-in-group>  <!-- clear all jobs in scheduler -->

  8. <delete-triggers-in-group>*</delete-triggers-in-group> <!-- clear all triggers in scheduler -->

  9. </pre-processing-commands>

  10. <processing-directives>

  11. <!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them -->

  12. <overwrite-existing-data>true</overwrite-existing-data>

  13. <!-- 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 -->

  14. <ignore-duplicates>false</ignore-duplicates>

  15. </processing-directives>

  16. <schedule>

  17. <job>

  18. <name>TestJob1</name>

  19. <job-class>com.mucfc.SimpleJob</job-class>

  20. </job>

  21. <job>

  22. <name>TestDurableJob</name>

  23. <job-class>com.mucfc.SimpleJob</job-class>

  24. <durability>true</durability>

  25. <recover>false</recover>

  26. </job>

  27. <trigger>

  28. <simple>

  29. <name>TestSimpleTrigger1AtFiveSecondInterval</name>

  30. <job-name>TestJob1</job-name>

  31. <repeat-count>-1</repeat-count> <!-- repeat indefinitely  -->

  32. <repeat-interval>5000</repeat-interval>  <!--  every 5 seconds -->

  33. </simple>

  34. </trigger>

  35. <job>

  36. <name>TestJob2</name>

  37. <group>GroupOfTestJob2</group>

  38. <description>This is the description of TestJob2</description>

  39. <job-class>com.mucfc.SimpleJob</job-class>

  40. <durability>false</durability>

  41. <recover>true</recover>

  42. <job-data-map>

  43. <entry>

  44. <key>someKey</key>

  45. <value>someValue</value>

  46. </entry>

  47. <entry>

  48. <key>someOtherKey</key>

  49. <value>someOtherValue</value>

  50. </entry>

  51. </job-data-map>

  52. </job>

  53. <trigger>

  54. <simple>

  55. <name>TestSimpleTrigger2AtTenSecondIntervalAndFiveRepeats</name>

  56. <group>GroupOfTestJob2Triggers</group>

  57. <job-name>TestJob2</job-name>

  58. <job-group>GroupOfTestJob2</job-group>

  59. <start-time>2010-02-09T10:15:00</start-time>

  60. <misfire-instruction>MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT</misfire-instruction>

  61. <repeat-count>5</repeat-count>

  62. <repeat-interval>10000</repeat-interval>

  63. </simple>

  64. </trigger>

  65. <trigger>

  66. <cron>

  67. <name>TestCronTrigger2AtEveryMinute</name>

  68. <group>GroupOfTestJob2Triggers</group>

  69. <job-name>TestJob2</job-name>

  70. <job-group>GroupOfTestJob2</job-group>

  71. <job-data-map>

  72. <entry>

  73. <key>someKey</key>

  74. <value>overriddenValue</value>

  75. </entry>

  76. <entry>

  77. <key>someOtherKey</key>

  78. <value>someOtherOverriddenValue</value>

  79. </entry>

  80. </job-data-map>

  81. <cron-expression>0 * * ? * *</cron-expression>

  82. </cron>

  83. </trigger>

  84. <trigger>

  85. <cron>

  86. <name>TestCronTrigger2AtEveryMinuteOnThe45thSecond</name>

  87. <group>GroupOfTestJob2Triggers</group>

  88. <job-name>TestJob2</job-name>

  89. <job-group>GroupOfTestJob2</job-group>

  90. <start-time>2015-05-12T12:26:00.0</start-time>

  91. <end-time>2015-05-16T12:26:00.0</end-time>

  92. <misfire-instruction>MISFIRE_INSTRUCTION_SMART_POLICY</misfire-instruction>

  93. <cron-expression>45 * * ? * *</cron-expression>

  94. <time-zone>America/Los_Angeles</time-zone>

  95. </cron>

  96. </trigger>

  97. </schedule>    

  98. </job-scheduling-data>


3、配置文件

  1. #============================================================================

  2. # Configure Main Scheduler Properties  

  3. #============================================================================

  4. org.quartz.scheduler.instanceName: TestScheduler

  5. org.quartz.scheduler.instanceId: AUTO

  6. org.quartz.scheduler.skipUpdateCheck: true

  7. #============================================================================

  8. # Configure ThreadPool  

  9. #============================================================================

  10. org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool

  11. org.quartz.threadPool.threadCount: 3

  12. org.quartz.threadPool.threadPriority: 5

  13. #============================================================================

  14. # Configure JobStore  

  15. #============================================================================

  16. org.quartz.jobStore.misfireThreshold: 60000

  17. org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

  18. #org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX

  19. #org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate

  20. #org.quartz.jobStore.useProperties: false

  21. #org.quartz.jobStore.dataSource: myDS

  22. #org.quartz.jobStore.tablePrefix: QRTZ_

  23. #org.quartz.jobStore.isClustered: false

  24. #============================================================================

  25. # Configure Datasources  

  26. #============================================================================

  27. #org.quartz.dataSource.myDS.driver: org.postgresql.Driver

  28. #org.quartz.dataSource.myDS.URL: jdbc:postgresql://localhost/dev

  29. #org.quartz.dataSource.myDS.user: jhouse

  30. #org.quartz.dataSource.myDS.password:

  31. #org.quartz.dataSource.myDS.maxConnections: 5

  32. #============================================================================

  33. # Configure Plugins

  34. #============================================================================

  35. org.quartz.plugin.triggHistory.class: org.quartz.plugins.history.LoggingJobHistoryPlugin

  36. org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin

  37. org.quartz.plugin.jobInitializer.fileNames: quartz_data.xml

  38. org.quartz.plugin.jobInitializer.failOnFileNotFound: true

  39. org.quartz.plugin.jobInitializer.scanInterval: 120

  40. org.quartz.plugin.jobInitializer.wrapInUserTransaction: false

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

3、测试

  1. import java.util.Calendar;

  2. import java.util.Date;

  3. import java.util.GregorianCalendar;

  4. import org.quartz.DateBuilder;

  5. import org.quartz.JobBuilder;

  6. import org.quartz.JobDetail;

  7. import org.quartz.Matcher;

  8. import org.quartz.Scheduler;

  9. import org.quartz.SchedulerFactory;

  10. import org.quartz.SchedulerMetaData;

  11. import org.quartz.SimpleScheduleBuilder;

  12. import org.quartz.SimpleTrigger;

  13. import org.quartz.Trigger;

  14. import org.quartz.TriggerBuilder;

  15. import org.quartz.impl.StdSchedulerFactory;

  16. import org.quartz.impl.calendar.AnnualCalendar;

  17. import org.quartz.impl.matchers.KeyMatcher;

  18. import org.slf4j.Logger;

  19. import org.slf4j.LoggerFactory;

  20. public class PluginExample {

  21. public static void run() throws Exception {

  22. Logger log = LoggerFactory.getLogger(PluginExample.class);

  23. SchedulerFactory sf = new StdSchedulerFactory();

  24. Scheduler sche = sf.getScheduler();

  25. sche.start();

  26. try {

  27. Thread.sleep(300000L);

  28. } catch (Exception e) {

  29. }

  30.     sche.shutdown();

  31. SchedulerMetaData metaData = sche.getMetaData();

  32. log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");

  33. }

  34. public static void main(String[] args) {

  35. PluginExample simpleExample = new PluginExample();

  36. try {

  37. simpleExample.run();

  38. } catch (Exception e) {

  39. e.printStackTrace();

  40. }

  41. }

  42. }


4、结果:

 

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


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
98人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序