Quartz 框架的应用

本文将简单介绍在没有 Spring 的时候..如何来使用 Quartz...

这里跳过 Quartz 的其他介绍。如果想更加输入的了解 Quartz,大家可以点击下载Quartz的帮助文档。

Quartz 和 Web 集成应用

第一步: 导入quartz包..这个不用说吧..放到工程的 lib 下面即可

第二步: 添加相应文件和修改web.xml文件的配置.

添加 quartz.properties 和 quartz_jobs.xml 到 src 下面

quartz.properties文件如下:

#----------调度器属性-------------
org.quartz.scheduler.instanceName = QuartzScheduler
org.quartz.scheduler.instanceId = AUTO

#------------线程配置------------------
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 5

#---------------作业存储设置---------------
org.quartz.jobStore.class=org.quzrtz.simpl.RAMJobStore

#---------------插件配置----------------

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugins.xml.JobInitializationPlugin = quartz_jobs.xml     

org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.validating = false
org.quartz.plugin.jobInitializer.failOnFileNotFound =true  

quartz_jobs.xml 文件如下

<?xml version="1.0" encoding="UTF-8"?>
<quartz>
    <job>  

        <job-detail>
            <name>GatherJob</name>
            <group>DEFAULT</group>
            <description>GatherJob</description>
            <job-class>net.sf.rain.gather.quartz.GatherJob</job-class>
            <volatility>false</volatility>
            <durability>false</durability>
            <recover>false</recover>
        </job-detail>  

        <trigger>
            <cron>
                <name>RunQuartzJobTrigger</name>
                <group>DEFAULT</group>
                <description>RunQuartzJobTrigger</description>
                <job-name>RunQuartzJob</job-name>
                <job-group>DEFAULT</job-group>
                <!--  <cron-expression>0/60 * * * * ?</cron-expression> -->
                <cron-expression>0 0 3 * * ?</cron-expression>
            </cron>
        </trigger>  

    </job>
</quartz>  

注意文件中的配置要正确。比如 job-class 等等。

web.xml的配置:

从 2.3 版本的 Servlet API 开始,你能创建监听器,由容器在其生命周期中的某个特定时间回调。其中的一个监听器接口叫做 java.servlet.ServletContextListener,

WEB.xml

<!-- ====================== Quartz config start ====================== -->
<context-param>
    <param-name>config-file</param-name>
    <param-value>/quartz.properties</param-value>
</context-param>  

<context-param>
    <param-name>shutdown-on-unload</param-name>
    <param-value>true</param-value>
</context-param>  

<context-param>
    <param-name>start-scheduler-on-load</param-name>
    <param-value>true</param-value>
</context-param>
<!-- 默认情况下配置 Quzrtz 自带的监听器..但是真正项目开发中。我们是否开启定时任务应该是人工配置,所以我们需要自定义监听器 -->
<!--
<listener>
        <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
   </listener>
-->
<listener>
   <listener-class>
        net.sf.rain.gather.quartz.QuartzServletContextListener
   </listener-class>
</listener>   

<!-- ====================== Quartz config end ====================== -->  

下面我们将实现这个监听器   QuartzServletContextListener

package net.sf.rain.gather.quartz;  

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;  

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;  

public class QuartzServletContextListener implements ServletContextListener {  

    private static  Log _log = LogFactory.getLog(QuartzServletContextListener.class);  

    public static final String QUARTZ_FACTORY_KEY = "org.quartz.impl.StdSchedulerFactory.KEY";
    private ServletContext ctx = null;
    private StdSchedulerFactory factory = null;  

    /**
     * Called when the container is shutting down.
     */
    public void contextDestroyed(ServletContextEvent sce) {
        try {
            factory.getDefaultScheduler().shutdown();
        } catch (SchedulerException ex) {
            _log.error("Error stopping Quartz", ex);
        }
    }  

    /**
     * 容器的第一次启动时调用
     */
    public void contextInitialized(ServletContextEvent sce) {
        ctx = sce.getServletContext();
        try {
            factory = new StdSchedulerFactory();
            // Start the scheduler now
            //设置容器启动时不立即启动定时器,而是到后台人工启动
            //factory.getScheduler().start();
            _log.info("Storing QuartzScheduler Factory at" + QUARTZ_FACTORY_KEY);
            ctx.setAttribute(QUARTZ_FACTORY_KEY, factory);  

        } catch (Exception ex) {
            _log.error("Quartz failed to initialize", ex);
        }
    }  

}  

下面的Action将管理定时器的状态

package net.sf.rain.gather.quartz;  

import java.io.PrintWriter;  

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;  

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;  

/**
 *
 * 调度器管理
 *
 * @author
 *
 */
public class GatherJobAction extends  Action{  

    private static  Log _log = LogFactory.getLog(GatherJobAction.class);  

    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {  

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");  

        String action = request.getParameter("action");  

        String retMsg = "Parameter Error: action is null";
        if (StringUtils.isNotBlank(action)) {
            ServletContext ctx =  request.getSession().getServletContext();
            // Retrieve the factory from the ServletContext
            StdSchedulerFactory factory =  (StdSchedulerFactory)ctx.getAttribute(QuartzServletContextListener.QUARTZ_FACTORY_KEY);
            // Retrieve the scheduler from the factory
            Scheduler scheduler = factory.getScheduler();   

            if ("start".equals(action)) {
                // Start the scheduler
                try {
                     if (!scheduler.isStarted()) {
                         scheduler.start();
                     }
                     retMsg = "Quartz Successful to startup";
                 } catch (SchedulerException ex) {
                     _log.error("Error starting Quartz", ex);
                     retMsg = "Quartz failed to startup";
                 }
            }else if("stop".equals(action)){
                try {
                    if (scheduler.isStarted()) {
                        scheduler.shutdown();
                    }
                    retMsg = "Quartz Successful to stopping";
                 } catch (SchedulerException ex) {
                    _log.error("Error stopping Quartz", ex);
                    retMsg = "Quartz failed to stopping";
                 }
            }else { //查看调度器的状态
                if (scheduler.isStarted()) {
                    retMsg = "Quartz is Started";
                }else {
                    retMsg = "Quartz is Stoped";
                }
            }
        }
        PrintWriter out = response.getWriter();
        out.print(retMsg);
        out.flush();
        out.close();
        return null;
    }
} 
时间: 2024-08-03 04:35:11

Quartz 框架的应用的相关文章

Quartz 框架 教程(中文版)2.2.x

Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quartz 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails Quartz 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers Quartz 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger Quartz 框架 教程(中文版)2.2.x

[译]Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架

第一课:开始使用Quartz框架 在你使用调度器之前,需要借助一些具体的例子去理解(谁愿意只是猜啊?).你可以使用SchedulerFactory类来达到程序调度的目的.有一些Quartz框架的用户可能会将factory的实例存储在JNDI中,其他人为了便于举例子就直接使用factory的实例(比如下文的代码片段). 一旦调度器实例化后,它就能够启动,等待执行和关闭.需要注意的是一旦调度器调用了shutdown方法关闭后,如果不重新实例化,它就不会启动了.触发器在调度器未启动时,或是中止状态时,

Quartz框架简介

一.Quartz概述: Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性.主要用来执行定时任务,如:定时发送信息.定时生成报表等等. 二.相关术语: 三.Quartz的体系结构简介: Quartz框架主要核心组件包括调度器.触发器.作业.调度器作为作业的总指挥,触发器作为作业的操作者,作业为应用的功能模块.其关系如下图所示: Job为作业的接口,为任务调度

JSP中(servlet)如何使用定时作业Quartz框架

以下介绍的是在JSP或者servlet中使用定时作业Quartz框架,这篇文章是我大学第二次实习时写的,当时带我的师傅维护一个旧业务系统时需要定时作业处理,因为我之前大三实习的时候接触过,知道有这么个东西,所以师傅交给我处理,特意给我说让我整理出一个文档来交给他作为以后他的参考,因为之前是在spring中集成的,那比较简单实现,现在让我在JSP中实现,不是想象的那么顺利,利用一晚上搞定了,以下为我为师傅整理的参考文档,特意翻出来和分享给大家: 目录 1.JSP项目中引入4个jar包 1 2.we

spring 基于quartz框架实现定时周期执行

Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.本系统结合通过 Spring 来集成 Quartz . 别忘了spring中的jar包哦 quartz-all.zip 项目中使用到 在网上收集整理了一番 package com.task.quartz; import java.text.SimpleDateFormat; import java.u

Spring+Quartz框架实现定时任务(集群,分布式)

1.定时任务的必要性: 定时任务在应用中的重要性不言而喻,大多是应用,特别是金融应用更是离不开定时任务,能用定时任务来处理异常订单,完成跑批,定时活动(双11)等.在初期应用的访问量并不是那么大,一台服务器完全满足使用,但是随着用户量.业务量的逐日增加,应用中会有很多定时任务需要执行,一台服务器已经不能满足使用,因此需要把应用给部署到集群中,前端通过nginx代理实现访问. 2.集群使用定时任务的问题:目前大部分在集群中处理定时任务的方式不是正真的分布式处理方式,而是一种伪分布式,这种方式存在一

java 框架-spring 整合 quartz 框架 service层 注入不了job 类

    1.  spring  + quartz  启动 停止 添加job 功能  一 maven添加quartz  的jar 二 代码区 applicationContext.xml  导入 quartz.xml   <import resource="classpath:spring/quartz.xml"/> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns

Spring整合Quartz框架实现定时任务跑批(Maven完整版)

Quartz 介绍Quartz is a full-featured, open source job scheduling service that can be integrated with, or used along side virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to

Quartz学习总结(1)——Spring集成Quartz框架

一.Quartz简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序.Jobs可以做成标准的Java组件或 EJBs.Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多对多关系,

Quartz框架

Quartz是一个任务调度框架. 一个简单的示例(基于Quartz 2.2.1): 文件一QuartzTest: package com.test.quartz; import static org.quartz.DateBuilder.newDate; import static org.quartz.JobBuilder.newJob; import static org.quartz.SimpleScheduleBuilder.simpleSchedule; import static o