Spring - 要使用的Switch SchedulerFactoryBean

wha*_*ley 2 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>
Run Code Online (Sandbox Code Playgroud)

使用基于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>
Run Code Online (Sandbox Code Playgroud)

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

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

我也读过这个答案,但这种情况不同之处在于我正在处理两个不应该同时在同一个上下文中的InitializingBeans.

配置SchedulerFactoryBean这两种配置之间的最简单方法是什么?

Tom*_*icz 6

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

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

<bean name="schedulerFactoryBean" profile="prd" ...
Run Code Online (Sandbox Code Playgroud)

然后您可以指示Spring容器使用哪个配置文件,请参阅如何通过适当的文件而不是通过env变量或系统属性设置活动的spring 3.1环境配置文件,并且Spring自动装配一个存根服务 - 重复bean.

如果你不能使用3.1或配置文件,那么解决这些问题的老派就是有两个上下文文件:schedulerContext-dev.xml和schedulerContext-prd.xml`.然后你可以选择性地导入它们:

<import resource="schedulerContext-${some.property}"/>
Run Code Online (Sandbox Code Playgroud)