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

Pra*_*era 4 spring quartz-scheduler

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

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

当我运行此命令时,似乎只触发了第二个调度程序中的作业触发器。triggerJobB也只需很少的时间来执行。

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

<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>
Run Code Online (Sandbox Code Playgroud)

小智 5

您需要为每个调度程序设置名称,否则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>
Run Code Online (Sandbox Code Playgroud)

原因是:

“作业执行者”实际上不是SchedulerFactoryBean。SchedulerFactoryBean提供的是Scheduler bean(确切地说,调用其start方法将调用触发s的聚合QuartzScheduler.start方法)。事实上,此Scheduler存储(并查找)在SchedulerName(如果未明确设置,则对于每个已配置的SchedulerFactoryBean都具有相同的默认值)位于SchedulerRepository单例(SchedulerRepository.getInstance())中。

除非您为SchedulerFactoryBean-s设置了不同的schedulerName,否则,始终会通过每个SchedulerFactoryBean-s获得相同的调度程序

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