无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

java 组件式的任务调度---Quartz

Posted on 2009-12-13 23:29 Gavin.lee 阅读(877) 评论(0)  编辑  收藏 所属分类: SSH2 --Spring

参考:http://www.blogjava.net/steady/archive/2007/08/02/134017.html
Quartz 是一个强大的企业级 Schedule 工具,也是目前最好的开源 Schedule 工具。Spring中也集成了quartz的应用
Job:
org.quartz.Job是一个接口,只定义了void execute(JobExecutionContext context)throws JobExecutionException;一个方法。当定时任务被触发后,系统会自动调用实现了该接口的方法。
Trigger:
trigger就是触发器。Quartz有个很好的想法就是分离了任务和任务执行的条件。Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。分离的好处是:
1.你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件
2.当Trigger失效后(比如:一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。
目前的Quartz实现中,存在两种Trigger,SimpleTrigger和CronTrigger,SimpleTrigger是简单触发器,如从某日到某日,每个一定时间进行一次提醒,在这段时间内进行多少次提醒;CronTrigger是复杂触发器,用来执行calendar-like的任务,可设定一些复杂的触发规则,如每年的x月的第y个星期五,或是每个星期天的几点进行提醒。后面附加一个日常语义与cronTrigger的转化
Scheduler:
Scheduler 是一个计划集,其中可以包含多个 JobDetail 和 Trigger 组成的计划任务。
在Quartz中,我们可以通过
SchedulerFactory scheduleFactory = new StdSchedulerFactory();
Scheduler scheduler = scheduleFactory.getScheduler();
来取得scheduler,通过调用scheduler.start()来启动quartz。

具体的详细应用看(Quartz Job Scheduling Framework 中文版 V0.9.5.chm) 文档

任务调度管理类:

package com.yixun.wap.quartz;

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管理类
 
*/

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);//删除任务
    }

}


具体任务调度:
package com.yixun.wap.quartz;

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

public class TestJob implements Job {
    
public void execute(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println(
"★★★★★★★★★★★");
    }


}

任务调用测试:
package com.yixun.wap.quartz;

public class QuartzTest {

    
public static void main(String[] args) {
        TestJob job 
= new TestJob();
        String job_name 
= "11";
        
try {
            System.out.println(
"【系统启动】");
            QuartzManager.addJob(job_name, job, 
"0/5 * * * * ?");
            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();
        }

    }

}


只有注册用户登录后才能发表评论。


网站导航: