在一个Spring上下文中使用两个调度程序

时间:2012-12-21 07:08:31

标签: spring quartz-scheduler

我创建了一个带有两个石英调度程序的Spring应用程序,第一个具有3个触发器,第二个具有一个触发器。

所有这些触发器都设置为并发操作false。

当我运行它时,似乎只有第二个调度程序中的作业触发器才能获得 被解雇。 triggerJobB也需要很少的时间来执行。

我的问题是,在一个弹簧上下文中使用两个调度程序会导致执行问题以及它是否是一个好习惯。

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                  <ref bean="triggerJobA" />
                  <ref bean="triggerJobC" />
                  <ref bean="triggerJobD" />
            </list>
        </property>
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="triggerJobB" />
            </list>
        </property>
</bean>

1 个答案:

答案 0 :(得分:3)

您需要为每个调度程序设置名称,否则spring只会用第二个调度程序覆盖第一个调度程序。

 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="schedulerName" value="SchedulerOne"/> 
    <property name="triggers">
        <list>
              <ref bean="triggerJobA" />
              <ref bean="triggerJobC" />
              <ref bean="triggerJobD" />
        </list>
    </property>
 </bean>


 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="schedulerName" value="SchedulerTwo"/>
     <property name="triggers">
        <list>
            <ref bean="triggerJobB" />
        </list>
    </property>
 </bean>

原因是:

  

“作业执行者”实际上不是SchedulerFactoryBean。它是   调度程序bean(准确地调用它的start方法调用   聚合QuartzScheduler.start方法,触发Trigger-s,   由SchedulerFactoryBean提供。事实上这个   调度程序存储(并查找)在schedulerName下(如果   未明确设置的每个已配置的默认值都相同   SchedulerRepository中的SchedulerFactoryBean)   单(SchedulerRepository.getInstance())。

     

除非你为自己设置不同的schedulerName,否则就是这样的   SchedulerFactoryBean-s,您将始终获得相同的调度程序   和每个SchedulerFactoryBean-s

http://forum.springsource.org/showthread.php?40945-Multiple-Quartz-SchedulerFactoryBean-instances