Spring - Switch SchedulerFactoryBean будет использоваться - PullRequest
2 голосов
/ 31 марта 2012

Я использую 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?

Ответы [ 2 ]

6 голосов
/ 31 марта 2012

В Spring 3.1 вы можете использовать профили Spring:

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

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

Затем вы можете указать контейнеру Spring, какой профиль использовать, см. Как установить профиль среды активной пружины 3.1 через файл свойств, а не через переменную env или системное свойство и Spring автоматически подключает заглушку услуга - дубликат бобов .

Если вы не можете использовать 3.1 или профили, старой школой решения таких проблем является наличие двух файлов контекста: schedulerContext-dev.xml и schedulerContext-prd.xml`. Затем вы можете импортировать их выборочно:

<import resource="schedulerContext-${some.property}"/>
1 голос
/ 30 мая 2012

Лучшим вариантом будет использование файла свойств кварца.В рамках вашего выпуска вы можете иметь разные файлы для каждой среды.Таким образом, контекст одинаков для всех сред, меняется только файл конфигурации.Используя профили maven, вы можете решить эту проблему

...