定时器quartz的应用

用quartz可以实现web或非web模式的定时器

1、配置文件

quartz_job.xml
  1. <!--sp-->xmlversion="1.0"encoding="UTF-8"?>
  2. <quartzxmlns="http://www.opensymphony.com/quartz/JobSchedulingData"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. overwrite-existing-jobs="true">
  5. <job>
  6. <job-detail>
  7. <name>yayaittname>
  8. <group>CRAWLER_JOB_GROUPgroup>
  9. <description>sendtaskperdaydescription>
  10. <job-class>com.yahaitt.quartz.QuartzSystemjob-class>
  11. <job-data-mapallows-transient-data="true">
  12. <entry>
  13. <key>usernamekey>
  14. <value>wujinlivalue>
  15. entry>
  16. <entry>
  17. <key>passwordkey>
  18. <value>mahaibovalue>
  19. entry>
  20. job-data-map>
  21. job-detail>
  22. <trigger>
  23. <cron>
  24. <name>hourTaskJob-triggername>
  25. <group>CRAWLER_TRIGGER_GROUPgroup>
  26. <job-name>yayaittjob-name>
  27. <job-group>CRAWLER_JOB_GROUPjob-group>
  28. <cron-expression>1/12****?cron-expression>
  29. cron>
  30. trigger>
  31. job>
  32. quartz>

该定时器实现了每12秒触发类com.yahaitt.quartz.QuartzSystem的execute函数,并通过java-data-map标签来实现参数的传递,如果不需要传递参数,可以将整个java-data-map标签去除。

需要注意的是job-detail与trigger中各子标签间的关系,比如trigger中job-name和job-group要与job-detail中的name和group对应。

可以通过在quartz标签中添加多个job来实现多个定时器的管理。

2、定义org.quartz.Job接口的实现类

QuartzSystem.java
  1. packagecom.yahaitt.quartz;
  2. importorg.quartz.Job;
  3. importorg.quartz.JobExecutionContext;
  4. importorg.quartz.JobExecutionException;
  5. publicclassQuartzSystemimplementsJob{
  6. publicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException{
  7. //TODOAuto-generatedmethodstub
  8. Stringusername=context.getJobDetail().getJobDataMap().getString("username");
  9. Stringpassword=context.getJobDetail().getJobDataMap().getString("password");
  10. System.out.println("username:"+username);
  11. System.out.println("password:"+password);
  12. }
  13. }

通过调用JobExecutionContext 的getJobDetail().getJobDataMap().getString(String paramname)来取得配置文件中定义的参数的值。

当定时器触发时,将执行该类的execute函数。

3、设置监听器

TaskScheduler.java
  1. packagecom.yahaitt.quartz;
  2. importjava.util.Properties;
  3. importorg.apache.log4j.Logger;
  4. importorg.quartz.Scheduler;
  5. importorg.quartz.SchedulerException;
  6. importorg.quartz.SchedulerFactory;
  7. importorg.quartz.impl.StdSchedulerFactory;
  8. importorg.quartz.xml.JobSchedulingDataProcessor;
  9. publicclassTaskScheduler{
  10. //Logger
  11. privatestaticLoggerlogger=Logger.getLogger(TaskScheduler.class);
  12. privatestaticSchedulerscheduler;
  13. privateStringjobsConfigFile="quartz-jobs.xml";
  14. publicTaskScheduler(){
  15. initScheduler();
  16. }
  17. /**
  18. *
  19. *@paramfileName
  20. *@return
  21. */
  22. publicvoidinitScheduler(){
  23. try{
  24. StdSchedulerFactoryfactory=newStdSchedulerFactory();
  25. //
  26. Propertiesproperties=newProperties();
  27. properties.put("org.quartz.scheduler.instanceName","DefaultQuartzScheduler");
  28. properties.put("org.quartz.scheduler.rmi.export","false");
  29. properties.put("org.quartz.scheduler.rmi.proxy","false");
  30. properties.put("org.quartz.scheduler.wrapJobExecutionInUserTransaction","false");
  31. properties.put("org.quartz.threadPool.class","org.quartz.simpl.SimpleThreadPool");
  32. properties.put("org.quartz.threadPool.threadCount","20");
  33. properties.put("org.quartz.threadPool.threadPriority","5");
  34. properties.put("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread","true");
  35. properties.put("org.quartz.jobStore.misfireThreshold","60000");
  36. properties.put("org.quartz.jobStore.class","org.quartz.simpl.RAMJobStore");
  37. //org.quartz.plugin.jobInitializer.validating=false
  38. //org.quartz.plugin.jobInitializer.validatingSchema=false
  39. //org.quartz.plugin.jobInitializer.class=org.quartz.plugins.xml.JobInitializationPlugin
  40. //org.quartz.plugin.jobInitializer.fileName=quartz-jobs.xml
  41. //org.quartz.plugin.jobInitializer.overWriteExistingJobs=false
  42. //org.quartz.plugin.jobInitializer.failOnFileNotFound=true
  43. factory.initialize(properties);
  44. SchedulerFactorysf=(StdSchedulerFactory)factory;
  45. scheduler=sf.getScheduler();
  46. //PlacingaSchedulerinStand-byMode
  47. //scheduler.standby();
  48. }catch(SchedulerExceptione){
  49. e.printStackTrace();
  50. logger.error(e);
  51. }
  52. }
  53. /**
  54. *从指定的任务配置文件中初始化计划任务
  55. *@paramjobsConfig
  56. *@throwsException
  57. */
  58. publicvoidinitJobs(StringjobsConfig)throwsException{
  59. //
  60. this.jobsConfigFile=jobsConfig;
  61. //
  62. JobSchedulingDataProcessorxmlProcessor=newJobSchedulingDataProcessor();
  63. //thelastparameterhere(thebooleanone)isforoverwritingexistingjobs
  64. xmlProcessor.processFileAndScheduleJobs(jobsConfigFile,scheduler,true);
  65. }
  66. /**
  67. *开启计划任务
  68. *@throwsSchedulerException
  69. */
  70. publicvoidstartScheduler()throwsSchedulerException{
  71. //Schedulerwillnotexecutejobsuntilithasbeenstarted(thoughtheycanbescheduledbeforestart())
  72. scheduler.start();
  73. }
  74. /**
  75. *停止计划任务
  76. *@throwsSchedulerException
  77. */
  78. publicvoidshutdownScheduler()throwsSchedulerException{
  79. scheduler.shutdown();
  80. }
  81. /**
  82. *@paramargs
  83. */
  84. publicstaticvoidmain(String[]args){
  85. StringjobsConfigfile="E:/workspace/crawler/conf/quartz_job.xml";
  86. TaskSchedulerscheduler=newTaskScheduler();
  87. try{
  88. scheduler.initJobs(jobsConfigfile);
  89. scheduler.startScheduler();
  90. }catch(Exceptione){
  91. e.printStackTrace();
  92. }
  93. }
  94. }
只有当执行
scheduler.initJobs(jobsConfigfile);
scheduler.startScheduler();
后,定时器才会被启动。
所以,在web中应用时,可以写一个servlet程序,在其init函数中new一个TaskScheduler,并初始化和启动这个TaskScheduler,并通过在web.xml中设置
<load-on-startup>1</load-on-startup>
使得在web服务器启动时将定时器启动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值