`

Quartz 在 Spring 中如何动态配置时间(5)

阅读更多

转自 http://www.iteye.com/topic/399980

首先实现多个JobDeatail并注册,比如: 
引用

<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> 
... 

其次将多个JobDeatail放到一个HashMap中 
引用

<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 注入jobDeatailMap 
Java代码    
  1. @Service("schedulerService")    
  2. public class SchedulerServiceImpl implements SchedulerService {    
  3.      
  4.      private Scheduler scheduler;    
  5.      private Map<String,JobDetailBean> jobDeatailMap;    
  6.      
  7.      @Autowired    
  8.      public void setJobDeatailMap(@Qualifier("jobDeatailMap") Map<String,JobDetailBean> jobDeatailMap) {    
  9.          this.jobDeatailMap = jobDeatailMap;    
  10.      }    
  11.      @Autowired    
  12.      public void setScheduler(@Qualifier("quartzScheduler") Scheduler scheduler) {    
  13.          this.scheduler = scheduler;    
  14.      }   
  15. ...  


最后,修改SchedulerServiceImpl中的schedule方法,增加以jobDeatailMap KEY名字为参数: 
Java代码    
  1.      @Override    
  2.      public void schedule(String jobDetailName,String name, CronExpression cronExpression) {    
  3.          if (name == null || name.trim().equals("")) {    
  4.              name = UUID.randomUUID().toString();    
  5.          }    
  6.      
  7.          //这个时候JobDetail根据jobDetailName从jobDeatailMap获取  
  8.          JobDetail jobDetail = jobDeatailMap.get(jobDetailName);  
  9.          try {    
  10.              scheduler.addJob(jobDetail, true);    
  11.      
  12.              CronTrigger cronTrigger = new CronTrigger(name, Scheduler.DEFAULT_GROUP, jobDetail.getName(),    
  13.                      Scheduler.DEFAULT_GROUP);    
  14.              cronTrigger.setCronExpression(cronExpression);    
  15.              scheduler.scheduleJob(cronTrigger);    
  16.              scheduler.rescheduleJob(name, Scheduler.DEFAULT_GROUP, cronTrigger);    
  17.          } catch (SchedulerException e) {    
  18.              throw new RuntimeException(e);    
  19.          }    
  20.      }  
  21. 其它多态方法一样修改,增加jobDetailName参数。      

调用时,传不同的jobDetailName参数就可以调用不用的JobDetail。 
Java代码    
  1. SchedulerService schedulerService = (SchedulerService)springContext.getBean("schedulerService");   
  2.   
  3. schedulerService.schedule("jobDetail1","审计任务","0/10 * * ? * * *");     
  4.   
  5. schedulerService.schedule("jobDetail2","发放任务","0/10 * * ? * * *");   
  6.   
  7. schedulerService.schedule("jobDetail3","AAA任务","0/10 * * ? * * *");   

 

其实很多时候只需要一个JobDetail就可以了,也可以达到多个JobDetail一样的效果,一个JobDetail的时候可以在Trigger名称上做扩展,可以在调度任务时给Trigger名称加上不同的前缀或后缀,比如Trigger名称增加一个前缀参数, 

Java代码   
  1. @Override    
  2. public void schedule(String name, String prefix ,CronExpression cronExpression) {    
  3.     if (name == null || name.trim().equals("")) {    
  4.         name = UUID.randomUUID().toString();    
  5.     }    
  6.   
  7.     try {    
  8.         scheduler.addJob(jobDetail, true);    
  9.           
  10.         //给Trigger名秒加上前缀  
  11.         name = prefix + name;  
  12.   
  13.         CronTrigger cronTrigger = new CronTrigger(name, Scheduler.DEFAULT_GROUP, jobDetail.getName(),    
  14.                 Scheduler.DEFAULT_GROUP);    
  15.         cronTrigger.setCronExpression(cronExpression);    
  16.         scheduler.scheduleJob(cronTrigger);    
  17.         scheduler.rescheduleJob(name, Scheduler.DEFAULT_GROUP, cronTrigger);    
  18.     } catch (SchedulerException e) {    
  19.         throw new RuntimeException(e);    
  20.     }    
  21. }    



然后在QuartzJobBean中的executeInternal方法取到Trigger名秒,然后根据其前缀或后缀调用不同的业务逻辑 

Java代码   
  1. public class MyQuartzJobBean extends QuartzJobBean {    
  2.     
  3.     private SimpleService simpleService;    
  4.         
  5.     public void setSimpleService(SimpleService simpleService) {    
  6.         this.simpleService = simpleService;    
  7.     }    
  8.     
  9.     @Override    
  10.     protected void executeInternal(JobExecutionContext jobexecutioncontext) throws JobExecutionException {    
  11.         Trigger trigger = jobexecutioncontext.getTrigger();   
  12.         //取得Trigger名称,判断名称前缀或后缀调用不同的业务逻辑  
  13.         String triggerName = trigger.getName();    
  14.         if(tirggerName ...){  
  15.             simpleService.testMethod(triggerName);    
  16.         }else if(tirggerName ...){  
  17.             simpleService.testMethod2(triggerName);   
  18.         }else{  
  19.             ...  
  20.         }  
  21.     }    
  22.     
  23. }  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics