org.quartz-scheduler 動態添加自動任務


1.添加pom.xml

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>

 

2.添加配置文件,或者不添加使用默認也行,默認線程池數量為10

打開quartz的jar包,可以找到該配置  quartz.properties

復制到資源目錄下修改如下

org.quartz.scheduler.instanceName: DemoQuartz
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
#線程池數量
org.quartz.threadPool.threadCount: 1
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

org.quartz.jobStore.misfireThreshold: 60000

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

 


3.編寫job
DemoJob.class,HelloJob.class
實現接口 org.quartz.Job

package com.yun.base.job;

import java.util.Calendar;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloJob implements Job {
    
    private static final Logger LOGGER =  LoggerFactory.getLogger(HelloJob.class);

    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        try {
            LOGGER.info(context.getScheduler().getSchedulerName());
            String jobParam = (String) context.getJobDetail().getJobDataMap().get("jobParam");
            if (jobParam != null) {
                LOGGER.info(jobParam.toString());
            }
            LOGGER.info(Integer.toString(Calendar.getInstance().get(Calendar.SECOND)));
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

}

4.編寫任務管理工具類 JobSchedule

package com.yun.util;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JobSchedule {

    private static final Logger LOGGER = LoggerFactory.getLogger(JobSchedule.class);

    private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
    private static String JOB_GROUP_NAME = "YUN_JOBGROUP_NAME";
    private static String TRIGGER_GROUP_NAME = "YUN_TRIGGERGROUP_NAME";

    private JobSchedule(){
        
    }
    
    /**
     * @Description: 添加一個定時任務,使用默認的任務組名,觸發器名,觸發器組名
     * 
     * @param jobName
     *            任務名
     * @param cls
     *            任務
     * @param cron
     *            時間設置,參考quartz說明文檔
     * @throws SchedulerException
     * 
     */
    public static void addJob(String jobName, Class cls, String cron)
            throws SchedulerException {
        Scheduler sched = gSchedulerFactory.getScheduler();

        // 用於描敘Job實現類及其他的一些靜態信息,構建一個作業實例
        JobDetail jobDetail = JobBuilder.newJob(cls)
                .withIdentity(jobName, JOB_GROUP_NAME).build();
        
        // 構建一個觸發器,規定觸發的規則
        Trigger trigger = TriggerBuilder.newTrigger()// 創建一個新的TriggerBuilder來規范一個觸發器
                .withIdentity(jobName, TRIGGER_GROUP_NAME)// 給觸發器起一個名字和組名
                .startNow()// 立即執行
                .withSchedule(CronScheduleBuilder.cronSchedule(cron)) // 觸發器的執行時間
                .build();// 產生觸發器

        sched.scheduleJob(jobDetail, trigger);
        LOGGER.debug("添加任務:{},{},{}",jobName,cls,cron);
        // 啟動
        if (!sched.isShutdown()) {
            sched.start();
        }
    }

    /**
     * @Description: 添加一個定時任務
     * 
     * @param jobName
     *            任務名
     * @param jobGroupName
     *            任務組名
     * @param triggerName
     *            觸發器名
     * @param triggerGroupName
     *            觸發器組名
     * @param jobClass
     *            任務
     * @param cron
     *            時間設置,參考quartz說明文檔
     */
    public static void addJob(String jobName, String jobGroupName,
            String triggerName, String triggerGroupName, Class cls, String cron)
            throws SchedulerException {

        Scheduler sched = gSchedulerFactory.getScheduler();
        // 用於描敘Job實現類及其他的一些靜態信息,構建一個作業實例
        JobDetail jobDetail = JobBuilder.newJob(cls)
                .withIdentity(jobName, jobGroupName).build();

        // 構建一個觸發器,規定觸發的規則
        Trigger trigger = TriggerBuilder.newTrigger()// 創建一個新的TriggerBuilder來規范一個觸發器
                .withIdentity(jobName, triggerGroupName)// 給觸發器起一個名字和組名
                .startNow()// 立即執行
                .withSchedule(CronScheduleBuilder.cronSchedule(cron)) // 觸發器的執行時間
                .build();// 產生觸發器

        sched.scheduleJob(jobDetail, trigger);
        LOGGER.debug("添加任務:{},{},{},{},{},{}",jobName,jobGroupName,triggerName,triggerGroupName,cls,cron);
        // 啟動
        if (!sched.isShutdown()) {
            sched.start();
        }

    }

    /**
     * @Description: 修改一個任務的觸發時間(使用默認的任務組名,觸發器名,觸發器組名)
     * 
     * @param jobName
     * @param cron
     * @throws SchedulerException 
     * 
     */
    public static void modifyJobTime(String jobName, String cron) throws SchedulerException {
        Scheduler sched = gSchedulerFactory.getScheduler();
        TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);
        CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
        if (trigger == null) {
            return;
        }
        String oldTime = trigger.getCronExpression();
        if (!oldTime.equalsIgnoreCase(cron)) {
            JobDetail jobDetail = sched.getJobDetail(new JobKey(jobName,
                    JOB_GROUP_NAME));
            Class objJobClass = jobDetail.getJobClass();
            removeJob(jobName);
            addJob(jobName, objJobClass, cron);
            LOGGER.debug("修改任務:{},{}",jobName,cron);
        }
    }

    /**
     * @Description: 移除一個任務(使用默認的任務組名,觸發器名,觸發器組名)
     * 
     * @param jobName
     * 
     * @throws SchedulerException
     */
    public static void removeJob(String jobName) throws SchedulerException {
        Scheduler sched = gSchedulerFactory.getScheduler();

        JobKey jobKey = new JobKey(jobName, TRIGGER_GROUP_NAME);
        // 停止觸發器
        sched.pauseJob(jobKey);
        sched.unscheduleJob(new TriggerKey(jobName, TRIGGER_GROUP_NAME));// 移除觸發器
        sched.deleteJob(jobKey);// 刪除任務
        LOGGER.debug("移除任務:{}",jobName);
    }

    /**
     * 移除任務
     * 
     * @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 = gSchedulerFactory.getScheduler();
        JobKey jobKey = new JobKey(jobName, jobGroupName);
        // 停止觸發器
        sched.pauseJob(jobKey);
        sched.unscheduleJob(new TriggerKey(jobName, triggerGroupName));// 移除觸發器
        sched.deleteJob(jobKey);// 刪除任務
        LOGGER.debug("移除任務:{},{},{},{},{},{}",jobName,jobGroupName,triggerName,triggerGroupName);
    }

    /**
     * 啟動所有任務
     * 
     * @throws SchedulerException
     */
    public static void startJobs() throws SchedulerException {
        Scheduler sched = gSchedulerFactory.getScheduler();
        sched.start();
        LOGGER.debug("啟動所有任務");
    }

    /**
     * 關閉所有定時任務
     * 
     * @throws SchedulerException
     * 
     */
    public static void shutdownJobs() throws SchedulerException {
        Scheduler sched = gSchedulerFactory.getScheduler();
        if (!sched.isShutdown()) {
            sched.shutdown();
            LOGGER.debug("關閉所有任務");
        }
    }

}

 

5.測試 

  @Test
    public void testTask() {
         try {  
             String job_name = "動態任務調度";  
             System.out.println("【系統啟動】開始(每1秒輸出一次)...");    
             JobSchedule.addJob(job_name, DemoJob.class, "0/1 * * * * ?");    
               
             Thread.sleep(5000);    
             System.out.println("【修改時間】開始(每2秒輸出一次)...");    
             JobSchedule.modifyJobTime(job_name, "10/2 * * * * ?");    
             Thread.sleep(6000);    
             System.out.println("【移除定時】開始...");    
             JobSchedule.removeJob(job_name);    
             System.out.println("【移除定時】成功");    
               
             System.out.println("【再次添加定時任務】開始(每10秒輸出一次)...");    
             JobSchedule.addJob(job_name, HelloJob.class, "*/10 * * * * ?");    
             Thread.sleep(60000);    
             System.out.println("【移除定時】開始...");    
             JobSchedule.removeJob(job_name);    
             System.out.println("【移除定時】成功");  
         } catch (Exception e) {  
             e.printStackTrace();  
         }  
    }

測試結果

【系統啟動】開始(每1秒輸出一次)...
2017-07-20 18:11:03.026 [main] DEBUG com.yun.util.JobSchedule - 添加任務:動態任務調度,class com.yun.base.job.DemoJob,0/1 * * * * ?
2017-07-20 18:11:03.042 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:03.042 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - 3
2017-07-20 18:11:04.001 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:04.001 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - 4
2017-07-20 18:11:05.004 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:05.004 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - 5
2017-07-20 18:11:06.008 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:06.008 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - 6
2017-07-20 18:11:07.012 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:07.012 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - 7
2017-07-20 18:11:08.012 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:08.013 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - 8
【修改時間】開始(每2秒輸出一次)...
2017-07-20 18:11:08.043 [main] DEBUG com.yun.util.JobSchedule - 移除任務:動態任務調度
2017-07-20 18:11:08.047 [main] DEBUG com.yun.util.JobSchedule - 添加任務:動態任務調度,class com.yun.base.job.DemoJob,10/2 * * * * ?
2017-07-20 18:11:08.047 [main] DEBUG com.yun.util.JobSchedule - 修改任務:動態任務調度,10/2 * * * * ?
2017-07-20 18:11:10.001 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:10.001 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - 10
2017-07-20 18:11:12.013 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:12.013 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - 12
2017-07-20 18:11:14.005 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:14.005 [DemoQuartz_Worker-1] INFO  com.yun.base.job.DemoJob - 14
【移除定時】開始...
2017-07-20 18:11:14.054 [main] DEBUG com.yun.util.JobSchedule - 移除任務:動態任務調度
【移除定時】成功
【再次添加定時任務】開始(每10秒輸出一次)...
2017-07-20 18:11:14.054 [main] DEBUG com.yun.util.JobSchedule - 添加任務:動態任務調度,class com.yun.base.job.HelloJob,*/10 * * * * ?
2017-07-20 18:11:20.010 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:11:20.010 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - 20
2017-07-20 18:11:30.006 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:11:30.006 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - 30
2017-07-20 18:11:40.004 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:11:40.005 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - 40
2017-07-20 18:11:50.007 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:11:50.007 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - 50
2017-07-20 18:12:00.010 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:12:00.010 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - 0
2017-07-20 18:12:10.000 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:12:10.000 [DemoQuartz_Worker-1] INFO  com.yun.base.job.HelloJob - 10
【移除定時】開始...
2017-07-20 18:12:14.060 [main] DEBUG com.yun.util.JobSchedule - 移除任務:動態任務調度
【移除定時】成功

 


免責聲明!

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



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