Quartz2.2.1開發(續)

<?xml version="1.0" encoding="UTF-8"?>   

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">   

<beans>   

    <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">   

         <property name="dataSource" ref="dataSource"/>   

         <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>   

        <property name="configLocation" value="classpath:quartz.properties"/>        

         <!--這個是必須的,QuartzScheduler 延時啓動,應用啓動完後 QuartzScheduler 再啓動-->   

         <property name="startupDelay" value="30"/>           

         <!--這個是可選,QuartzScheduler 啓動時更新己存在的Job,這樣就不用每次修改targetObject後刪除qrtz_job_details表對應記錄了-->   

        <property name="overwriteExistingJobs" value="true"/>   

         <property name="jobDetails" >   

             <list>   

                 <ref bean="jobDetail"/>   

<ref bean="jobDetail2"/> 
 

            </list>      

        </property>              

    </bean>       

    <bean id="jobDetail" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   

        <!--shouldRecover屬性爲true,則當Quartz服務被停止後,再次啓動任務時會嘗試恢復執行以前未完成的全部任務-->   

        <property name="shouldRecover" value="true"/>   

        <property name="targetObject" ref="customerService"/>   

        <property name="targetMethod" value="testMethod1"/>   

    </bean>   


    <bean id="jobDetail2" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   

        <!--shouldRecover屬性爲true,則當Quartz服務被停止後,再次啓動任務時會嘗試恢復執行以前未完成的全部任務-->   

        <property name="shouldRecover" value="true"/>   

        <property name="targetObject" ref="customerService"/>   

        <property name="targetMethod" value="testMethod2"/>   

    </bean>  
    

</beans>

2.略java

3.1.1spring

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 

<beans> 
	<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
		<property name="dataSource">   
		<ref bean="dataSource" />   
		</property> 
		<property name="applicationContextSchedulerContextKey"  value="applicationContextKey" /> 
		<property name="configLocation" value="classpath:quartz.properties"/> 
	</bean> 

	<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> 
	<property name="jobClass"> 
	<value>com.sundoctor.example.service.MyQuartzJobBean</value> 
	</property> 
 
	</bean>	 
</beans>

這裏在MyQuartzJobBean中使用註解注入多個simpleService也能夠app

當咱們調用Scheduler.scheduleJob(Trigger trigger)增長一個Trigger時quartz本身就會往庫裏插入數據了,對於Trigger數據的增刪改都quartz自己持久化支持的,咱們不用關心。
添加一個 simple Trigger時往qrtz_simple_triggers寫一條記錄,同時也會往qrtz_triggers寫入一條記錄,兩個表根據trigger_name、trigger_group對應,開始時間存在qrtz_triggers表中,還有結束時間、上次執行時間、下次執行時間等都存在於qrtz_triggers表中。添加一個 cron Trigger時也同樣,同時往qrtz_cron_triggers、qrtz_triggers各寫入一條記錄dom

3.1.2ide

<bean id="jobDetail1" class="org.springframework.scheduling.quartz.JobDetailBean"> 
<property name="jobClass"> 
<value>com.sundoctor.example.service.MyQuartzJobBean1</value> 
</property>  

<bean id="jobDetail2" class="org.springframework.scheduling.quartz.JobDetailBean"> 
<property name="jobClass"> 
<value>com.sundoctor.example.service.MyQuartzJobBean2</value> 
</property>  


<bean id="jobDetail3" class="org.springframework.scheduling.quartz.JobDetailBean"> 
<property name="jobClass"> 
<value>com.sundoctor.example.service.MyQuartzJobBean3</value> 
</property>
<util:map id = "jobDeatailMap" map-class="java.util.HashMap" key-type="java.lang.String" value-type="org.springframework.scheduling.quartz.JobDetailBean"> 
<entry key="jobDetail1" ref="jobDetail1"/> 
<entry key="jobDetail2" ref="jobDetail2"/> 
<entry key="jobDetail3" ref="jobDetail3"/> 
</util:map>

而後在SchedulerService 注入jobDeatailMapthis

@Service("schedulerService")  
public class SchedulerServiceImpl implements SchedulerService {  
   
     private Scheduler scheduler;  
     private Map<String,JobDetailBean> jobDeatailMap;  
   
     @Autowired  
     public void setJobDeatailMap(@Qualifier("jobDeatailMap") Map<String,JobDetailBean> jobDeatailMap) {  
         this.jobDeatailMap = jobDeatailMap;  
     }  
     @Autowired  
     public void setScheduler(@Qualifier("quartzScheduler") Scheduler scheduler) {  
         this.scheduler = scheduler;  
     } 
...

最後,修改SchedulerServiceImpl中的schedule方法,增長以jobDeatailMap KEY名字爲參數:spa

     @Override  
     public void schedule(String jobDetailName,String name, CronExpression cronExpression) {  
         if (name == null || name.trim().equals("")) {  
             name = UUID.randomUUID().toString();  
         }  
   
         //這個時候JobDetail根據jobDetailName從jobDeatailMap獲取
         JobDetail jobDetail = jobDeatailMap.get(jobDetailName);
         try {  
             scheduler.addJob(jobDetail, true);  
   
             CronTrigger cronTrigger = new CronTrigger(name, Scheduler.DEFAULT_GROUP, jobDetail.getName(),  
                     Scheduler.DEFAULT_GROUP);  
             cronTrigger.setCronExpression(cronExpression);  
             scheduler.scheduleJob(cronTrigger);  
             scheduler.rescheduleJob(name, Scheduler.DEFAULT_GROUP, cronTrigger);  
         } catch (SchedulerException e) {  
             throw new RuntimeException(e);  
         }  
     }
其它多態方法同樣修改,增長jobDetailName參數。

調用時,傳不一樣的jobDetailName參數就能夠調用不用的JobDetail。code

SchedulerService schedulerService = (SchedulerService)springContext.getBean("schedulerService");
schedulerService.schedule("jobDetail1","審計任務","0/10 * * ? * * *");
schedulerService.schedule("jobDetail2","發聽任務","0/10 * * ? * * *");
schedulerService.schedule("jobDetail3","AAA任務","0/10 * * ? * * *");

其實不少時候只須要一個JobDetail就能夠了,也能夠達到多個JobDetail同樣的效果,一個JobDetail的時候能夠在Trigger名稱上作擴展,能夠在調度任務時給Trigger名稱加上不一樣的前綴或後綴,好比Trigger名稱增長一個前綴參數xml

     @Override  
     public void schedule(String name, String prefix ,CronExpression cronExpression) {  
         if (name == null || name.trim().equals("")) {  
             name = UUID.randomUUID().toString();  
         }  
   
         try {  
             scheduler.addJob(jobDetail, true);  
             
             //給Trigger名秒加上前綴
             name = prefix + name;
             CronTrigger cronTrigger = new CronTrigger(name, Scheduler.DEFAULT_GROUP, jobDetail.getName(),  
                     Scheduler.DEFAULT_GROUP);  
             cronTrigger.setCronExpression(cronExpression);  
             scheduler.scheduleJob(cronTrigger);  
             scheduler.rescheduleJob(name, Scheduler.DEFAULT_GROUP, cronTrigger);  
         } catch (SchedulerException e) {  
             throw new RuntimeException(e);  
         }  
     }

而後在QuartzJobBean中的executeInternal方法取到Trigger名秒,而後根據其前綴或後綴調用不一樣的業務邏輯get

 public class MyQuartzJobBean extends QuartzJobBean {  
   
     private SimpleService simpleService;  
       
     public void setSimpleService(SimpleService simpleService) {  
         this.simpleService = simpleService;  
     }  
   
     @Override  
     protected void executeInternal(JobExecutionContext jobexecutioncontext) throws JobExecutionException {  
         Trigger trigger = jobexecutioncontext.getTrigger(); 
         //取得Trigger名稱,判斷名稱前綴或後綴調用不一樣的業務邏輯
         String triggerName = trigger.getName();  
         if(tirggerName ...){
             simpleService.testMethod(triggerName);  
         }else if(tirggerName ...){
             simpleService.testMethod2(triggerName); 
         }else{
             ...
         }
     }  
   
 }
相關文章
相關標籤/搜索