Quartz官方文档汉化教程1

来源:互联网 发布:html5.js 下载 编辑:程序博客网 时间:2024/06/05 15:20

所有程序代码及官方包可以在论坛里下载) Quartz是一个完整的,开源的作业调度系统,它可以被整合,也可以连同J2EE,J2SE应用程序共同应用,从最小的应用程序到大型的商业系统都可以使用。Quartz可以被用来创建简单或复杂的的作业,用来执行数十个,数百个甚至数万的调度;这些作业调度被定义为标准的JAVA组件如EJB等。Quartz调度器包含很多企业级的应用,例如JTA事务和集群。
       到底什么是作业调度,很多人依然不明白这个概念,简单介绍一下:
       你需要你的软件实现这样一个功能,固定的某个时间,比如每天早晨8点执行一个任务,或者每周一早晨执行一个任务,对我们程序员来说就是执行一段代码。这个功能实现起来其实很简单,Timer,TimerTask就可以实现,但是不是很灵活,很多需求需要自己实现。
       我们移动公司每个月月底要进行结算,这个结算?{1}*{2}工要累死人的,可以交给Quartz;一个成熟的大型软件系统总离不开数据统计,如图书管理,希望每天可以自动清算过期未还的书籍数据;一个财务软件希望定时生成各种报表.......这些都可以交给强大的Quartz来实现!
      多说无益,我一直有个观点,理论再多不如一个好理解的好例子,大家一起来通过Quartz的官方例子来学习下,当然,我做过汉化处理了,不用担心E文了,这个世界好人多啊,没办法!
      
      首先下载官方包,附件里有,不用去官方网站找了!
       懒人较多,后面附件里有基于Eclipse的代码,如果你连代码都懒的写,那就直接下载导入项目就可以运行了(注意jar包),怎么导入你都不会?你先补基础吧!
      第一个示例!
      1.新建项目QuartzL001,在src下新建log4j.xml
         <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

        <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="default" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>
        </layout>
        </appender>


        <logger name="org.quartz">
            <level value="debug" />
        </logger>

        <root>
            <level value="debug" />
            <appender-ref ref="default" />
        </root>

  
       </log4j:configuration>

       2.导入如下包,用MyEclipse导入javaee.jar,JDK所有包,quartz-1.6.0.jar,commons-logging.jar,log4j.jar,commons-collections.jar。
       3.新建HelloJob类
       package com.zbaccp;
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;


public class HelloJob implements Job {

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

    public HelloJob() {
    }
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
        // 输出Hello World! -和具体时间
        _log.info("Hello World! - " + new Date());
    }
}
         新建SimpleExample类
     package com.zbaccp;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleExample {
   
    public void run() throws Exception {
        Log log = LogFactory.getLog(SimpleExample.class);
        log.info("------- 初始化 ----------------------");
        // 首先必须得到一个调度器Scheduler
        SchedulerFactory sf = new StdSchedulerFactory();//不用我说了,工厂模式
        Scheduler sched = sf.getScheduler();
        log.info("------- 初始化结束 -----------");
        log.info("------- 调度开始 -------------------");
        // 得到当前时间的下一分钟,比如当前时间14:30:14,下一分钟即14:31:00
        Date runTime = TriggerUtils.getEvenMinuteDate(new Date());
        // 定义一个作业让他和HelloJob产生关联
        JobDetail job = new JobDetail("job1", "group1", HelloJob.class);
        
        // 在下一分钟触发这个作业
        SimpleTrigger trigger =
            new SimpleTrigger("trigger1", "group1", runTime);
        
        // 告诉Quartz用我们的触发器来调度这个作业
        sched.scheduleJob(job, trigger);
        log.info(job.getFullName() + " 将在" + runTime+" 执行");  
        // 开启调度器,并不是真的启动作业(到我们指定时间才会启动)
        sched.start();
        log.info("------- 调度器启动 -----------------");
        // 等足够长的时间让调度器有机会来执行作业
        log.info("------- 等待 90 秒... -------------");
        try {
            // 等待90秒来查看jobs执行
            Thread.sleep(90L * 1000L);
            // 执行中
        } catch (Exception e) {
        }
        // 关闭调度器
        log.info("------- 关闭 ---------------------");
        sched.shutdown(true);
        log.info("------- 结束关闭 -----------------");
    }
    public static void main(String[] args) throws Exception {
        SimpleExample example = new SimpleExample();
        example.run();
    }
}
     
4.没意外的话直接运行SimpleExample,看结果。

老习惯,代码都打包了(在论坛里可以下载http://bbs.zbaccp.com/viewthread.php?tid=7223&extra=page%3D1),可以直接下载看结果,当然,推荐你还是自己配置,敲一遍,思想是大量编程中领悟的!
    还是有人不理解什么是调度,什么是作业。我简单点说吧,比如你每天早晨7点希望被手机闹铃闹醒,闹铃在固定时间响起来就是一个作业,
手机设定某个时间闹铃就是调度。在我们项目里比较常见的就是固定某个时间执行某个任务,或者间隔一定时间反复执行某个任务,举个生活中
的例子,比如我想在女朋友生日那天0点发送短信给她;又比如我想每隔1秒发送一条垃圾邮件给你(不要用quartz做坏事啊),呵呵......
    上次简单看了个例子,这次看官方示例2,由于示例2比较长,我拆开来讲解,分为a,b2部分,下次一次讲完。
    看了上次的例子,我们可以发现一些规律,所谓的作业,我们用JAVA写的时候只要实现Job接口,在execute方法内部实现我们的作业代码就
可以了。而另外一个类则是调度类,比如对于我们的作业,我们需要调度器,用调度器给我们的作业进行一定的分组,命名,指定时间,因为我
们要执行的作业可能很多,完成后就不用管了,我们的作业会在指定时间完成。
    下面我们来看示例代码:
    1.新建项目QuartzL001,在src下新建log4j.xml
         <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

        <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="default" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>
        </layout>
        </appender>


        <logger name="org.quartz">
            <level value="debug" />
        </logger>

        <root>
            <level value="debug" />
            <appender-ref ref="default" />
        </root>

  
       </log4j:configuration>

       2.导入如下包,用MyEclipse导入javaee.jar,JDK所有包,quartz-1.6.0.jar,commons-logging.jar,log4j.jar,commons-collections.jar。
       3.新建com.zbaccp.SimpleJob类
       package com.zbaccp;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
//上次的例子不知道有没有看懂,这次我们正式入门
//如果有想反复执行的动作,作业,任务就把相关的代码写在execute这个方法里,前提:实现Job这个接口
//至于SimpleJob这个类什么时候实例化,execute这个方法何时被调用,我们不用关注,交给Quartz
public class SimpleJob implements Job {

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


    public SimpleJob() {
    }


    public void execute(JobExecutionContext context)
        throws JobExecutionException {
     //这个作业只是简单的打印出作业名字和此作业运行的时间
        String jobName = context.getJobDetail().getFullName();
        _log.info("SimpleJob says: " + jobName + " executing at " + new Date());
    }

}
       4.新建com.zbaccp.SimpleTriggerExample类
package com.zbaccp;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;

import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;


public class SimpleTriggerExample {

   
    public void run() throws Exception {
        Log log = LogFactory.getLog(SimpleTriggerExample.class);

        log.info("------- 初始化 -------------------");
        // 首先我们得获得一个调度器
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        log.info("------- 初始化结束 --------");
        log.info("------- 调度一个作业,简单的说就是给一个任务定一个时间启动 ----------------");
        // 所有的作业都可以在sched.start()被调用前调度
        // 获取下个15秒的开始,如当前是10秒,则在15秒执行,如实16秒,则在30秒执行
        // 如果不喜欢这个方法,自己定义一个Date也可以
        long ts = TriggerUtils.getNextGivenSecondDate(null, 15).getTime();

     // job1将在ts这个时间触发执行,我们的作业叫job1,属于group1组
        JobDetail job = new JobDetail("job1", "group1", SimpleJob.class);
        SimpleTrigger trigger =
            new SimpleTrigger("trigger1", "group1", new Date(ts));//此处ts可以自己设置一个Date

        // 将作业加入调度队列,返回作业执行时间
        Date ft = sched.scheduleJob(job, trigger);
        
        sched.start();//调度器启动作业,相当于神舟7号点火了,具体什么时候飞天,还得看火着的速度
        log.info(job.getFullName() +
                " 将在: " + ft +  
                " 执行并且重复执行: " + trigger.getRepeatCount() +
                " 次, 每次执行间隔 " + trigger.getRepeatInterval() / 1000 + " 秒");
        
        log.info("------- 等待1分钟... ------------");
        try {
            // wait five minutes to show jobs
            Thread.sleep(1000*60);
            // executing...
        } catch (Exception e) {
        }

        log.info("------- 关闭调度器 ---------------------");
        sched.shutdown(true);
        log.info("------- 关闭结束-----------------");
    }

    public static void main(String[] args) throws Exception {
        SimpleTriggerExample example = new SimpleTriggerExample();
        example.run();

    }
}
    5.运行看结果吧

原创粉丝点击