总结几点Quartz的经验

总结一下经典的定时处理框架quartz的使用经验。基于 Ver. 1.8.0

  1.配置方式

        最常用的方式properties + xml定义

org.quartz.scheduler.instanceName = CMS_Batch
org.quartz.scheduler.instanceId = AUTO

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 5

org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

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

#默认会联网检查是否有更新,还是skip为好
org.quartz.scheduler.skipUpdateCheck = true
 

        properties定义全局信息(全局Listener也在这定义),xml定义Job、trigger信息



    
    
        *  
        * 
    
    
    
        true
        false 
    
    
    
	    
	        FooJob
            FooBatch
            定时运行Job
	        xxx.yyy.FooJob
	        false
            true
            false
	    
	    
	        
	            FooTrigger
	            FooBatch
	            FooJob
	            FooBatch
                MISFIRE_INSTRUCTION_FIRE_ONCE_NOW
	            30/15 * 13 * * ?
                
	        
	    
	    
	        barJob
            FooBatch
            无trigger的Job
	        xxx.yyy.barJob
	        false
            true
            false
	    
        

 

        与J2ee容器结合,提供QuartzInitializerListener,可设定随容器自动启动,这个很方便




  Foo Batch

  
    quartz:config-file
    /quartz.properties
  

  
    
       org.quartz.ee.servlet.QuartzInitializerListener
    
  

  
 

 

  2.Job、Trigger、Listener

        Job需要由Trigger启动,可以有多个Listener

        Trigger同样可以有多个Listener

 

  3.有待改进的地方

       Trigger不完善,只提供了“定时”Trigger,其他诸如基于Job完成与否或完成状态的Trigger需要自己靠Listener实现。

       配置不完善,配置文件只提供全局Listener定义,针对Job或Trigger的Listener要程序添加,另外1.8版本在配置无Trigger的Job时有bug(XMLSchedulingDataProcessor 1015行需要nullcheck),直接导致xml解析错误,感觉这自带的plugin还很简陋。

       plugin和Job同级别 ,(这个说法有点偏颇,但是产生的效果类似)这意味着在schedule启动前是不会解析配置文件的,只能在启动后调整Job等等内容,同时scheduler.getJobDetail取的Job是通过clone方式取得的,任何对Job的修改都无效...这个很无语 (clone的方式还是有道理的,已经设置好的Job不能随便改动)

scheduler.start(); //启动后读取配置文件等等

JobDetail fooJob = scheduler.getJobDetail("FooJob",
        "FooBatch");

fooJob.addJobListener(someListener);

//取Job对应的Trigger
Trigger[] triggers = scheduler.getTriggersOfJob(fooJob.getName(),
        fooJob.getGroup());

scheduler.addJob(fooJob, true); //true指明替换已有Job(没有关联Trigger)

//清除旧Trigger,重新建立Job和Trigger关联
for (Trigger trigger : triggers) {
    scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(), trigger);
} 
 

 

你可能感兴趣的:(综合)