Я использую Spring SchedulerFactoryBean для запуска некоторых заданий Quartz в Java-приложении на основе Spring. В настоящее время это разрабатываемое приложение с одним экземпляром, но как только мы начнем горизонтальное масштабирование, мы захотим использовать JobStore для Quartz на основе jdbc, чтобы не более одного приложения выполняло задание.
Сейчас 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>
и с использованием JobStore на основе jdbc это будет выглядеть так
<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 включает в себя гораздо больше настроек, а само существование свойства dataSource в SchedulerFactoryBean означает, что оно пытается выполнить задание на основе JDBC. хранить.
Кроме того, поскольку SchedulerFactoryBean является инициализирующим компонентом, в котором инициализация в основном начинает выполнение всех заданий, поэтому я не могу иметь оба этих компонента, определенных в файле конфигурации, загруженных в контекст Spring, что означает, что у меня будет параллельные задания запущены.
Я также прочитал этот ответ , но эта ситуация отличается тем, что я имею дело с двумя InitializingBeans, которые никогда не должны находиться в одном и том же контексте одновременно.
Какой самый простой способ настроить переключение между этими двумя конфигурациями SchedulerFactoryBean?