Quartz之并发问题

#Spring中使用Quartz的3种方法(MethodInvokingJobDetailFactoryBean,implements Job,extends QuartzJobBean)

以下介绍一下MethodInvokingJobDetailFactoryBean方法
① targetMethod: 指定需要定时执行scheduleInfoManager中的simpleJobTest()方法
② concurrent:对于相同的JobDetail,当指定多个Trigger时, 很可能第一个job完成之前,第二个job就开始了。指定concurrent设为false,多个job不会并发运行,第二个job将不会在第一个job完成之前开始。
③ cronExpression:0/10 * * * * ?表示每10秒执行一次,具体可参考附表。
④ triggers:通过再添加其他的ref元素可在list中放置多个触发器。scheduleInfoManager中的simpleJobTest()方法注意:此方法没有参数,如果scheduleInfoManager有两个方法simpleJobTest()和simpleJobTest(String argument),则spring只会去执行无参的simpleJobTest().
public void simpleJobTest()
{         
   log.warn("uh oh, Job is scheduled !'" + "' Success...");    
}

Quartz在Spring中动态设置cronTrigger方法一Spring配置文件:
将定时器注入到业务逻辑层Manager
Xml代码
           

<!--注册job -->
 <bean id="emailJob" class="com.quartz.EmailJob"></bean>
 <!--通过反射调用job,任务详情, jobdetail -->
 <bean id="jobDetail"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <!--注入任务类 -->
  <property name="targetObject" ref="emailJob"></property>
  <!-- 指定调用那一个方法 -->
  <property name="targetMethod" value="sendMail"></property>
 </bean>
 <!-- 注册一个触发器 -->
 <bean id="emailTrigger"
  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  <!-- 注入任务详情 -->
  <property name="jobDetail" ref="jobDetail"></property>
  <!-- 调度规则,每隔5秒执行一次任务 cron表达式-->
  <property name="cronExpression">
   <value>0/5 * * * * ?</value>
  </property>
 </bean>
 <!-- 注册一个调度工厂 -->
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <!-- 注入触发器 -->
  <property name="triggers">
   <list>
    <ref bean="emailTrigger" />
   </list>
  </property>
 </bean>


scheduleInfoManager中的reScheduleJob ()方法及相关方法① reScheduleJob读取数据库,获得自定义定时器调度时间():
Java代码
private Scheduler scheduler;   
 
// 设值注入,通过setter方法传入被调用者的实例scheduler  
public void setScheduler(Scheduler scheduler) {     
     this.scheduler = scheduler;     
}     
rivate void reScheduleJob() throws SchedulerException,ParseException {  
        // 运行时可通过动态注入的scheduler得到trigger,注意采用这种注入方式在有的项目中会有问题,如果遇到注入问题,可以采取在运行方法时候,获得bean来避免错误发生。  
        CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(               "cronTrigger", Scheduler.DEFAULT_GROUP);  
        String dbCronExpression = getCronExpressionFromDB();  
        String originConExpression = trigger.getCronexpression_r();  
    // 判断从DB中取得的任务时间(dbCronExpression)和现在的quartz线程中的任务时间(originConExpression)是否相等  
    // 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob  
        if(!originConExpression.equalsIgnoreCase(dbCronExpression)){  
    

猜你喜欢

转载自blog.csdn.net/tomcatandoracle/article/details/80338917