1. 程式人生 > >專案ITP(七) javaWeb 整合 Quartz 實現動態排程 而且 持久化 專案ITP(七) javaWeb 整合 Quartz 實現動態排程 而且 持久化

專案ITP(七) javaWeb 整合 Quartz 實現動態排程 而且 持久化 專案ITP(七) javaWeb 整合 Quartz 實現動態排程 而且 持久化

專案ITP(七) javaWeb 整合 Quartz 實現動態排程 而且 持久化

原創地址:http://www.cnblogs.com/Alandre/(泥沙磚瓦漿木匠),須要轉載的,保留下!

弟子規 聖人訓 首孝弟 次謹信 泛愛眾 而親仁 有餘力 則學文

Written In The Font

須要:WEB-INF/lib/quartz-2.2.1.jar

基本步驟:

 

web.xml註冊監聽器ScheduleStartListener

註冊quartz監聽器,監聽專案是否啟動或者重新啟動.保證專案啟動或重新啟動時,全部任務會被又一次安排到任務排程中.

web.xml增加一個Listener:

<!-- 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;

複製程式碼
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 ----------------

然後時間到了

添入須要增加任務的詳細操作

原創地址:http://www.cnblogs.com/Alandre/(泥沙磚瓦漿木匠),須要轉載的,保留下!

弟子規 聖人訓 首孝弟 次謹信 泛愛眾 而親仁 有餘力 則學文

Written In The Font

須要:WEB-INF/lib/quartz-2.2.1.jar

基本步驟:

 

web.xml註冊監聽器ScheduleStartListener

註冊quartz監聽器,監聽專案是否啟動或者重新啟動.保證專案啟動或重新啟動時,全部任務會被又一次安排到任務排程中.

web.xml增加一個Listener:

<!-- 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;

複製程式碼
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 ----------------

然後時間到了

添入須要增加任務的詳細操作