Quartz

任務調度

在企業級應用中,常常會制定一些「計劃任務」,即在某個時間點作某件事情 核心是以時間爲關注點,即在一個特定的時間點,系統執行指定的一個操做 任務調度涉及多線程併發、線程池維護、運行時間規則解析、運行現場的保護以恢復等方面 Quartz框架是一個開源的企業級任務調度服務,已經被做爲任務調度的良好解決方案.java

Quartz框架核心

Quartz對任務調度進行了高度抽象,提出了3個核心概念,並在org.quartz包中經過接口和類進行了描述多線程

任務:就是執行的工做內容。Quartz提供Job接口來支持任務定義併發

觸發器:定義觸發Job執行的時間觸發規則。Quartz提供Trigger類及其子類支持觸發器功能框架

調度器:Quartz提供了Scheduler接口,將工做任務和觸發器綁定,保證任務能夠在正確的時間執行ide

運行環境測試

任務調度ui

任務執行
this

任務持久化spa

事務線程

集羣

監聽器和插進

Quartz案例

 

1.找到Quartz框架的jar包

2.開始建立entity實體層定義任務的模板

複製代碼
package cn.entity;

public class Plan {
      //時間
    private String date;
    //任務
    private String task;
    
    public Plan() {
        super();
    }
    
    public Plan(String date, String task) {
        super();
        this.date = date;
        this.task = task;
    }

    @Override
    public String toString() {
        return "Plan [date=" + date + ", task=" + task + "]";
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public String getTask() {
        return task;
    }
    public void setTask(String task) {
        this.task = task;
    }
    
}
複製代碼

 

 

3.定製一個泛型集合用戶存儲多個Plan對象,提供一個方法讀取該泛型集合中的data

複製代碼
package cn.service;

import java.util.ArrayList;
import java.util.List;

import cn.entity.Plan;
/**
 * 提醒服務類
 * @author
 *
 */
public class RemindService {
     //01.建立一個集合,而且方法返回值是一個集合類型
    public List<Plan> getPlansForToday(){
        List<Plan> list=new ArrayList<Plan>();
        Plan plan1=new Plan("2016年12月16日","2016最後一個月");
        Plan plan2=new Plan("2016年12月18日","Quartz");
        
        list.add(plan1);
        list.add(plan2);
        
        return list;
    }
    
    
    //02.用來打印集合中提醒內容的方法
    public void printMessage(){
        List<Plan> list = getPlansForToday();
        for (Plan plan : list) {
            //單個的plan
            System.out.println("計劃的時間"+plan.getDate()+"\t計劃內容"+plan.getTask());
        }
    }
}
複製代碼

4.提醒業務類

複製代碼
package cn.quartz;

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

import cn.service.RemindService;
/**
 * 提醒業務
 * @author
 *
 */
//讓一個普通類變成計劃
public class RemindJob implements Job {
    //植入service 對象
    private RemindService service=new RemindService();
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        service.printMessage();
    }
    public RemindService getService() {
        return service;
    }
    public void setService(RemindService service) {
        this.service = service;
    }

    
}
複製代碼

Job接口中只有一個 execute()方法,在實現類中 實現該方法以執行具體任務。   

5.真正的任務對象和觸發器對象

複製代碼
package cn.test;

import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

import cn.quartz.RemindJob;

public class MyQuartzTest {
    
    public static void tool() throws SchedulerException, InterruptedException{
        //第一步構建Job
         JobDetail job = JobBuilder.newJob(RemindJob.class)//
                 .withIdentity("job1", "group1")//
                 .build();
         
         //第二步建立Trigger
         //第一種方式  控制不太好
        /* Date runTime = DateBuilder.evenMinuteDate(new Date(System.currentTimeMillis()));
         Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")//
                 .startAt(runTime).build();*/
         
         //第二種方式  不太好
         /*Trigger trigger = TriggerBuilder.newTrigger() 
                 .withIdentity(TriggerKey.triggerKey("myTrigger", "myTriggerGroup"))
                 .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                     .withIntervalInSeconds(2)
                     .repeatForever())
                 .startAt(new Date(System.currentTimeMillis()+2000))
                 .build();*/
         
                 
         
            //第三步綁定  JOb和Trigger
           // First we must get a reference to a scheduler
           //建立調度者工廠
            SchedulerFactory sf = new StdSchedulerFactory();
          //建立一個調度者
            Scheduler sched = sf.getScheduler();
          //註冊並進行調度
            sched.scheduleJob(job, trigger);
          //啓動調度
            sched.start();
            /*Thread.sleep(3000);
             * //關閉調度
            sched.shutdown();*/
    }

    
        
    public static void main(String[] args) throws SchedulerException, InterruptedException {
        tool();
        System.out.println("呵呵");
    }
}
複製代碼

 第一種方式:

第二種方式:

 

6.使用CronTrigger

CronTrigger也是Trigger的子類

CronTrigger和SimpleTrigger的對比

CronTrigger容許用戶更精準地控制任務的運行日期和時間,而不單單是定義工做的頻度

CronTrigger經過Cron表達式定義準確的運行時間點。建立CronTrigger的語法以下:

7.Cron表達式

要使用CronTrigger,必須掌握Cron表達式

 

Cron表達式由6~7個由空格分隔的時間元素組成。第7個元素可選

 

Cron表達式的每一個字段,均可以顯式地規定一個值(如49)、一個範圍(如1-6)、一個列表(如1,3,5)或者一個通配符(如*)

 

8.Cron表達式有幾個特殊的字符,說明以下

「 - 」:中劃線,表示一個範圍

「 , 」:使用逗號間隔的數據,表示一個列表

「 * 」:表示每個值,它能夠用於全部字段。例如:在小時字段表示每小時

「 ? 」:該字符僅用於「月份中的哪一天」字段和「星期幾」字段,表示不指定值

「 / 」:一般表示爲x/y,x爲起始值,y表示值的增量。

「 L 」:表示最後一天,僅在日期和星期字段中使用

「 # 」:只能用於「星期幾」字段,表示這個月的第幾個周幾。例如:「6#3」指這個月第三個週五

 

9.Cron表達式案例

 

 

測試:

複製代碼
package cn.test;

import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

import cn.quartz.RemindJob;

public class MyQuartzTest {
    
    public static void tool() throws SchedulerException, InterruptedException{
        //第一步構建Job
         JobDetail job = JobBuilder.newJob(RemindJob.class)//
                 .withIdentity("job1", "group1")//
                 .build();
         
         //第二步建立Trigger
        /**
         * 2016年每個月的第三個星期六上午10:18觸發 0 18 10 ? * 6#3 2016
         */
        CronTrigger trigger=TriggerBuilder.newTrigger()//
                .withIdentity("myTrigger", "myTriggerGroup")//
                .withSchedule(CronScheduleBuilder.//
                        cronSchedule("0 18 10 ? * 6#3 2016")).build();
         
         
            //第三步綁定  JOb和Trigger
           // First we must get a reference to a scheduler
           //建立調度者工廠
            SchedulerFactory sf = new StdSchedulerFactory();
          //建立一個調度者
            Scheduler sched = sf.getScheduler();
          //註冊並進行調度
            sched.scheduleJob(job, trigger);
          //啓動調度
            sched.start();
              }

    
        
    public static void main(String[] args) throws SchedulerException, InterruptedException {
        tool();
        System.out.println("呵呵");
    }
}
複製代碼

相關文章
相關標籤/搜索