6

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

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

当我运行它时,似乎只有第二个调度程序中的作业触发器被触发。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>
4

1 回答 1

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>

这样做的原因是:

“作业执行者”实际上不是 SchedulerFactoryBean。它是由 SchedulerFactoryBean 提供的调度程序 bean(准确地说,调用它的 start 方法会调用触发 Trigger-s 的聚合 QuartzScheduler.start 方法)。事实上,这个调度器被存储(和查找)在调度器名称(如果没有明确设置,对于每个配置的调度器工厂bean具有相同的默认值)在调度器存储库单例(调度器Repository.getInstance())下。

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

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

于 2012-12-21T11:10:02.483 回答