2016-03-28 5 views
4

Ich folge this Tutorial, um Jobs mit Spring zu planen.Wie geplante Aufträge dynamisch mit Spring (und Quarz) gestartet werden?

Im Tutorial Planung wird durch den folgenden Code gestartet:

public static void main(String args[]){ 
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml"); 
} 

Stattdessen Haupt der Verwendung i Jobs mit einer Methode starten mag, die von überall in meiner Anwendung aufgerufen werden kann, zum Beispiel:

public void startJobs() { 
    // what should this method do to start the jobs? 
} 

Kann Folgendes funktionieren?

public void startJobs() { 
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml"); 
} 

Wird dies als gute Praxis angesehen?

Grundsätzlich, was ich erreichen möchte, ist in der Lage, die Jobs zu starten, wann immer ich will (wann immer ich die startJobs() Methode aufrufen), nicht beim Start in der Hauptmethode.

Wie kann ich das tun?

Antwort

2

Ein besserer und einfacherer Weg, verwenden Sie @Scheduled Annotation.

Methode 1) unter Verwendung von Task-Scheduling feste Verzögerung in Attribute @Scheduled Annotation

@Scheduled(fixedDelay = 5000) 

Methode 2) unter Verwendung von Task-Scheduling-cron-Expression in @Scheduled Annotation

@Scheduled(cron="*/5 * * * * ?") 

Methode 3) unter Verwendung von Task-Scheduling-cron Ausdruck von Eigenschaftendatei

@Scheduled(cron = "${cron.expression}") 

Sie können sich ergänzen Beispiel here

+6

Wie ich sagte, was ich erreichen möchte, ist, die Jobs vom Code zu starten, indem ich eine Methode aufrufe, wann immer ich will. Wie kann ich manuell mit der @Scheduled-Annotation beginnen? – earthw0rmjim

+0

Was wäre, wenn Sie nicht aus Eigenschaftendateien lesen, die Sie aus der Datenbank lesen möchten? Gibt es eine Möglichkeit, den Ausdruck in der Laufzeit zu aktualisieren? – tiagocarvalho92

3

Haben Sie die Planung mit Quarz und Feder gemacht? Wenn ja, läuft es gut? Die Beispielverknüpfung, die Sie freigegeben haben, gehört zu "The Task Namespace"

Quartz verwendet Trigger-, Job- und JobDetail-Objekte, um die Planung aller Arten von Jobs zu realisieren. Für die grundlegenden Konzepte hinter Quarz, haben einen Blick auf

http://quartz-scheduler.org/documentation/quartz-2.2.x/quick-start

Um es mit Frühling zu integrieren, haben Sie einen Blick auf diese auch

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-quartz-jobdetail

XML-Konfiguration des Frühlings und Quarz.

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
     <property name="jobRepository" ref="jobRepository" /> 
</bean> 
    <bean 
     class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor"> 
     <property name="jobRegistry" ref="jobRegistry" /> 
    </bean> 

    <bean id="jobRegistry" 
     class="org.springframework.batch.core.configuration.support.MapJobRegistry" /> 

    <bean name="csvLoaderJobDetail" 
     class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> 
     <property name="jobClass" value="com.example.CSVloader.ScheduledJob" /> 
     <property name="jobDataMap"> 
      <map> 
       <entry key="csvData" value="value1" /> 
       <entry key="date" value="25/09/2015" /> 
       <entry key="csvId" value="1" /> 
       <entry key="jobName" value="csvLoadJob" /> 
       <entry key="jobLocator" value-ref="jobRegistry" /> 
       <entry key="jobLauncher" value-ref="jobLauncher" /> 
      </map> 
     </property> 
     <property name="durability" value="true" /> 
    </bean> 

    <bean id="csvLoaderTrigger" 
     class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 
     <property name="jobDetail" ref="csvLoaderJobDetail" /> 
     <property name="cronExpression" value="0 0 12 * * ?" /> 
    </bean> 

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
     <property name="jobDetails"> 
      <list> 
       <ref bean="csvLoaderJobDetail" /> 
      </list> 
     </property> 
     <property name="triggers"> 
      <list> 
       <ref bean="csvLoaderTrigger" /> 
      </list> 
     </property> 
     <property name="quartzProperties"> 
      <props> 
       <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop> 
      </props> 
     </property> 
    </bean> 

Um den Job manuell zu feuern, müssen Sie SchedulerFactoryBean im Frühling Bohne injizieren. Zuerst müssen Sie alle im Quartz-Scheduler erstellten Jobs abrufen. Dann können Sie jeden Job manuell auslösen, indem Sie Job-Schlüssel und Job-Gruppe für jeden Job verwenden.

Jetzt können Sie eine Liste von Object erstellen, die jobName und jobGroup enthalten, um einen Job manuell auszulösen.

+0

Der Link war falsch, ich habe ihn gerade bearbeitet. Mit Quarz + Feder. Mein Problem ist, dass ich nicht weiß, wie man die Jobs manuell startet (durch Aufruf einer Methode), anstatt sie beim Start der Anwendung automatisch zu starten. – earthw0rmjim

+0

Bitte schauen Sie sich meine bearbeitete Antwort an. Lassen Sie mich wissen, wenn es Ihre Anforderung erfüllt. – Dinesh

+0

@ user8, über die Antwort erfüllen Sie Ihre Anforderung? – Dinesh

Verwandte Themen