项目ITP(七) javaWeb 整合 Quartz 实现动态调度 而且 持久化

项目ITP(七) javaWeb 整合 Quartz 实现动态调度 而且 持久化

原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),须要转载的,保留下!html

弟子规 圣人训 首孝弟 次谨信 泛爱众 而亲仁 有余力 则学文

Written In The Font

须要:WEB-INF/lib/quartz-2.2.1.jarjava

基本步骤:web

 

web.xml注册监听器ScheduleStartListener

注册quartz监听器,监听项目是否启动或者重启.保证项目启动或重启时,全部任务会被从新安排到任务调度中.spa

web.xml添加一个Listener:code

<!-- quartz监听器 -->  <listener>
    <listener-class>sedion.jeffli.wmuitp.listener.ScheduleStartListener</listener-class></listener>

 

监听器类sedion.jeffli.wmuitp.listener.ScheduleStartListener实现

监听器类主要是实现recovery各个任务,从新恢复在triggerGroups组中全部的触发器,按新的trigger从新设置job执行.顺便说下,这个异常自定义(不须要删除便可): sedion.jeffli.wmuitp.exception.QuartzException; orm

复制代码

package sedion.jeffli.wmuitp.listener;import java.util.List;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.Trigger;import org.quartz.TriggerKey;import org.quartz.impl.StdSchedulerFactory;import sedion.jeffli.wmuitp.exception.QuartzException;public class ScheduleStartListener implements ServletContextListener
{    public void contextDestroyed(ServletContextEvent sce) 
    {
        
    }    public void contextInitialized(ServletContextEvent sce) 
    {        try 
        {
            recovery();
        } 
        catch (Exception e)
        {            throw new QuartzException(" ScheduleStartListener contextInitialized ERROR!!",e);
        }
    }    

    public void recovery() 
    {
        
        Scheduler scheduler = null;        
        try {
            
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            scheduler = schedulerFactory.getScheduler();//能够经过SchedulerFactory建立一个Scheduler实例
            List<String> triggerGroups = scheduler.getTriggerGroupNames();//获取调度器中全部的触发器组
            System.out.println("调度器中全部的触发器组 size():"+triggerGroups.size());            
            if(triggerGroups != null && triggerGroups.size() != 0)//从新恢复在triggerGroups组中全部的触发器            {                for (int i = 0; i < triggerGroups.size(); i++) 
                {
                        TriggerKey triggerKey = TriggerKey.triggerKey(triggerGroups.get(i), triggerGroups.get(i));
                        System.out.println("triggerKey:"+triggerKey);
                        
                        Trigger tg = scheduler.getTrigger(triggerKey);//获取trigger
                        System.out.println(triggerKey+" -> 执行时间 :"+tg.getNextFireTime());
                        
                        scheduler.rescheduleJob(triggerKey, tg);//按新的trigger从新设置job执行                }
            }
            
            scheduler.start();
            
        } 
        catch (Exception e) 
        {            throw new QuartzException("ScheduleStartListener  recovery() Error!", e);
        }
    }
}

复制代码

 

测试案例第一步: Job 接口实现类JobTest

顾名思义,用于自定义任务,方法的实现.你能够在其中写入任意你想要在那个点上干的事情(操做数据库,前台显示等).在下面那处地方写入你想要写的:System.out.println("添入须要加入任务的具体操做"); .顺便说下,这个异常自定义(不须要删除便可):

复制代码

package test.quartz;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.JobKey;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.TriggerKey;import org.quartz.impl.StdSchedulerFactory;import sedion.jeffli.wmuitp.exception.QuartzException;public class JobTest implements Job{    
    public JobTest() {}    
  
    public void execute(JobExecutionContext context)throws JobExecutionException
    {  
        
        JobDataMap data = context.getJobDetail().getJobDataMap();
        System.out.println("data.testId : "+data.getInt("testId")); //不须要可删除
        
        try
        {
            System.out.println("添入须要加入任务的具体操做");
        }        catch (Exception e) 
        {            throw new QuartzException("JobTest execute() ERROR !!", e);
        }
    }  
    
    public static void removeJob(JobKey jobKey, TriggerKey tiKey)throws SchedulerException
    { 
        
        SchedulerFactory sf     = new StdSchedulerFactory();
        Scheduler          sched     = sf.getScheduler();  
        
        sched.pauseTrigger(tiKey);            //中止触发器  
        sched.unscheduleJob(tiKey);            //移除触发器  
        sched.deleteJob(jobKey);            //删除任务          
    } 
}

复制代码

 

测试案例第二步:QuartzTest

顾名思义,用于实现,检验.能够经过SchedulerFactory建立一个Scheduler实例,把触发器在集群节点实例命名的组只是为了区分(伐木)从什么地方定问调度从新执行此做业,若是它是正在进行时调度下去.

复制代码

package test.quartz;import static org.quartz.JobBuilder.newJob;import static org.quartz.TriggerBuilder.newTrigger;import java.util.Date;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.SimpleTrigger;import org.quartz.impl.StdSchedulerFactory;public class QuartzTest
{    public void run(String date, int id)throws Exception 
    {

        
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();//能够经过SchedulerFactory建立一个Scheduler实例        
        //设置工做详情
        JobDetail job = newJob(JobTest.class) 
            .withIdentity("job_"+id, "test"+id)         // (String name, String group)把触发器在集群节点实例命名的组只是为了区分(伐木)从什么地方定问调度从新执行此做业,若是它是正在进行时调度下去...            .requestRecovery()                             
            .build();
       
        job.getJobDataMap().put("testId", id);        //设置存储参数(不须要可删除)        
       
        Date startDate = FormatDate.stringToDateAll(date);//Date转String        //设置触发器
        SimpleTrigger trigger = (SimpleTrigger) newTrigger()
                .withIdentity("overdue"+id, "overdue"+id)//withIdentity("trigger", "group")                .startAt(startDate)
                .build();
        
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
        System.out.println("------- Start Scheduler ----------------");
    }    
    public static void main(String[] args) throws Exception 
    {
        QuartzTest quartzOverdue = new QuartzTest();
        quartzOverdue.run("2014-07-02 00:30:00",666);//666,随便的吉祥数字
    }
}

复制代码

 

这边,项目tomcat启动.这边个人主机时间是:
image

 

而后咱们运行:

public static void main(String[] args) throws Exception 
    {
        QuartzTest quartzOverdue = new QuartzTest();
        quartzOverdue.run("2014-07-02 00:30:00",666);//666,随便的吉祥数字
    }

 

看控制台:

先输出

------- Start Scheduler ----------------

而后时间到了

添入须要加入任务的具体操做
相关文章
相关标签/搜索