2009-02-18 7 views
6

Dans mon application, il est nécessaire de pouvoir créer un (des) travail (s) planifié (s) en fonction du type de demande qui vient (dynamiquement). Puis-je toujours utiliser Spring pour créer et déclencher des Jobs? Si oui, comment?Utilisation de Quartz avec ressort

Toute aide serait utile.

Répondre

4

Regardez CronTriggerBean et JobDetailBean. La classe 'MyJob' simulée ci-dessous est une instance de QuartzJobBean. L'expression de cron est ce que vous attendez, mais avec des secondes comme première valeur.

<beans> 
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
     <property name="startupDelay" value="5"/> 
     <property name="waitForJobsToCompleteOnShutdown" value="false"/> 
     <property name="triggers"> 
     <list> 
      <bean class="org.springframework.scheduling.quartz.CronTriggerBean"> 
       <property name="jobDetail"> 
        <bean class="org.springframework.scheduling.quartz.JobDetailBean"> 
        <property name="jobClass" value="edu.vt.MyJob"/> 
        <property name="jobDataAsMap"> 
         <map> 
          <entry key="messageSource" value-ref="messageSource"/> 
          <entry> 
           <key><value>anotherProperty</value></key> 
           <bean class="edu.vt.MyUsefulBean"> 
           <constructor-arg index="0" value="..."/> 
           </bean> 
          </entry> 
         </map> 
        </property> 
        </bean> 
       </property> 
       <property name="cronExpression" value="0 * * * * ?"/> 
      </bean> 
     </list> 
     </property> 
    </bean> 
</beans> 
2

Vous pouvez également obtenir printemps pour déclencher des méthodes sur vos haricots en utilisant Quartz (c.-à-youdon't besoin de créer des classes spécifiques à quartz du tout) en utilisant le MethodInvokingJobDetailFactoryBean dans le package org.springframework.scheduling.quartz

12

Étant donné que la SchedulerFactoryBean expose un objet Quartz Scheduler natif, vous pouvez le câbler directement dans la classe de votre contrôleur, puis créer et enregistrer dynamiquement des triggers et des jobs avec l'objet Scheduler. Le Spring lui-même ne peut pas être utilisé pour la planification des tâches créées dynamiquement, car le support du bean de Spring sera utilisé pour les tâches configurées statiquement, mais l'API native de Quartz Scheduler est assez raisonnable pour être utilisée seule (à peine). Comme le déclenchement des emplois, le travail de Quartz, pas celui de Spring.

edit: soit je ne comprends pas la question originale, ou tout le monde est. Les autres réponses tous les détails, comment câbler statiquement une série de travaux de quartz à l'aide du printemps, mais la question était de savoir comment dynamique planifier des tâches que les demandes entrent en jeu.

+0

Je comprends la question de la même manière. Je m'interrogeais aussi sur la relation entre les emplois statiquement définis et les emplois créés plus tard. –

+1

+1 pour "dynamiquement" - c'est la recherche qui m'a amené ici. –

3

Vous pouvez télécharger le code source exemple de this link

<?xml version="1.0" encoding="UTF-8"?> 

<!-- scheduler factory --> 
<bean id="com.notary.app.invoicing.scheduler.SchedulerFactory" 
     class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
     <list> 
      <ref bean="ASFImportTrigger"/> 
     </list> 
    </property> 
    <property name="dataSource"> 
     <ref bean="datasource"/> 
    </property> 
    <property name="transactionManager"> 
     <ref bean="transactionManager"/> 
    </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.MSSQLDelegate</prop> 
      <prop key="org.quartz.jobStore.misfireThreshold">60000</prop> 
      <prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?</prop> 
      <prop key="org.quartz.plugin.triggHistory.class">org.quartz.plugins.history.LoggingTriggerHistoryPlugin</prop> 
      <prop key="org.quartz.plugin.triggHistory.triggerFiredMessage">Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss dd/MM/yyyy}</prop> 
      <prop key="org.quartz.plugin.triggHistory.triggerCompleteMessage">Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss dd/MM/yyyy} with resulting trigger instruction code: {9}</prop> 
      <prop key="org.quartz.plugin.jobHistory.class">org.quartz.plugins.history.LoggingJobHistoryPlugin</prop> 
      <prop key="org.quartz.plugin.jobHistory.jobSuccessMessage">Job {1}.{0} fired at: {2, date, dd/MM/yyyy HH:mm:ss} result=OK</prop> 
      <prop key="org.quartz.plugin.jobHistory.jobFailedMessage">Job {1}.{0} fired at: {2, date, dd/MM/yyyy HH:mm:ss} result=ERROR</prop> 
     </props> 
    </property> 
    <property name="overwriteExistingJobs" value="true"/> 
    <property name="startupDelay" value="50"/> 
    <property name="applicationContextSchedulerContextKey"> 
     <value>applicationContext</value> 
    </property> 
</bean> 

1

A année plus tard et je me retrouve à avoir quelque chose de très similaire. Googling autour, j'ai trouvé this link qui décrit l'accès au contexte de l'application à partir d'un travail planifié à travers le JobExecutionContext. Je pense que je vais créer un travail de type abstrait qui peut faire une partie de la création de travail réelle et utiliser un prototype pour injecter les services requis lorsque le travail doit être exécuté.

4

Il ne semble pas y avoir beaucoup d'informations complètes à ce sujet. C'est ainsi que je planifie les tâches dynamiquement. Bien sûr, vous pouvez remplacer le déclencheur simple par un autre déclencheur.

grains de printemps:

<bean name="dailyUpdateJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> 
    <property name="jobClass" value="com.somecompany.scheduler.DailyUpdates" /> 
</bean> 

<bean id="dailyCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 
    <property name="jobDetail" ref="dailyUpdateJob" /> 
    <!-- run every morning at 4:15 AM --> 
    <property name="cronExpression" value="00 15 04 * * ?" /> 
</bean> 

<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
     <list> 
      <ref bean="dailyCronTrigger" /> 
      <ref bean="weeklyReportsCronTrigger" /> 
     </list> 
    </property> 
    <property name="applicationContextSchedulerContextKey"> 
     <value>applicationContext</value> 
    </property> 
</bean>  

Pour exécuter le travail immédiatement obtenir une référence au planificateur et le travail, veuillez joindre un déclencheur simple et le mettre dans le programmateur, comme ceci:

@Autowired 
    SchedulerFactoryBean scheduler; 

    @Autowired 
    @Qualifier("dailyUpdateJob") 
    JobDetailFactoryBean dailyJob; 

    public void dynamicJobTrigger() throws Exception { 
     // Create a trigger for "now" 
     SimpleTrigger trigger = (SimpleTrigger) newTrigger() 
        .startAt(new Date()) 
        .forJob(dailyJob.getObject()) 
        .build(); 

     // And drop it into the scheduler for immediate execution 
     scheduler.getScheduler().scheduleJob(trigger); 
    }