Quartz 2.2和Tomcat 7的简单示例 [英] Simple example for Quartz 2.2 and Tomcat 7

查看:124
本文介绍了Quartz 2.2和Tomcat 7的简单示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在java动态Web应用程序中使用Quartz 2.2创建一个调度程序。我是这项任务的新手。我尝试了网络上的所有教程。我尝试上下文监听器方法来初始化调度程序。它似乎不起作用。 hello world程序仅适用于一般的java应用程序。对于Web应用程序,它看起来很棘手。

I want to create a scheduler with Quartz 2.2 in java dynamic web application. I am new to this task. I tried all the tutorials around the web. I trying context listener method to initialize the scheduler. It doesn't seem like working. The hello world program only works in general java application. for web application its looks tricky.

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>

quartz.properties:

quartz.properties:

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

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 ;

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>

我正在使用maven web app archtype。

I am using maven web app archtype.

推荐答案

目录




  • Eclipse项目

  • 使用Maven

  • XML-Less

  • Contents

    • Eclipse project
    • With Maven
    • XML-Less
    • 如果您在eclipse中使用典型项目,最基本的示例具有类似于以下的结构:

      If you are using a typical project in eclipse, the most basic example has a structure similar to:

      C:.
      |
      +---src
      |   |   log4j.dtd
      |   |   log4j.xml
      |   |   quartz.properties
      |   |   quartz_data.xml
      |   |
      |   \---org
      |       \---paulvargas
      |           \---test
      |               \---quartz
      |                       TestJob.java
      |
      \---WebContent
          \---WEB-INF
              |   web.xml
              |
              \---lib
                      jta-1.1.jar
                      log4j-1.2.17.jar
                      quartz-2.1.5.jar
                      slf4j-api-1.6.5.jar
                      slf4j-log4j12-1.6.5.jar
      

      其中的代码每个文件如下:

      Where the code of each of the files is as follows:

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
          id="WebApp_ID" version="2.5">
      
          <listener>
              <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
          </listener>
      
      </web-app>
      



      quartz.properties



      quartz.properties

      # ----------------------------- Threads --------------------------- #
      # How many jobs can run at the same time?
      org.quartz.threadPool.threadCount=5
      
      # ----------------------------- Plugins --------------------------- #
      # Class to load the configuration data for each job and trigger.
      # In this example, the data is in an XML file.
      org.quartz.plugin.jobInitializer.class=org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
      



      < h3> quartz_data.xml

      quartz_data.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_2_0.xsd"
          version="1.8">
      
          <schedule>
              <job>
                  <name>TestJob</name>
                  <job-class>org.paulvargas.test.quartz.TestJob</job-class>
              </job>
              <trigger>
                  <cron>
                      <name>TestJob</name>
                      <job-name>TestJob</job-name>
                      <cron-expression>0 0/5 * 1/1 * ? *</cron-expression>
                  </cron>
              </trigger>
          </schedule>
      
      </job-scheduling-data>
      

      作业每5分钟执行一次(参见表达式 0 cron-expression 标签中的0/5 * 1/1 *?* 。如果您想要另一个表达式,可以使用 http://www.cronmaker.com/

      The job is executed every 5 minute(s) (see the expression 0 0/5 * 1/1 * ? * in the cron-expression tag). If you want another expression, you can build it with http://www.cronmaker.com/

      package org.paulvargas.test.quartz;
      
      import org.quartz.Job;
      import org.quartz.JobExecutionContext;
      import org.quartz.JobExecutionException;
      
      public class TestJob implements Job {
      
          @Override
          public void execute(final JobExecutionContext ctx)
                  throws JobExecutionException {
      
              System.out.println("Executing Job");
      
          }
      
      }
      



      log4j.xml



      log4j.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd" >
      <log4j:configuration>
      
          <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
              <layout class="org.apache.log4j.PatternLayout">
                  <param name="ConversionPattern" value="%d %-5p (%c.java:%L).%M - %m%n"/>
              </layout>
          </appender>
      
          <root>
              <priority value="TRACE" />
              <appender-ref ref="STDOUT"/>
          </root>
      
      </log4j:configuration>
      






      使用Maven



      如果您使用的是Maven,则同一项目的结构为:


      With Maven

      If you are using Maven, the structure for the same project is:

      C:.
      |   pom.xml
      |
      \---src
          \---main
              +---java
              |   \---org
              |       \---paulvargas
              |           \---test
              |               \---quartz
              |                       TestJob.java
              |
              +---resources
              |       log4j.dtd
              |       log4j.xml
              |       quartz.properties
              |       quartz_data.xml
              |
              \---webapp
                  |   index.jsp
                  |
                  \---WEB-INF
                          web.xml
      

      file 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/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>test</groupId>
          <artifactId>BasicQuartz</artifactId>
          <packaging>war</packaging>
          <version>1.0-SNAPSHOT</version>
      
          <name>BasicQuartz</name>
          <url>http://maven.apache.org</url>
      
          <dependencies>
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>servlet-api</artifactId>
                  <version>2.5</version>
                  <scope>provided</scope>
              </dependency>
              <dependency>
                  <groupId>org.quartz-scheduler</groupId>
                  <artifactId>quartz</artifactId>
                  <version>2.2.1</version>
              </dependency>
              <dependency>
                  <groupId>org.quartz-scheduler</groupId>
                  <artifactId>quartz-jobs</artifactId>
                  <version>2.2.1</version>
              </dependency>
              <dependency>
                  <groupId>javax.transaction</groupId>
                  <artifactId>jta</artifactId>
                  <version>1.1</version>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-log4j12</artifactId>
                  <version>1.7.5</version>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>2.0.2</version>
                      <configuration>
                          <source>1.5</source>
                          <target>1.5</target>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      </project>
      






      XML-less



      *这需要Servet 3.0+(Tomcat 7 +,Glassfish 3 +,JBoss AS 7)


      XML-less

      * This requires Servet 3.0+ (Tomcat 7+, Glassfish 3+, JBoss AS 7)

      您只需要两个文件:<$来自上一个示例和以下监听器的c $ c> TestJob.java :

      import javax.servlet.ServletContext;
      import javax.servlet.ServletContextEvent;
      import javax.servlet.annotation.WebListener;
      
      import org.quartz.CronScheduleBuilder;
      import org.quartz.JobBuilder;
      import org.quartz.JobDetail;
      import org.quartz.Scheduler;
      import org.quartz.Trigger;
      import org.quartz.TriggerBuilder;
      import org.quartz.ee.servlet.QuartzInitializerListener;
      import org.quartz.impl.StdSchedulerFactory;
      
      @WebListener
      public class QuartzListener extends QuartzInitializerListener {
      
          @Override
          public void contextInitialized(ServletContextEvent sce) {
              super.contextInitialized(sce);
              ServletContext ctx = sce.getServletContext();
              StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute(QUARTZ_FACTORY_KEY);
              try {
                  Scheduler scheduler = factory.getScheduler();
                  JobDetail jobDetail = JobBuilder.newJob(TestJob.class).build();
                  Trigger trigger = TriggerBuilder.newTrigger().withIdentity("simple").withSchedule(
                          CronScheduleBuilder.cronSchedule("0 0/1 * 1/1 * ? *")).startNow().build();
                  scheduler.scheduleJob(jobDetail, trigger);
                  scheduler.start();
              } catch (Exception e) {
                  ctx.log("There was an error scheduling the job.", e);
              }
          }
      
      }
      

      为避免冲突,不要同时在 web.xml 中设置默认侦听器。在最后一个示例中,默认线程数为10.由于调度程序以待机模式启动,因此需要调用 scheduler.start(); " simple" 标识是可选的,但您可以使用它来重新安排作业(非常棒!)。例如:

      To avoid conflicts, do not set the default listener in the web.xml at the same time. With this last example, the default number of threads is 10. Since the scheduler started in stand-by mode, it is necessary to call scheduler.start();. The "simple" identity is optional, but you can use it for reschedule the job (That's great!). e.g.:

      ServletContext ctx = request.getServletContext();
      StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute(QuartzListener.QUARTZ_FACTORY_KEY);
      Scheduler scheduler = factory.getScheduler();
      Trigger trigger = TriggerBuilder.newTrigger().withIdentity("simple").withSchedule(
              CronScheduleBuilder.cronSchedule(newCronExpression)).startNow().build();
      Date date = scheduler.rescheduleJob(new TriggerKey("simple"), trigger);
      

      这篇关于Quartz 2.2和Tomcat 7的简单示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆