java-框架-Quartz

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。官方网站:http://www.opensymphony.com/quartz

第三方包

通过测试。一个简单任务只需要以下几个包:commons-beanutils.jar、commons-collections.jar、commons-logging.jar、commons-digester.jar、quartz.jar即可

名称 必须/备注 网址
activation.jar 主要是 JavaMail 要用到 http://java.sun.com/products/javabeans/glasgow/jaf.html
commons-beanutils.jar 是 http://jakarta.apache.org/commons/beanutils
commons-collections.jar 是 http://jakarta.apache.org/commons/collections
commons-dbcp-1.1.jar 是,假如用到数据库作为作业存储 http://jakarta.apache.org/commons/dbcp
commons-digester.jar 是 假如你使用了某些插件,就需要它
commons-logging.jar 是 http://jakarta.apache.org/commons/logging/
commons-pool-1.1.jar http://jakarta.apache.org/commons/pool/
javamail.jar 发送 e-mail 用 http://java.sun.com/products/javamail/
jdbc2_0-stdext.jar 是,假如用到数据库作为作业存储 http://java.sun.com/products/jdbc/
jta.jar 是,假如用到数据库作为作业存储 http://java.sun.com/products/jta/database
quartz.jar 是 Quart 框架核心包
servlet.jar 假如使用了Servlet 容器,但容器中应该存在 http://java.sun.com/products/servlet/
log4j.jar 是,日志 http://logging.apache.org/

//测试main函数
//QuartzTest.java
package quartzPackage;  

import java.text.SimpleDateFormat;
import java.util.Date;  

public class QuartzTest {  

    /** *//**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SimpleDateFormat DateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        Date d = new Date();
        String returnstr = DateFormat.format(d);          

        TestJob job = new TestJob();
        String job_name ="11";
        try {
            System.out.println(returnstr+ "【系统启动】");
            QuartzManager.addJob(job_name,job,"0/2 * * * * ?"); //每2秒钟执行一次  

//            Thread.sleep(10000);
//            System.out.println("【修改时间】");
//            QuartzManager.modifyJobTime(job_name,"0/10 * * * * ?");
//            Thread.sleep(20000);
//            System.out.println("【移除定时】");
//            QuartzManager.removeJob(job_name);
//            Thread.sleep(10000);
//
//            System.out.println("/n【添加定时任务】");
//            QuartzManager.addJob(job_name,job,"0/5 * * * * ?");  

        }  catch (Exception e) {
            e.printStackTrace();
        }
    }
}  
//简单的任务管理类
//QuartzManager.java  

package quartzPackage;  

import java.text.ParseException;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;  

/** *//**
 * @Title:Quartz管理类
 *
 * @Description:
 *
 * @Copyright:
 * @author zz  2008-10-8 14:19:01
 * @version 1.00.000
 *
 */
public class QuartzManager {
   private static SchedulerFactory sf = new StdSchedulerFactory();
   private static String JOB_GROUP_NAME = "group1";
   private static String TRIGGER_GROUP_NAME = "trigger1";  

   /** *//**
    *  添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
    * @param jobName 任务名
    * @param job     任务
    * @param time    时间设置,参考quartz说明文档
    * @throws SchedulerException
    * @throws ParseException
    */
   public static void addJob(String jobName,Job job,String time)
                               throws SchedulerException, ParseException{
       Scheduler sched = sf.getScheduler();
       JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, job.getClass());//任务名,任务组,任务执行类
       //触发器
       CronTrigger  trigger =
            new CronTrigger(jobName, TRIGGER_GROUP_NAME);//触发器名,触发器组
       trigger.setCronExpression(time);//触发器时间设定
       sched.scheduleJob(jobDetail,trigger);
       //启动
       if(!sched.isShutdown())
          sched.start();
   }  

   /** *//**
    * 添加一个定时任务
    * @param jobName 任务名
    * @param jobGroupName 任务组名
    * @param triggerName  触发器名
    * @param triggerGroupName 触发器组名
    * @param job     任务
    * @param time    时间设置,参考quartz说明文档
    * @throws SchedulerException
    * @throws ParseException
    */
   public static void addJob(String jobName,String jobGroupName,
                             String triggerName,String triggerGroupName,
                             Job job,String time)
                               throws SchedulerException, ParseException{
       Scheduler sched = sf.getScheduler();
       JobDetail jobDetail = new JobDetail(jobName, jobGroupName, job.getClass());//任务名,任务组,任务执行类
       //触发器
       CronTrigger  trigger =
            new CronTrigger(triggerName, triggerGroupName);//触发器名,触发器组
       trigger.setCronExpression(time);//触发器时间设定
       sched.scheduleJob(jobDetail,trigger);
       if(!sched.isShutdown())
          sched.start();
   }  

   /** *//**
    * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
    * @param jobName
    * @param time
    * @throws SchedulerException
    * @throws ParseException
    */
   public static void modifyJobTime(String jobName,String time)
                                  throws SchedulerException, ParseException{
       Scheduler sched = sf.getScheduler();
       Trigger trigger =  sched.getTrigger(jobName,TRIGGER_GROUP_NAME);
       if(trigger != null){
           CronTrigger  ct = (CronTrigger)trigger;
           ct.setCronExpression(time);
           sched.resumeTrigger(jobName,TRIGGER_GROUP_NAME);
       }
   }  

   /** *//**
    * 修改一个任务的触发时间
    * @param triggerName
    * @param triggerGroupName
    * @param time
    * @throws SchedulerException
    * @throws ParseException
    */
   public static void modifyJobTime(String triggerName,String triggerGroupName,
                                    String time)
                                  throws SchedulerException, ParseException{
       Scheduler sched = sf.getScheduler();
       Trigger trigger =  sched.getTrigger(triggerName,triggerGroupName);
       if(trigger != null){
           CronTrigger  ct = (CronTrigger)trigger;
           //修改时间
           ct.setCronExpression(time);
           //重启触发器
           sched.resumeTrigger(triggerName,triggerGroupName);
       }
   }  

   /** *//**
    * 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
    * @param jobName
    * @throws SchedulerException
    */
   public static void removeJob(String jobName)
                               throws SchedulerException{
       Scheduler sched = sf.getScheduler();
       sched.pauseTrigger(jobName,TRIGGER_GROUP_NAME);//停止触发器
       sched.unscheduleJob(jobName,TRIGGER_GROUP_NAME);//移除触发器
       sched.deleteJob(jobName,JOB_GROUP_NAME);//删除任务
   }  

   /** *//**
    * 移除一个任务
    * @param jobName
    * @param jobGroupName
    * @param triggerName
    * @param triggerGroupName
    * @throws SchedulerException
    */
   public static void removeJob(String jobName,String jobGroupName,
                                String triggerName,String triggerGroupName)
                               throws SchedulerException{
       Scheduler sched = sf.getScheduler();
       sched.pauseTrigger(triggerName,triggerGroupName);//停止触发器
       sched.unscheduleJob(triggerName,triggerGroupName);//移除触发器
       sched.deleteJob(jobName,jobGroupName);//删除任务
   }
}  
//测试工作类
//TestJob.java  

package quartzPackage;  

import java.text.SimpleDateFormat;
import java.util.Date;  

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;  

public class TestJob implements Job {
    SimpleDateFormat DateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date d = new Date();
    String returnstr = DateFormat.format(d);    

    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println(returnstr+"");
    }  

}  

quartz 时间配置规则
格式: [秒] [分] [小时] [日] [月] [周] [年]

序号 说明 是否必填 允许填写的值 允许的通配符
1 秒 是 0-59 , - * /
2 分 是 0-59 , - * /
3 小时 是 0-23 , - * /
4 日 是 1-31 , - * ? / L W
5 月 是 1-12 or JAN-DEC , - * /
6 周 是 1-7 or SUN-SAT , - * ? / L #
7 年 否 empty 或 1970-2099 , - * /

通配符说明:
* 表示所有值. 例如:在分的字段上设置 “*”,表示每一分钟都会触发。
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为”?” 具体设置为 0 0 0 10 * ?
- 表示区间。例如 在小时上设置 “10-12”,表示 10,11,12点都会触发。
, 表示指定多个值,例如在周字段上设置 “MON,WED,FRI” 表示周一,周三和周五触发
/ 用于递增触发。如在秒上面设置”5/15” 表示从5秒开始,每增15秒触发(5,20,35,50)。在月字段上设置’1/3’所示每月1号开始,每隔三天触发一次。
L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于”7”或”SAT”。如果在”L”前加上数字,则表示该数据的最后一个。例如在周字段上设置”6L”这样的格式,则表示“本月最后一个星期五”
W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置”15W”,表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 “1W”,它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,”W”前只能设置具体的数字,不允许区间”-“).
小提示
‘L’和 ‘W’可以一组合使用。如果在日字段上设置”LW”,则表示在本月的最后一个工作日触发(一般指发工资 )

序号(表示每月的第几个周几),例如在周字段上设置”6#3”表示在每月的第三个周六.注意如果指定”#5”,正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)

小提示
周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.

常用示例:

0 0 12 * * ? 每天12点触发
0 15 10 ? * * 每天10点15分触发
0 15 10 * * ? 每天10点15分触发
0 15 10 * * ? * 每天10点15分触发
0 15 10 * * ? 2005 2005年每天10点15分触发
0 * 14 * * ? 每天下午的 2点到2点59分每分触发
0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0/5 14,18 * * ?

每天下午的 2点到2点59分(整点开始,每隔5分触发)
每天下午的 18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED 3月分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发
0 15 10 15 * ? 每月15号上午10点15分触发
0 15 10 L * ? 每月最后一天的10点15分触发
0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3 每月的第三周的星期五开始触发
0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次
0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)

时间: 2024-08-31 12:17:16

java-框架-Quartz的相关文章

写出你所知道的java框架

问题描述 一直对框架的概念有点疑问.你用过的java写的框架有哪些?哪些是现在最常用的?非java的常用框架又有哪些呢? 解决方案 解决方案二:有疑问就google.解决方案三:百度也行,google老是访问有问题.解决方案四:这问题...意义何在解决方案五:意义在于我理解框架的概念,GWT是框架吗,我觉得是解决方案六:多如牛毛,上javaeye上看,很多人在写java框架解决方案七:http://en.wikipedia.org/wiki/Framework框架不是一个十分精确的概念,一个东西

java中quartz调度在一些定时任务(job)的入门级应用

Quartz 执行详解:http://quartz-scheduler.org/   去下载相应的jar包 在maven中可直接把依赖拷贝过来复制到pom中去. 具体规则可查询quartz的文档 下面是一个非常详细的实例: 1.首先把需要执行的任务写到execute中去 并实现job package job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import or

Smooks v1.4发布 基于LGPL协议的开源Java框架

Smooks是一个开源的Java框架,用于处理"数据事件流".它常常被认为是一个转换框架并以此被用于好几个产品和项目中,包括JBoss ESB(以及其它ESB).然而究其核心,Smooks未提及"转换"或者其它相关的词汇.它的应用远不只这一点! Smooks的工作是将结构化/层次化的数据流转变成"事件"流,然后交与"访问者逻辑(Visitor Logic)"进行分析,生成结果(可选的). 那么,有哪些工作是这个工具可以完成,而

转:2016年7款最佳 Java 框架推荐

RebelLabs的一项调查显示,通过在线Java用户论坛(虚拟JUG)媒体联盟的调查统计,2016年度最佳Java框架阵容如下:数据来源:RebelLabs for Zero TurnAround Inc. 我们不会仅仅基于上面图标的对比迫使你或让你草率作出结论,但是我们会给你介绍每个概念的概述,供你分析和对比他们之间的区别,然后根据你的项目选择最完美的匹配. 1. Spring MVC 自从10多年前的第一次发布之后,SpringMVC老当益壮,继续保持着领头羊的地位.在其完全拥抱 MVC框

关于java框架学习的问题

问题描述 我现在工作一年多!由于最近公司比较闲!想学习些东西.但java框架太多不知从何学起,有ssh,springmvc等等,有些东西学了又怕用不到,,用不到就忘了.所以很迷茫不知道怎么提升自己.. 解决方案 解决方案二:用SSH搭个框架做个小系统,能注册,能登录,能改个人信息扩展:能分角色,能分权限,能加载权限会有很大受益的然后自己研究一下CSS,把页面做的好看点解决方案三:最终的是还是java基础知识,这些web框架都不重要,你有足够的基础知识学习这些东西只是弹指间的事情.java基础只是

java-实现下面JAVA框架中的,取款,存款,查询余额,开户,销户功能

问题描述 实现下面JAVA框架中的,取款,存款,查询余额,开户,销户功能 import java.util.*; public class Client { public static void main(String[] args) { boolean existed = false; Scanner in = new Scanner(System.in); while (true) { int code = displayMenu(); switch (code) { case 1: //使

一个让开发人员仅通过声明式代码的方式实现智能数据结构的Java框架

一个朋友的框架发布1.1版本,和1.0在运行时生成额外字节码不同,1.1在编译时通过maven插件生成额外字节码,因此避免了暴露微量的设计模式给用户,让用法更简单粗暴,性能也更高.很大一部分不太像框架了,而更像是java语言的扩展,是个重大升级.此外,充分吸取1.0的教训,给出架构图并,让所有文档中英文双版,避免别人不明全局.另外,不再兼容java7. 原文 - https://github.com/babyfish-ct/babyfish/blob/master/README_zh_CN.md

2016年7款最佳 Java 框架

毫无疑问,Java 是目前最为流行的编程语言之一,这里我们挖掘出了一些比较受欢迎的框架的有效信息,它们可以减轻全球软件开发人员的日常工作. RebelLabs的一项调查显示,通过在线Java用户论坛(虚拟JUG)媒体联盟的调查统计,2016年度最佳Java框架阵容如下: 数据来源:RebelLabs for Zero TurnAround Inc. 我们不会仅仅基于上面图标的对比迫使你或让你草率作出结论,但是我们会给你介绍每个概念的概述,供你分析和对比他们之间的区别,然后根据你的项目选择最完美的

求用java框架写的网上选课系统代码

问题描述 求用java框架写的网上选课系统代码 解决方案 解决方案二: 解决方案三:http://57share.net解决方案四: 解决方案五:给你你看得懂么?给你你用得了么?

学习java框架比较好的书是什么书

问题描述 学习java框架比较好的书是什么书,求大神给指点.. 解决方案 解决方案二:初学者建议看视频,有一定基础的可以看相关框架方面的数据.解决方案三:引用1楼peng_hao1988的回复: 初学者建议看视频,有一定基础的可以看相关框架方面的数据. 同意,下载免费视频看,学起来不费劲解决方案四:引用1楼peng_hao1988的回复: 初学者建议看视频,有一定基础的可以看相关框架方面的数据. 就是有点基础的,看什么书好呢?解决方案五:没买过ssh的话,前几天从图书馆借了一本,回去帮楼主看看书