用quartz可以实现web或非web模式的定时器
1、配置文件
quartz_job.xml
- <!--sp-->xmlversion="1.0"encoding="UTF-8"?>
- <quartzxmlns="http://www.opensymphony.com/quartz/JobSchedulingData"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- overwrite-existing-jobs="true">
- <job>
- <job-detail>
- <name>yayaittname>
- <group>CRAWLER_JOB_GROUPgroup>
- <description>sendtaskperdaydescription>
- <job-class>com.yahaitt.quartz.QuartzSystemjob-class>
- <job-data-mapallows-transient-data="true">
- <entry>
- <key>usernamekey>
- <value>wujinlivalue>
- entry>
- <entry>
- <key>passwordkey>
- <value>mahaibovalue>
- entry>
- job-data-map>
- job-detail>
- <trigger>
- <cron>
- <name>hourTaskJob-triggername>
- <group>CRAWLER_TRIGGER_GROUPgroup>
- <job-name>yayaittjob-name>
- <job-group>CRAWLER_JOB_GROUPjob-group>
- <cron-expression>1/12****?cron-expression>
- cron>
- trigger>
- job>
- 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
- packagecom.yahaitt.quartz;
- importorg.quartz.Job;
- importorg.quartz.JobExecutionContext;
- importorg.quartz.JobExecutionException;
- publicclassQuartzSystemimplementsJob{
- publicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException{
- //TODOAuto-generatedmethodstub
- Stringusername=context.getJobDetail().getJobDataMap().getString("username");
- Stringpassword=context.getJobDetail().getJobDataMap().getString("password");
- System.out.println("username:"+username);
- System.out.println("password:"+password);
- }
- }
通过调用JobExecutionContext 的getJobDetail().getJobDataMap().getString(String paramname)来取得配置文件中定义的参数的值。
当定时器触发时,将执行该类的execute函数。
3、设置监听器
TaskScheduler.java
- packagecom.yahaitt.quartz;
- importjava.util.Properties;
- importorg.apache.log4j.Logger;
- importorg.quartz.Scheduler;
- importorg.quartz.SchedulerException;
- importorg.quartz.SchedulerFactory;
- importorg.quartz.impl.StdSchedulerFactory;
- importorg.quartz.xml.JobSchedulingDataProcessor;
- publicclassTaskScheduler{
- //Logger
- privatestaticLoggerlogger=Logger.getLogger(TaskScheduler.class);
- privatestaticSchedulerscheduler;
- privateStringjobsConfigFile="quartz-jobs.xml";
- publicTaskScheduler(){
- initScheduler();
- }
- /**
- *
- *@paramfileName
- *@return
- */
- publicvoidinitScheduler(){
- try{
- StdSchedulerFactoryfactory=newStdSchedulerFactory();
- //
- Propertiesproperties=newProperties();
- properties.put("org.quartz.scheduler.instanceName","DefaultQuartzScheduler");
- properties.put("org.quartz.scheduler.rmi.export","false");
- properties.put("org.quartz.scheduler.rmi.proxy","false");
- properties.put("org.quartz.scheduler.wrapJobExecutionInUserTransaction","false");
- properties.put("org.quartz.threadPool.class","org.quartz.simpl.SimpleThreadPool");
- properties.put("org.quartz.threadPool.threadCount","20");
- properties.put("org.quartz.threadPool.threadPriority","5");
- properties.put("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread","true");
- properties.put("org.quartz.jobStore.misfireThreshold","60000");
- properties.put("org.quartz.jobStore.class","org.quartz.simpl.RAMJobStore");
- //org.quartz.plugin.jobInitializer.validating=false
- //org.quartz.plugin.jobInitializer.validatingSchema=false
- //org.quartz.plugin.jobInitializer.class=org.quartz.plugins.xml.JobInitializationPlugin
- //org.quartz.plugin.jobInitializer.fileName=quartz-jobs.xml
- //org.quartz.plugin.jobInitializer.overWriteExistingJobs=false
- //org.quartz.plugin.jobInitializer.failOnFileNotFound=true
- factory.initialize(properties);
- SchedulerFactorysf=(StdSchedulerFactory)factory;
- scheduler=sf.getScheduler();
- //PlacingaSchedulerinStand-byMode
- //scheduler.standby();
- }catch(SchedulerExceptione){
- e.printStackTrace();
- logger.error(e);
- }
- }
- /**
- *从指定的任务配置文件中初始化计划任务
- *@paramjobsConfig
- *@throwsException
- */
- publicvoidinitJobs(StringjobsConfig)throwsException{
- //
- this.jobsConfigFile=jobsConfig;
- //
- JobSchedulingDataProcessorxmlProcessor=newJobSchedulingDataProcessor();
- //thelastparameterhere(thebooleanone)isforoverwritingexistingjobs
- xmlProcessor.processFileAndScheduleJobs(jobsConfigFile,scheduler,true);
- }
- /**
- *开启计划任务
- *@throwsSchedulerException
- */
- publicvoidstartScheduler()throwsSchedulerException{
- //Schedulerwillnotexecutejobsuntilithasbeenstarted(thoughtheycanbescheduledbeforestart())
- scheduler.start();
- }
- /**
- *停止计划任务
- *@throwsSchedulerException
- */
- publicvoidshutdownScheduler()throwsSchedulerException{
- scheduler.shutdown();
- }
- /**
- *@paramargs
- */
- publicstaticvoidmain(String[]args){
- StringjobsConfigfile="E:/workspace/crawler/conf/quartz_job.xml";
- TaskSchedulerscheduler=newTaskScheduler();
- try{
- scheduler.initJobs(jobsConfigfile);
- scheduler.startScheduler();
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
- 使用多线程和定时器的例子.rar (1.7 MB)
1577

被折叠的 条评论
为什么被折叠?




scheduler.initJobs(jobsConfigfile);
scheduler.startScheduler();
后,定时器才会被启动。
所以,在web中应用时,可以写一个servlet程序,在其init函数中new一个TaskScheduler,并初始化和启动这个TaskScheduler,并通过在web.xml中设置
<load-on-startup>1</load-on-startup>
使得在web服务器启动时将定时器启动。