2012-03-30 4 views
2

J'utilise Spring SchedulerFactoryBean pour exécuter des travaux Quartz dans une application java Spring. Actuellement, il s'agit d'une application en instance unique en développement, mais dès que nous commencerons à la mettre à l'échelle horizontalement, nous utiliserons un JobStore basé sur jdbc pour Quartz afin que pas plus d'une application n'exécute un travail donné.Spring - Switch SchedulerFactoryBean à utiliser

En ce moment, SchedulerFactoryBean est configuré comme suit:

<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> 

et l'utilisation d'un JobStore à base de jdbc il ressemblera à ceci

<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> 

Idéalement, je voudrais continuer à utiliser la valeur par défaut Version RAMJobStore (la première) pour les développeurs, mais utilisez la version jdbc pour les environnements déployés. Cependant, il ne semble pas y avoir un très bon moyen de basculer entre les deux par quelque chose comme une propriété, car le magasin jdbc implique beaucoup plus de configuration et la simple existence de la propriété dataSource sur SchedulerFactoryBean signifie qu'il essaie un travail basé sur JDBC le magasin. Etant donné que SchedulerFactoryBean est un bean d'initialisation où l'initialisation commence à exécuter tous les jobs, je ne peux donc pas non plus avoir ces deux beans définis dans un fichier de configuration chargé dans le contexte printanier, ce qui signifie que je vais avoir des travaux parallèles en cours.

J'ai également lu this answer, mais cette situation diffère en ce sens que j'ai affaire à deux InitializingBeans qui ne devraient jamais être dans le même contexte en même temps.

Quelle serait la manière la plus simple de configurer la commutation entre ces deux configurations de SchedulerFactoryBean?

Répondre

6

Du printemps 3.1, vous pouvez utiliser les profils de printemps:

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

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

Ensuite, vous pouvez indiquer conteneur Spring profil à utiliser, voir How to set active spring 3.1 environment profile via a properites file and not via an env variable or system property et Spring autowire a stubbed service - duplicate bean.

Si vous ne pouvez pas utiliser 3.1 ou les profils, l'ancienne solution de ces problèmes consiste à avoir deux fichiers de contexte: schedulerContext-dev.xml et schedulerContext-prd.xml`. Ensuite, vous pouvez les importer sélectivement:

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

Nous sommes sur le ressort 3.0.3 malheureusement ... J'avais envisagé de le faire avec une importation conditionnelle ... ce qui pourrait être le mieux pour le moment. – whaley

1

Une meilleure option serait d'utiliser le fichier de propriétés de quartz. Dans le cadre de votre version, vous pouvez avoir différents fichiers par environnement. Le contexte est le même pour tous les environnements, la seule chose qui change est le fichier de configuration. Utilisation de profils maven vous pouvez le résoudre

Questions connexes