Exemple Simple pour le Quartz 2.2 et Tomcat 7
Je veux créer un planificateur avec Quartz 2.2 en java application web dynamique. Je suis nouveau à cette tâche. J'ai essayé tous les tutos sur le web. J'ai essayer contexte auditeur méthode pour initialiser l'algorithme. Il ne semble pas comme travail. Le programme "hello world" ne fonctionne qu'en général l'application java. pour l'application de web de son apparence délicate.
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test.ananth</groupId>
<artifactId>test-app</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>test-app Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>servlet-api</artifactId>
<version>6.0.30</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>test-app</finalName>
</build>
de quartz.propriétés:
#org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
# Main Quartz configuration
org.quartz.scheduler.skipUpdateCheck = true
org.quartz.scheduler.instanceName = MyQuartzScheduler
org.quartz.scheduler.jobFactory.class = org.quartz.simpl.SimpleJobFactory
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#org.quartz.threadPool.threadCount = 5
HelloJob.java:
package com.test;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements Job {
public HelloJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Hello! HelloJob is executing.");
}
}
servlet.java
package com.test;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
public class MyServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1567185871113714035L;
public void init(ServletConfig cfg) {
String key = "org.quartz.impl.StdSchedulerFactory.KEY";
ServletContext servletContext = cfg.getServletContext();
StdSchedulerFactory factory = (StdSchedulerFactory) servletContext
.getAttribute(key);
//Scheduler quartzScheduler = factory.getScheduler("MyQuartzScheduler");
Scheduler sched;
try {
sched = factory.getScheduler("MyQuartzScheduler");
//sched = factory.getScheduler();//MyQuartzScheduler
sched.start();
//define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class).withIdentity("myJob",
"group1").build();
//Trigger the job to run now, and then every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(
simpleSchedule().withIntervalInSeconds(4)
.repeatForever()).build();
//Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
Web.xml:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<context-param>
<context-param>
<param-name>quartz:shutdown-on-unload</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>quartz:wait-on-shutdown</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:start-scheduler-on-load</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:config-file</param-name>
<param-value>/WEB-INF/quartz.properties</param-value>
</context-param>
<listener>
<listener-class>
org.quartz.ee.servlet.QuartzInitializerListener
</listener-class>
</listener>
<listener>
<listener-class>com.test.ApplicationStartup</listener-class>
</listener>
<display-name>Archetype Created Web Application</display-name>
</web-app>
Je suis à l'aide de maven web app archtype.
Vous devez vous connecter pour publier un commentaire.
Contenu
Projet Eclipse
Si vous utilisez un projet typique dans eclipse, l'exemple le plus simple a une structure similaire à:
Où le code de chacun des fichiers est comme suit:
web.xml
quartz.properties
quartz_data.xml
Le travail est exécuté à chaque 5 minute(s) (voir l'expression
0 0/5 * 1/1 * ? *
dans lecron-expression
tag). Si vous voulez une autre expression, vous pouvez construire avechttp://www.cronmaker.com/
TestJob.java
log4j.xml
Avec Maven
Si vous utilisez Maven, la structure pour le même projet est:
Et le fichier
pom.xml
:XML-moins
* Cela nécessite Servet 3.0+ (Tomcat 7+, Glassfish 3+, JBoss as 7)
Vous avez seulement besoin de deux fichiers:
TestJob.java
de l'exemple précédent et le suivant auditeur:Pour éviter les conflits, ne définissez pas la valeur par défaut de l'écouteur dans la
web.xml
en même temps. Avec ce dernier exemple, le nombre de threads par défaut est 10. Depuis le planificateur de démarré en mode stand-by, il est nécessaire d'appelerscheduler.start();
. Le"simple"
identité est facultatif, mais vous pouvez l'utiliser pour replanifier le travail (Qui est génial!). par exemple:QuartzInitializerListener
, il implémente l'condextDestroyed
méthode. 😉contextDestroyed()
méthode tente d'arrêter le privé internescheduler
, pas celui instancié avecScheduler scheduler = factory.getScheduler();
, et sans l'éteindre manuellement dans une surchargéecontextDestroyed()
méthode, le Tomcat chaud redéployer donne l'avertissement, AVERTISSEMENT: L'application web [blabla] semble avoir commencé un thread nommé [QuartzScheduler_Worker-1] mais n'a pas l'arrêter. Ce qui est très susceptible de créer une fuite de mémoire. de la mémoire qui fuit l'ordonnanceur de threads qu'il a été incapable d'arrêter. Cheers("0 0/1 * 1/1 * ? *")
c'est à dire combien de fois est-il exécuter?