2009-02-18 14 views
6

In meiner Anwendung ist es erforderlich, Geplante Jobs in Abhängigkeit vom Typ der Anfrage (Dynamisch) erstellen zu können.Verwenden von Quartz mit Spring

Kann ich Spring weiterhin zum Erstellen und Auslösen von Jobs verwenden? Wenn ja, wie?

Jede Hilfe wäre nützlich.

Antwort

4

Betrachten Sie CronTriggerBean und JobDetailBean. Die unten abgebildete Klasse "MyJob" ist eine Instanz von QuartzJobBean. Der Cron-Ausdruck ist das, was Sie erwarten würden, aber mit Sekunden als erstem Wert.

<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

können Sie auch Frühling bekommen auf Ihre Bohnen auslösen Methoden Quarz mit (dh youdon't benötigen keine Quarz-spezifische Klassen überhaupt erstellen) mit dem MethodInvokingJobDetailFactoryBean im Paket org.springframework.scheduling.quartz

12

Da der SchedulerFactoryBean stellt ein natives Quartz Scheduler-Objekt zur Verfügung, das Sie direkt in Ihre Controller-Klasse einbinden und dann Trigger und Jobs dynamisch mit dem Scheduler-Objekt erstellen und registrieren können.

Spring selbst kann nicht für die Planung der dynamisch erstellten Jobs verwendet werden, da die Bean-Unterstützung von Spring für statisch konfigurierte Jobs verwendet wird, aber die native Quartz Scheduler-API ausreichend ist, um sie (kaum) zu verwenden. Als Auslöser für die Jobs, das ist der Job von Quartz, nicht der von Spring.

bearbeiten: entweder ich verstehe die ursprüngliche Frage nicht oder jeder andere ist. Die anderen Antworten alles ausführlich, wie statisch eine Reihe von Quarz Jobs mit Spring, aber die Frage verkabeln, waren, wie dynamisch Arbeitsplätze Zeitplan als Anträge in kommen.

+0

Ich verstehe die Frage auf die gleiche Weise. Ich habe mich auch über die Beziehung der statisch definierten Jobs und Jobs, die später erstellt werden, gewundert. –

+1

+1 für "dynamisch" - es ist die Suche, die mich hierher gebracht hat. –

3

Sie können aus this link Beispiel-Quellcode herunterladen

<?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 Jahr später und ich finde mich etwas sehr ähnlich. Wenn ich herum google, habe ich this link gefunden, das beschreibt, wie man über den JobExecutionContext Zugriff auf den Anwendungskontext von einem geplanten Job bekommt. Ich denke, ich werde einen abstrakten Job erstellen, der einen Teil der eigentlichen Job-Erstellung übernehmen kann und einen Prototyp verwendet, um die erforderlichen Services zu injizieren, wenn der Job ausgeführt werden muss.

4

Es scheint nicht sehr vollständige Informationen zu diesem Thema. So plane ich Jobs dynamisch. Natürlich könnten Sie den einfachen Trigger durch einen anderen Trigger ersetzen.

Frühling Bohnen:

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

den Job sofort erhalten einen Verweis auf den Planer und den Job ausführen zu können, eine einfache Trigger anhängen und im Scheduler, wie folgt aus:

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