2009-02-18 19 views
6

Nella mia applicazione è necessario essere in grado di creare processi pianificati in base al tipo di richiesta che viene (in modo dinamico).Utilizzo di quarzo con molla

Posso ancora utilizzare Spring per creare e attivare Lavori? Se sì, come?

Qualsiasi aiuto sarebbe utile.

risposta

4

Vedere CronTriggerBean e JobDetailBean. La classe "MyJob" descritta di seguito è un'istanza di QuartzJobBean. L'espressione cron è ciò che ti aspetti, ma con secondi come primo valore.

<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

È inoltre possibile ottenere primavera per attivare metodi su grani di quarzo che utilizzano (ad esempio youdon't necessario creare tutte le classi Quartz-specifici a tutti) utilizzando il MethodInvokingJobDetailFactoryBean nel pacchetto org.springframework.scheduling.quartz

12

Dato che la SchedulerFactoryBean espone un oggetto Quartz Scheduler nativo, è possibile collegarlo direttamente alla classe controller e quindi creare e registrare dinamicamente trigger e processi con l'oggetto Scheduler.

Spring non può essere utilizzato per la pianificazione dei lavori creati dinamicamente, poiché il supporto bean Spring verrà utilizzato per i lavori configurati staticamente, ma l'API Quartz Scheduler nativa è abbastanza ragionevole da utilizzare da sola (a stento). Come inizio di lavoro, il lavoro di Quartz, non quello di Spring.

modifica: o ho una comprensione errata della domanda originale o di chiunque altro. Le altre risposte tutti dettaglio come collegare staticamente una serie di posti di lavoro in quarzo con primavera, ma il problema era come dinamicamente pianificare i processi come le richieste sono disponibili in.

+0

aver capito la domanda allo stesso modo. Mi stavo anche chiedendo la relazione tra i lavori e i lavori definiti staticamente che vengono creati in seguito. –

+1

+1 per "dinamicamente" - è la ricerca che mi ha portato qui. –

3

È possibile scaricare il codice sorgente di esempio da 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 anno dopo e mi trovo a dover qualcosa di molto simile. Cercando su google, ho trovato this link che descrive come ottenere l'accesso al contesto dell'applicazione da un lavoro pianificato tramite JobExecutionContext. Penso che creerò un lavoro di tipo astratto che può fare parte della reale creazione di posti di lavoro e utilizzare un prototipo per iniettare i servizi richiesti quando il lavoro deve essere eseguito.

4

Non sembrano esserci molte informazioni complete su questo. Ecco come pianifico i lavori in modo dinamico. Ovviamente potresti sostituire il semplice trigger con qualche altro trigger.

bean Spring:

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

Per eseguire immediatamente il processo ottenere un riferimento alla pianificazione e il lavoro, collegare un semplice grilletto e metterlo in scheduler, in questo modo:

@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); 
    }