本文将简单介绍在没有 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;
}
}

Quartz 框架的应用的更多相关文章

  1. Quartz框架(第一版)

    任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...

  2. Quartz框架

    Quartz框架 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多 ...

  3. 【淘淘】Spring整合Quartz框架

    我在外面工作实习的时候,我们做的项目是一个日报子系统,也就是定时定点为公司生成一些报表数据还有一些数据反馈.这时候我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.当时,我做 ...

  4. java任务调度quartz框架的小例子

    quartz是一个开源的作业调度框架,当然,java可以使用Timer来实现简单任务调度的功能,但Timer是单线程的设计方案,使得一个任务延迟会影响到其他的任务.java也可以使用Scheduled ...

  5. Quartz框架简介

    一.Quartz概述: Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高 ...

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

    第一课:开始使用Quartz框架 在你使用调度器之前,需要借助一些具体的例子去理解(谁愿意只是猜啊?).你可以使用SchedulerFactory类来达到程序调度的目的.有一些Quartz框架的用户可 ...

  7. Spring框架下的定时任务quartz框架的使用

    手头的这个项目需要用到定时任务,但之前没接触过这东西,所以不太会用,从网上找资料,大致了解了一下,其实也不难.Java的定时任务实现有三种,一种是使用JDK自带的Timer那个类来实现,另一种是使用q ...

  8. Quartz框架学习(1)—核心层次结构

    Quartz框架学习 Quartz(任务调度)框架的核心组件: job:任务.即任务调度行为中所要调度的对象. trigger:触发器.是什么促使了一个任务的调度?当然是时间.这也算事件驱动类型程序. ...

  9. 使用Quartz框架定时发送预警邮件

    1.  Quartz定时发送预警邮件 1.1.   需求及实现思路 定时查询库存预警信息,一旦存在库存预警的商品,则发邮件通知相关人员 1.2.   Quartz框架 Quartz是OpenSymph ...

  10. Quartz框架多个trigger任务执行出现漏执行的问题分析--转

    原文地址:http://blog.csdn.net/dailywater/article/details/51470779 一.问题描述 使用Quartz配置定时任务,配置了超过10个定时任务,这些定 ...

随机推荐

  1. ADB理解

    在做手机测试时候,经常用到的命令就是adb.如adb shell,adb devices,adb logcat等等 那么什么是adb,怎么用呢? 一.adb adb的全称为Android Debug ...

  2. Samba服务器搭建配置

    本次环境: 服务端-centos6.8-192.168.2.200 客户端1-centos6.8-192.168.2.201 客户端2-Windows7-192.168.2.104 假设条件如下: 使 ...

  3. iOS.ReactNative-4-react-native-command-line-tool

    Command line tool: react-native 1. react-native 是一个命令行工具 1.1 react-native简介 运行以下命令: ls -lt `which re ...

  4. [学习笔记] 七步从AngularJS菜鸟到专家(7):Routing [转]

    这是"AngularJS – 七步从菜鸟到专家"系列的第七篇. 在第一篇,我们展示了如何开始搭建一个AngularaJS应用.在第四.五篇我们讨论了Angular内建的directives,上一篇了解 ...

  5. 传统MySQL+ Memcached架构遇到的问题

    实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: ...

  6. load-on-startup在web.xml中的含义

    在servlet的配置当中,<load-on-startup>1</load-on-startup>的含义是: 标记容器是否在启动的时候就加载这个servlet. 当值为0或者 ...

  7. 递推 N矩形问题

    Description 给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形,下图为高为2,宽为4的网格. Input 第一行输入一个t, 表示有t组数据,然后每行输入n,m,分别表示网格的 ...

  8. Unity5的AssetBundle的一点使用心得

    昨天一位朋友在我这里留言,想让我写点Unity5的AssetBundle心得.于是我就看了相关的介绍,和自己确切的做了一次.下面来谈谈所谓的心得. 如果你觉得自己对AssetBundle不熟悉,建议先 ...

  9. 文件和目录:access函数

    access函数是按照实际用户ID和实际组ID进行访问权限测试的: #include <unistd.h> int access( const char *pathname, int mo ...

  10. 第六天:用javascript实现购彩拆分票的计算奖金

    需求如下: 购彩金额  拆分票数  <= 10    1票<= 100    10票<= 200   20票<= 500   50票<= 1000   100票 中奖金额 ...