任务调度开源框架Quartz动态添加、修改和删除定时任务
  fztgkkRjHIsV 2023年11月19日 19 0


Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。并且还能和spring配置整合使用。Quartz在功能上远远超越了JDK自带的Timer,很好很强大!好啦,直接上代码:


/**
 * @Description: 
 *
 * @Title: QuartzManager.java
 * @Package com.joyce.quartz
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:15:52
 * @version V2.0
 */  
package com.joyce.quartz;  
  
import org.quartz.CronTrigger;  
import org.quartz.JobDetail;  
import org.quartz.Scheduler;  
import org.quartz.SchedulerFactory;  
import org.quartz.impl.StdSchedulerFactory;  
  
/**
 * @Description: 定时任务管理类
 * 
 * @ClassName: QuartzManager
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:15:52
 * @version V2.0
 */  
public class QuartzManager {  
private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();  
private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";  
private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";  
  
/**
     * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
     * 
     * @param jobName
     *            任务名
     * @param cls
     *            任务
     * @param time
     *            时间设置,参考quartz说明文档
     * 
     * @Title: QuartzManager.java
     * @Copyright: Copyright (c) 2014
     * 
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:47:44
     * @version V2.0
     */  
@SuppressWarnings("unchecked")  
public static void addJob(String jobName, Class cls, String time) {  
try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类  
// 触发器  
new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组  
// 触发器时间设定  
            sched.scheduleJob(jobDetail, trigger);  
// 启动  
if (!sched.isShutdown()) {  
                sched.start();  
            }  
catch (Exception e) {  
throw new RuntimeException(e);  
        }  
    }  
  
/**
     * @Description: 添加一个定时任务
     * 
     * @param jobName
     *            任务名
     * @param jobGroupName
     *            任务组名
     * @param triggerName
     *            触发器名
     * @param triggerGroupName
     *            触发器组名
     * @param jobClass
     *            任务
     * @param time
     *            时间设置,参考quartz说明文档
     * 
     * @Title: QuartzManager.java
     * @Copyright: Copyright (c) 2014
     * 
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:48:15
     * @version V2.0
     */  
@SuppressWarnings("unchecked")  
public static void addJob(String jobName, String jobGroupName,  
            String triggerName, String triggerGroupName, Class jobClass,  
            String time) {  
try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类  
// 触发器  
new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组  
// 触发器时间设定  
            sched.scheduleJob(jobDetail, trigger);  
catch (Exception e) {  
throw new RuntimeException(e);  
        }  
    }  
  
/**
     * @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
     * 
     * @param jobName
     * @param time
     * 
     * @Title: QuartzManager.java
     * @Copyright: Copyright (c) 2014
     * 
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:49:21
     * @version V2.0
     */  
@SuppressWarnings("unchecked")  
public static void modifyJobTime(String jobName, String time) {  
try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
            CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);  
if (trigger == null) {  
return;  
            }  
            String oldTime = trigger.getCronExpression();  
if (!oldTime.equalsIgnoreCase(time)) {  
                JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);  
                Class objJobClass = jobDetail.getJobClass();  
                removeJob(jobName);  
                addJob(jobName, objJobClass, time);  
            }  
catch (Exception e) {  
throw new RuntimeException(e);  
        }  
    }  
  
/**
     * @Description: 修改一个任务的触发时间
     * 
     * @param triggerName
     * @param triggerGroupName
     * @param time
     * 
     * @Title: QuartzManager.java
     * @Copyright: Copyright (c) 2014
     * 
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:49:37
     * @version V2.0
     */  
public static void modifyJobTime(String triggerName,  
            String triggerGroupName, String time) {  
try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
            CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);  
if (trigger == null) {  
return;  
            }  
            String oldTime = trigger.getCronExpression();  
if (!oldTime.equalsIgnoreCase(time)) {  
                CronTrigger ct = (CronTrigger) trigger;  
// 修改时间  
                ct.setCronExpression(time);  
// 重启触发器  
                sched.resumeTrigger(triggerName, triggerGroupName);  
            }  
catch (Exception e) {  
throw new RuntimeException(e);  
        }  
    }  
  
/**
     * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
     * 
     * @param jobName
     * 
     * @Title: QuartzManager.java
     * @Copyright: Copyright (c) 2014
     * 
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:49:51
     * @version V2.0
     */  
public static void removeJob(String jobName) {  
try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
// 停止触发器  
// 移除触发器  
// 删除任务  
catch (Exception e) {  
throw new RuntimeException(e);  
        }  
    }  
  
/**
     * @Description: 移除一个任务
     * 
     * @param jobName
     * @param jobGroupName
     * @param triggerName
     * @param triggerGroupName
     * 
     * @Title: QuartzManager.java
     * @Copyright: Copyright (c) 2014
     * 
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:50:01
     * @version V2.0
     */  
public static void removeJob(String jobName, String jobGroupName,  
            String triggerName, String triggerGroupName) {  
try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
// 停止触发器  
// 移除触发器  
// 删除任务  
catch (Exception e) {  
throw new RuntimeException(e);  
        }  
    }  
  
/**
     * @Description:启动所有定时任务
     * 
     * 
     * @Title: QuartzManager.java
     * @Copyright: Copyright (c) 2014
     * 
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:50:18
     * @version V2.0
     */  
public static void startJobs() {  
try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
            sched.start();  
catch (Exception e) {  
throw new RuntimeException(e);  
        }  
    }  
  
/**
     * @Description:关闭所有定时任务
     * 
     * 
     * @Title: QuartzManager.java
     * @Copyright: Copyright (c) 2014
     * 
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:50:26
     * @version V2.0
     */  
public static void shutdownJobs() {  
try {  
            Scheduler sched = gSchedulerFactory.getScheduler();  
if (!sched.isShutdown()) {  
                sched.shutdown();  
            }  
catch (Exception e) {  
throw new RuntimeException(e);  
        }  
    }  
}


以上就是quartz任务调度对于任务的常用操作,封装起来以便在外部调用!这样我们就需要任务的执行了:


/**
 * @Description: 
 *
 * @Title: QuartzJob.java
 * @Package com.joyce.quartz
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:37:11
 * @version V2.0
 */  
package com.joyce.quartz;  
  
import java.text.SimpleDateFormat;  
import java.util.Date;  
  
import org.quartz.Job;  
import org.quartz.JobExecutionContext;  
import org.quartz.JobExecutionException;  
  
/**
 * @Description: 任务执行类
 *
 * @ClassName: QuartzJob
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:37:11
 * @version V2.0
 */  
public class QuartzJob implements Job {  
  
@Override  
public void execute(JobExecutionContext arg0) throws JobExecutionException {  
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ "★★★★★★★★★★★");    
    }  
}


Ok,我们来测试一下:



/**
 * @Description: 
 *
 * @Title: QuartzTest.java
 * @Package com.joyce.quartz.main
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:35:05
 * @version V2.0
 */  
package com.joyce.quartz.main;  
  
import com.joyce.quartz.QuartzJob;  
import com.joyce.quartz.QuartzManager;  
  
/**
 * @Description: 测试类
 *
 * @ClassName: QuartzTest
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午03:35:05
 * @version V2.0
 */  
public class QuartzTest {  
public static void main(String[] args) {  
try {  
"动态任务调度";  
"【系统启动】开始(每1秒输出一次)...");    
class, "0/1 * * * * ?");    
              
5000);    
"【修改时间】开始(每2秒输出一次)...");    
"10/2 * * * * ?");    
6000);    
"【移除定时】开始...");    
            QuartzManager.removeJob(job_name);    
"【移除定时】成功");    
              
"【再次添加定时任务】开始(每10秒输出一次)...");    
class, "*/10 * * * * ?");    
60000);    
"【移除定时】开始...");    
            QuartzManager.removeJob(job_name);    
"【移除定时】成功");  
catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
fztgkkRjHIsV