利用Quartz实现定时任务

        你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果 发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用java编程吗?如果这些问题中任何一个你回答是,那么你应该使用 Quartz调度器。

旁注:Matrix目前就大量使用到了Quartz。比如,排名统计功能的实现,在Jmatrix里通过Quartz定义了一个定时调度作业,在每天凌晨一点,作业开始工作,重新统计大家的Karma和排名等。

还有,RSS文件的生成,也是通过Quartz定义作业,每隔半个小时生成一次RSS XML文件。

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

从下载连接取得Quartz的发布版本,并且解压到到本地 目录。这个下载文件包含了一个预先构建好的Quartz二进制文件(quartz.jar),你可以将它放进自己的应用中。Quartz框架只需要少数的 第三方库,并且这些三方库是必需的,你很可能已经在使用这些库了。

你要把Quartz的安装目录的

quartz.properties文件

Quartz有一个叫做 quartz.properties的配置文件,它允许你修改框架运行时环境。缺省是使用Quartz.jar里面的quartz.properties 文件。当然,你应该创建一个quartz.properties文件的副本并且把它放入你工程的classes目录中以便类装载器找到它。 quartz.properties样本文件如例1所示。

例1.quartz.properties文件允许修改Quartz运行环境:

一旦将Quartz.jar文件和第三方库加到自己的工程里面并且quartz.properties文件在工程的classes目录中,就可以创建作业了。


1. 在web.xml里面加上

<listener>
            <listener-class>package.ContextListener</listener-class>
        </listener>

这样就可以在部署的时候启动定时器。

package.ContextListener.java

package package;


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

import org.quartz.SchedulerException;

public class ContextListener implements ServletContextListener {
     

Runner qRunner = null;

 
    public void contextInitialized(ServletContextEvent arg0) {

        // init job

        // start schedule task
        try {
            qRunner = new Runner();
            qRunner.task();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void contextDestroyed(ServletContextEvent arg0) {
        try {
           // stop task
            qRunner.stop();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

}

Runner.java


import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

/**
 */
public class Runner {

    static Scheduler scheduler = null;

    public void task() throws SchedulerException {
        // Initiate a Schedule Factory
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // Retrieve a scheduler from schedule factory
        scheduler = schedulerFactory.getScheduler();

        // current time
        long ctime = System.currentTimeMillis();

        // Initiate JobDetail with job name, job group, and executable job class
        JobDetail jobDetail = new JobDetail("jobDetail1", "jobDetailGroup1",
                YourScheduleJob.class);
        // Initiate CronTrigger with its name and group name
        CronTrigger cronTrigger = new CronTrigger("cronTrigger",
                "triggerGroup1");
        try {
            // setup CronExpression
            CronExpression cexp = new CronExpression("0/180 * * * * ?");
            // Assign the CronExpression to CronTrigger
            cronTrigger.setCronExpression(cexp);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // schedule a job with JobDetail and Trigger
        scheduler.scheduleJob(jobDetail, cronTrigger);

        // start the scheduler
        scheduler.start();
    }

    public void stop() throws SchedulerException {
        scheduler.shutdown();
    }
public static void main(String args[]) {
        try {
            Runner qRunner = new Runner();
            qRunner.task();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}


YourScheduleJob.java


import java.util.Date;

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

public class YourScheduleJob implements Job {
    
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("In SimpleQuartzJob - executing its JOB at "
                + new Date() + " by " + context.getTrigger().getName());
       
        // your job here
       
    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值