2016-09-21 5 views
1

Ich spiele mit der Quarz library herum, aber ich kann nicht den Scheduler, um den Job auszuführen. Hier ist die Einrichtung:Start Quarz Scheduler automatisch beim Start von Tomcat

Ich beginne den Scheduler beim Start (von Tomcat) mit dem folgenden Eintrag in der web.xml Datei:

<servlet> 
    <servlet-name>QuartzInitializer</servlet-name> 
    <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class> 
    <init-param> 
    <param-name>config-file</param-name> 
    <param-value>quartz/quartz.properties</param-value> 
    </init-param> 
    <init-param> 
    <param-name>shutdown-on-unload</param-name> 
    <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

und den Inhalt der quartz.properties Datei:

org.quartz.scheduler.interruptJobsOnShutdownWithWait=true 

#=================================================== 
# Configure the ThreadPool 
#=================================================== 

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 10 
org.quartz.threadPool.threadPriority = 5 
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true 

#=================================================== 
# Configure the Job 
#=================================================== 

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin 
org.quartz.plugin.jobInitializer.fileNames = quartz/jobs.xml 
org.quartz.plugin.jobInitializer.failOnFileNotFound = true 
org.quartz.plugin.jobInitializer.scanInterval = 10 
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false 

der Scheduler startet mit Tomcat zusammen, wie ich aus der Log-Ausgabe sehen:

INFO: QuartzInitializer: Scheduler has been started... 
Sep 21, 2016 12:50:49 PM org.apache.catalina.core.ApplicationContext log 
INFO: QuartzInitializer: Storing the Quartz Scheduler Factory in the servlet context at key: org.quartz.impl.StdSchedulerFactory.KEY 
Sep 21, 2016 12:50:49 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-bio-8080"] 
Sep 21, 2016 12:50:49 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 2373 ms 

Das Problem ist der Quarz-Auftrag wird nie ausgelöst. Hier wird der Inhalt des jobs.xml:

<?xml version='1.0' encoding='utf-8'?> 
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd" version="1.8"> 
    <schedule> 
    <job> 
     <name>Job</name> 
     <group>Job</group> 
     <description>Testing the job</description> 
     <job-class>dev.dit.scheduler.TestJob</job-class> 
    </job> 
    <trigger> 
     <cron> 
      <name>Trigger</name> 
      <job-name>Trigger</job-name> 
      <job-group>TriggerGroup</job-group> 
      <cron-expression>0 0/5 * * * ?</cron-expression> 
     </cron> 
    </trigger> 
</schedule> 

und der Inhalt der TestJob.java Klasse:

public class TestJob implements Job { 

    @Override 
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { 
     System.out.println("Job executed!"); 
    } 
} 

Kann mir jemand sagen, warum der Testjob wird nie ausgeführt?

Dank

Antwort

1

Nach einem Tag und eine Hälfte der alle möglichen Kombination von Loggern usw. versuchen, fand ich die offensichtliche nur durch die sorgfältig jobs.xml Datei zu lesen.

Wie Sie in meinem ursprünglichen Beispiel sehen können nannte ich den Job und die Jobgruppe wie folgt aus:

<name>Job</name> 
<group>Job</group> 

aber ich Referenz nicht den Namen und die Gruppe in der Trigger-Setup:

<job-name>Trigger</job-name> 
<job-group>TriggerGroup</job-group> 

Hier ist die korrekte Einstellung der jobs.xml Datei:

<?xml version='1.0' encoding='utf-8'?> 

<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_2_0.xsd" 
    version="2.0"> 

<pre-processing-commands> 
    <delete-jobs-in-group>PROCESS_LEAD_JOB_GROUP</delete-jobs-in-group> 
    <delete-triggers-in-group>PROCESS_LEAD_TRIGGER_GROUP</delete-triggers-in-group> 
</pre-processing-commands> 

<schedule> 

    <job> 
     <name>Job</name> 
     <group>Jobs</group> 
     <description>Testing the job</description> 
     <job-class>dev.dit.scheduler.TestJob </job-class> 
    </job> 

    <trigger> 
     <cron> 
      <name>Trigger</name> 
      <job-name>Job</job-name> 
      <job-group>Jobs</job-group> 
      <cron-expression>0/10 * * * * ?</cron-expression> 
     </cron> 
    </trigger> 

</schedule> 

Ich stellte auch die log4j.properties im Classpath:

log4j.rootLogger = INFO, STDOUT, FILE 

log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender 
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout 
log4j.appender.STDOUT.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n 

Ich habe den Logger in die Auftragsdatei:

package dev.dit.scheduler; 

import org.apache.log4j.Logger; 
import org.quartz.Job; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 

public class TestJob implements Job { 

    final static Logger logger = Logger.getLogger(TestJob.class); 

    @Override 
    public void execute(JobExecutionContext context) throws JobExecutionException { 

    logger.info("Job executed!"); 
    } 
} 

Alles funktioniert jetzt. Upvote, wenn Sie diese Informationen nützlich finden.

Danke, Thomas