quartz 不同時間間隔調度任務


Quartz


 

  Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的程序。Jobs可以做成標准的Java組件或 EJBs。Quartz的最新版本為Quartz 2.3.0。

  目的:最近在想弄一下不同的時間段調度任務,不是以往那樣在相同的間隔調度,而是不同的間隔時間,參考了一下Quartz官網和一些前輩的,加上自己總結的改進的方法  

  參考文章:Quartz使用總結

  Quartz的API: http://www.quartz-scheduler.org/api/2.1.7/index.html

  jar下載地址:http://www.quartz-scheduler.org/downloads/

  Maven:

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
  </dependency>
  <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.1</version>
  </dependency>  

  主要思想:將你要想要調度的時間隔間傳入,但是是使用一個實列 

代碼:

package com.test.util;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

/**
 * @author zhouguanglin
 * @date 2018/1/6 11:17
 */
public class QuartzTest{
    private  static volatile  Scheduler scheduler=null;
    private static List<Integer> list=new ArrayList<Integer>();
    static {
        list.add(5);
        list.add(10);
        list.add(5);
        list.add(10);
    }
    //單列模式創建scheduler
    public static Scheduler getScheduler(){
        if (scheduler==null) {
            synchronized (QuartzTest.class) {
                try {
                    if (scheduler==null) {
                        scheduler = StdSchedulerFactory.getDefaultScheduler();
                    }
                } catch (SchedulerException e) {
                    e.printStackTrace();
                }
            }
        }
        return scheduler;
    }
    //任務調度
    public static Scheduler getSchedulerTask(String taskName,int time){
        Scheduler scheduler=getScheduler();

        try {
            //看是否啟動
            if (!scheduler.isStarted()){
                scheduler.start();
            }
            //運行一段時間后關閉
            Thread.sleep(time*1000);
            //定義一個Trigger
            Trigger trigger = newTrigger().withIdentity("trigger", "group") //定義name/group
                    .startAt(new Date(time))//在這個時間之后發生
            //這里還可以用withwithSchedule()來控制調度情況 其中添加simpleSchedule()來控制間隔多少執行一次,執行多少次,還是一直執行
                    .build();
            //定義一個JobDetail
            JobDetail job = newJob(QuartzTask.class) //定義Job類為QuartzTask類,這是真正的執行邏輯所在
                    .withIdentity("job", "group") //定義name/group
                    .usingJobData("name", taskName) //定義屬性
                    .usingJobData("zhou","zhouguanglin")
                    .build();
            //加入這個調度
            scheduler.scheduleJob(job, trigger);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return scheduler;
    }
    public static void main(String[] args) throws SchedulerException, InterruptedException {

       for (int j=0;j<list.size();j++) {
           getSchedulerTask("任務:"+j,list.get(j));
       }
       //最后將scheduler關閉
        if (!scheduler.isShutdown()) {
           scheduler.shutdown();
        }
    }
}

 

真正的調度的任務邏輯在這:

package com.test.util;

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

/**
 * @author zhouguanglin
 * @date 2018/1/6 15:09
 */
public class QuartzTask implements Job {
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //這里是讀取上下文,得到其中的東西,只可意會不可言傳,,,就好像Spring的感覺差不錯
        JobDetail detail = jobExecutionContext.getJobDetail();
        String name = detail.getJobDataMap().getString("name");
       String zhou=detail.getJobDataMap().getString("zhou");
        System.out.println("任務開始。。。-------name:"+name+"   zhou:"+zhou);
        System.out.println(System.currentTimeMillis());
    }
}

 

                 【版本聲明】本文為博主原創文章,轉載請注明出處

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM