Spring - 要使用的Switch SchedulerFactoryBean

时间:2012-03-30 22:10:20

标签: java spring jdbc quartz-scheduler

我正在使用Spring的SchedulerFactoryBean在基于Spring的java应用程序中运行一些Quartz作业。目前,这是开发中的单实例应用程序,但是一旦我们开始水平扩展这个,我们就会想要使用基于jdbc的JobStore for Quartz,因此只有一个应用程序将运行给定的作业。

现在,SchedulerFactoryBean配置如下:

 <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >       
     <property name="taskExecutor" ref="taskExecutor"/>
     <property name="triggers">
         <list>
             <!-- a bunch of triggers here -->
         </list>
     <property name="applicationContextSchedulerContextKey">
         <value>applicationContext</value>
     </property>
</bean>

并且使用基于jdbc的JobStore它将看起来像这样

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
        <property name="dataSource" ref="mysqlJobDataSource"/>
        <property name="taskExecutor" ref="taskExecutor"/>
        <property name="triggers">
            <list>
                <!-- a bunch of triggers here -->
            </list>
        </property>
        <property name="applicationContextSchedulerContextKey">
            <value>applicationContext</value>
        </property>
        <property name="quartzProperties">
            <props>
                <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
                <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
                <!-- and a bunch of other quartz props -->
            </props>
        </property>
    </bean>

理想情况下,我想继续为开发人员使用默认的RAMJobStore版本(第一个),但是对于已部署的环境使用jdbc版本。但是,似乎没有一种非常好的方法可以通过像属性之类的东西在两者之间进行切换,因为jdbc存储涉及更多的配置,并且在SchedulerFactoryBean上仅存在dataSource属性意味着它尝试基于JDBC的作业商店。

此外,由于SchedulerFactoryBean是初始化bean,初始化基本上开始运行所有作业,所以我不能将配置文件中定义的那些bean加载到spring上下文中,这意味着我将拥有并行作业运行。

我也阅读了this answer,但这种情况不同之处在于我正在处理两个不应该同时在同一个上下文中的InitializingBeans。

在SchedulerFactoryBean的这两个配置之间配置切换的最简单方法是什么?

2 个答案:

答案 0 :(得分:6)

从Spring 3.1开始,您可以使用Spring配置文件:

<bean name="schedulerFactoryBean" profile="dev" ...

<bean name="schedulerFactoryBean" profile="prd" ...

然后,您可以指示Spring容器使用哪个配置文件,请参阅How to set active spring 3.1 environment profile via a properites file and not via an env variable or system propertySpring autowire a stubbed service - duplicate bean

如果您不能使用3.1或配置文件,解决此类问题的老派应该有两个上下文文件:schedulerContext-dev.xml和schedulerContext-prd.xml`。然后你可以有选择地导入它们:

<import resource="schedulerContext-${some.property}"/>

答案 1 :(得分:1)

更好的选择是使用quartz属性文件。作为发布的一部分,您可以在每个环境中使用不同的文件。对于所有环境来说,上下文的方式是相同的,唯一改变的是配置文件。使用maven配置文件,您可以解决它