|
Quartz插件的使用 |
|
|
Quartz插件的使用
Quartz框架提供了几种用于扩展平台能力的方式。通过使用各种"钩子"(通常指的就是扩展点),Quartz变得很容易被扩展和定制化来适应你的需要。其中一个最简单的扩展框架的方法就是使用Quartz插件。本章就来看看如何使用插件机制让Quartz进入到之前Quartz用户没去过的领域。
一、使用Quartz自带插件范例
下面将使用插件实现从XML得到JOB,不用手工的把job和trigger加到Scheduler中去再来运行,这样就很方便。如果要更改任务,直接在xml中配置就可以了。不用再写Java代码。
1、首先是job类:
[java]viewplaincopy
packagecom.mucfc;
importjava.util.Date;
importjava.util.Set;
importorg.quartz.DisallowConcurrentExecution;
importorg.quartz.InterruptableJob;
importorg.quartz.Job;
importorg.quartz.JobDataMap;
importorg.quartz.JobExecutionContext;
importorg.quartz.JobExecutionException;
importorg.quartz.JobKey;
importorg.quartz.PersistJobDataAfterExecution;
importorg.quartz.UnableToInterruptJobException;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
publicclassSimpleJobimplementsJob{
privatestaticLoggerlog=LoggerFactory.getLogger(SimpleJob.class);
privateJobKeyjobkey=null;
@Override
publicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException{
jobkey=context.getJobDetail().getKey();
log.info("Excutingjob:"+jobkey+"executingat"+newDate()+"fireby:"+context.getTrigger().getKey());
if(context.getMergedJobDataMap().size()>0){
Setkeys=context.getMergedJobDataMap().keySet();
for(Stringkey:keys){
Stringvalue=context.getMergedJobDataMap().getString(key);
log.info("jobdatamapentry:"+key+"="+value);
}
context.setResult("hello");
}
}
}
2、job触发时间配置,使用quartz_data.xml
[html]viewplaincopy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingDatahttp://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
version="1.8">
true
false
TestJob1
com.mucfc.SimpleJob
TestDurableJob
com.mucfc.SimpleJob
true
false
TestSimpleTrigger1AtFiveSecondInterval
TestJob1
-1
5000
TestJob2
GroupOfTestJob2
ThisisthedescriptionofTestJob2
com.mucfc.SimpleJob
false
true
someKey
someValue
someOtherKey
someOtherValue
TestSimpleTrigger2AtTenSecondIntervalAndFiveRepeats
GroupOfTestJob2Triggers
TestJob2
GroupOfTestJob2
2010-02-09T10:15:00
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
5
10000
TestCronTrigger2AtEveryMinute
GroupOfTestJob2Triggers
TestJob2
GroupOfTestJob2
someKey
overriddenValue
someOtherKey
someOtherOverriddenValue
0?
TestCronTrigger2AtEveryMinuteOnThe45thSecond
GroupOfTestJob2Triggers
TestJob2
GroupOfTestJob2
2015-05-12T12:26:00.0
2015-05-16T12:26:00.0
MISFIRE_INSTRUCTION_SMART_POLICY
45?
America/Los_Angeles
3、配置文件
[plain]viewplaincopy
#============================================================================
#ConfigureMainSchedulerProperties
#============================================================================
org.quartz.scheduler.instanceName:TestScheduler
org.quartz.scheduler.instanceId:AUTO
org.quartz.scheduler.skipUpdateCheck:true
#============================================================================
#ConfigureThreadPool
#============================================================================
org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount:3
org.quartz.threadPool.threadPriority:5
#============================================================================
#ConfigureJobStore
#============================================================================
org.quartz.jobStore.misfireThreshold:60000
org.quartz.jobStore.class:org.quartz.simpl.RAMJobStore
#org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.useProperties:false
#org.quartz.jobStore.dataSource:myDS
#org.quartz.jobStore.tablePrefix:QRTZ_
#org.quartz.jobStore.isClustered:false
#============================================================================
#ConfigureDatasources
#============================================================================
#org.quartz.dataSource.myDS.driver:org.postgresql.Driver
#org.quartz.dataSource.myDS.URL:jdbc:postgresql://localhost/dev
#org.quartz.dataSource.myDS.user:jhouse
#org.quartz.dataSource.myDS.password:
#org.quartz.dataSource.myDS.maxConnections:5
#============================================================================
#ConfigurePlugins
#============================================================================
org.quartz.plugin.triggHistory.class:org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class:org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames:quartz_data.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound:true
org.quartz.plugin.jobInitializer.www.baiyuewang.netscanInterval:120
org.quartz.plugin.jobInitializer.wrapInUserTransaction:false
其中org.quartz.plugin.jobInitializer.class:org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin会自动加载quartz_data.xml中的trigger和job到Scheduler
3、测试
[java]viewplaincopy
packagecom.mucfc;
importjava.util.Calendar;
importjava.util.Date;
importjava.util.GregorianCalendar;
importorg.quartz.DateBuilder;
importorg.quartz.JobBuilder;
importorg.quartz.JobDetail;
importorg.quartz.Matcher;
importorg.quartz.Scheduler;
importorg.quartz.SchedulerFactory;
importorg.quartz.SchedulerMetaData;
importorg.quartz.SimpleScheduleBuilder;
importorg.quartz.SimpleTrigger;
importorg.quartz.Trigger;
importorg.quartz.TriggerBuilder;
importorg.quartz.impl.StdSchedulerFactory;
importorg.quartz.impl.calendar.AnnualCalendar;
importorg.quartz.impl.matchers.KeyMatcher;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
publicclassPluginExample{
publicstaticvoidrun()throwsException{
Loggerlog=LoggerFactory.getLogger(PluginExample.class);
SchedulerFactorysf=newStdSchedulerFactory();
Schedulersche=sf.getScheduler();
sche.start();
try{
Thread.sleep(300000L);
}catch(Exceptione){
}
sche.shutdown();
SchedulerMetaDatametaData=sche.getMetaData();
log.info("Executed"+metaData.getNumberOfJobsExecuted()+"jobs.");
}
publicstaticvoidmain(String[]args){
PluginExamplesimpleExample=newPluginExample();
try{
simpleExample.run();
}catch(Exceptione){
e.printStackTrace();
}
}
}
|
|
|
|
|
|
|
|
|
|
|