Quartz定时任务动态增删改查

上一篇说了quartz持久化的问题,但是在项目中还是有点缺陷的那就是任务的增删给查问题。本文接着上一篇的代码来说说quartz定时任务的增删改查。

一、Quartz定时任务动态增删改查

直接上代码,代码里都有注释应该都可以看得懂

package quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
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;

/*
 * 定时任务
 */
public class JobManager {
	// 创建 schedulerFactory 工厂
	private static SchedulerFactory scheduleFactory= new StdSchedulerFactory();
	
	
	/**添加一个定时任务
	 * @param jobName 任务名
	 * @param jobGroupName 任务组名
	 * @param triggerName 触发器名
	 * @param triggerGroupName 触发器组名
	 * @param jobClass 任务类名
	 * @param cron 时间
	 */
	public static void addJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName
			,Class<? extends Job> jobClass,String cron,String[] data) {
		try {
			//通过scheduleFactory创建任务调度器
			Scheduler scheduler = scheduleFactory.getScheduler();
			
			//创建 jobDetail 实例,绑定 Job 实现类
			// 指明 job 的名称,所在组的名称,以及绑定 job 类
			JobDetail job = (JobDetail) JobBuilder.newJob(jobClass)
					.withIdentity(jobName,jobGroupName)
					//.requestRecovery() // 执行中应用发生故障,需要重新执行
					.build();
					// 初始化参数传递到 job
					job.getJobDataMap().put("data",data);
					
			// 定义调度触发规则CronTrigger
			//指明 CronTrigger 的名称,所在组的名称,触发时间
			Trigger trigger = (Trigger) TriggerBuilder.newTrigger()
					.withIdentity(triggerName,triggerGroupName)
					.startNow()
					.withSchedule(CronScheduleBuilder.cronSchedule(cron))
					.build();
			
			// 把作业和触发器注册到任务调度中
			scheduler.scheduleJob(job,trigger);
			
			//启动
			if(!scheduler.isShutdown()) {
				scheduler.start();
			}
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**修改一个任务
	 * @param jobName 任务名
	 * @param jobGroupName 任务组名
	 * @param triggerName 触发器名
	 * @param triggerGroupName 触发器组名
	 * @param cron 时间
	 */
	public static void modifyJobTime(String jobName,String jobGroupName,String triggerName,String triggerGroupName
			,String cron,String[] data) {
		try {
			//创建调度器
			Scheduler scheduler = scheduleFactory.getScheduler();
			
			//根据触发器名和触发器组名获取到旧触发器的键从而获取到触发器
			TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
			CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
			if(trigger == null) {
				return; 
			}
			
			//通过CronTrigger获取以前设定的时间
			String oldTime = trigger.getCronExpression();
			if(!oldTime.equalsIgnoreCase(cron)) {
				//方式一:通过rescheduleJob替换旧的触发器
//				TriggerBuilder<Trigger> newTrigger = TriggerBuilder.newTrigger();
//				newTrigger.withIdentity(jobName,jobGroupName);
//				newTrigger.startNow();
//				newTrigger.withSchedule(CronScheduleBuilder.cronSchedule(cron));
//				CronTrigger cronTrigger = (CronTrigger)newTrigger.build(); 
//				scheduler.rescheduleJob(triggerKey, cronTrigger); //替换以前旧的触发器
				//方式二:先删除,然后在创建一个新的Job 
				JobKey jobKey = JobKey.jobKey(jobName,jobGroupName);
				JobDetail jobDetail = scheduler.getJobDetail(jobKey);
				Class<? extends Job> jobClass = jobDetail.getJobClass();
				removeJob(jobName ,jobGroupName,triggerName,triggerGroupName);
				addJob(jobName ,jobGroupName,triggerName,triggerGroupName,jobClass,cron,data);
			}
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	/**移除一个任务
	 * @param jobName
	 * @param jobGroupName
	 * @param triggerName
	 * @param triggerGroupName
	 */
	public static void removeJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName) {
		try {
			Scheduler scheduler = scheduleFactory.getScheduler();
			
			TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
			scheduler.pauseTrigger(triggerKey); //停止触发
			scheduler.unscheduleJob(triggerKey); //移除触发
			
			scheduler.deleteJob(JobKey.jobKey(jobName,jobGroupName)); //删除任务
			
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	/**
	 * 启动所有定时任务
	 */
	public static void startJobs() {
		try {
			Scheduler scheduler = scheduleFactory.getScheduler();
			scheduler.start();
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 关闭所有定时任务
	 */
	public static void stopJobs() {
		try {
			Scheduler scheduler = scheduleFactory.getScheduler();
			if(!scheduler.isShutdown()) {
				scheduler.shutdown();
			}
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

执行类:

package com.ghuiqun.timer;

import java.util.List;

import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

public class DynanicMain {
	private static String Job_Name = "动态任务调度"; 
	private static String Job_Group_Name = "动态任务调度组";
	private static String Trigger_Name = "动态任务触发器";
	private static String Trigger_Group_Name = "动态任务触发器组";
	public static void main(String[] args) {
		try {
			JobManager manager = new JobManager();
			String [] data = null;
			
			//先重新调度数据库已有的任务
			System.out.println("【重启数据库未完成任务】重启(每分钟15秒 、13秒输出一次)");  
			resumeJob();
			
			//添加一个新的调度任务
			Thread.sleep(20000);
			System.out.println("【添加任务】开始(每1秒输出一次)...");  
			manager.addJob(Job_Name, Job_Group_Name, Trigger_Name, Trigger_Group_Name, TimerJob.class, "0/1 * * * * ?", data);
			
			//修改刚刚添加的调度任务
			Thread.sleep(20000);
			System.out.println("【修改任务】开始(每10秒输出一次)...");  
			manager.modifyJobTime(Job_Name, Job_Group_Name, Trigger_Name, Trigger_Group_Name, "0/10 * * * * ?", data);
			
			
			//移除刚刚添加的调度任务
			Thread.sleep(20000);
			System.out.println("【移除任务】开始...");
			manager.removeJob(Job_Name, Job_Group_Name, Trigger_Name, Trigger_Group_Name);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
	}
	//从数据库中找到已经存在的job,并重新开户调度 
	public static void resumeJob() {
		
		try {  
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();  
            Scheduler scheduler = schedulerFactory.getScheduler();  
            // ①获取调度器中所有的触发器组  
            List<String> triggerGroups = scheduler.getTriggerGroupNames();  
            // ②重新恢复在tgroup1组中,名为trigger1_1触发器的运行  
            for (int i = 0; i < triggerGroups.size(); i++) {  
                List<String> triggers = scheduler.getTriggerGroupNames();  
                for (int j = 0; j < triggers.size(); j++) {  
                    Trigger tg = scheduler.getTrigger(new TriggerKey(triggers  
                            .get(j), triggerGroups.get(i)));
                    scheduler.resumeJob(new JobKey(triggers.get(j),triggerGroups.get(i)));
                    // ②-1:根据名称判断  
//                    if (tg instanceof SimpleTrigger  
//                            && tg.getDescription().equals("group1.trigger1")) {  
//                        // ②-1:恢复运行  
//                        scheduler.resumeJob(new JobKey(triggers.get(j),  
//                                triggerGroups.get(i)));  
//                    }  
                }  
  
            }  
            scheduler.start();  
        } catch (Exception e) {  
            e.printStackTrace();  
  
        } 
	}

}

结果:

二、问题总结

问题一:

扫描二维码关注公众号,回复: 3434571 查看本文章

问题二:

问题三:

错误原因:缺少相关数据库jar包、数据库配置文件不正确、相关jar包版本不匹配,尤其是数据库配置文件不正确、相关jar包版本不匹配,数据库配置文件不正确、相关jar包版本不匹配,数据库配置文件不正确、相关jar包版本不匹配重要的事情说三遍

小强在这里用的是SqlServer2017因为数据库配置文件和相关jar版本不匹配导致懊恼了好几天,最后在查询各种资料后才得以解解决下面贴出在这个项目中我使用的SqlServer的配置信息、jar包和一些相关的信息资料

1、SqlServer2017的配置信息、及使用的相关jar包(quartzjar包、SqlServerjar包、jdbcjar包)

 #============================================================================  
    # Configure Datasources  
    #============================================================================   
	org.quartz.dataSource.mySqlServer.driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
	org.quartz.dataSource.mySqlServer.URL = jdbc:sqlserver://localhost:1433;DatabaseName=test;SelectMethod=cursor
	org.quartz.dataSource.mySqlServer.user = sa	
	org.quartz.dataSource.mySqlServer.password = 123456
	org.quartz.dataSource.mySqlServer.maxConnections = 10
	org.quartz.dataSource.mySqlServer.validationQuery=select count(0) from

2、相关资料

本文属于原创如有转载请标明原文链接:https://blog.csdn.net/little__SuperMan/article/details/82777413

上一篇 Quartz定时任务持久化:https://blog.csdn.net/little__SuperMan/article/details/82749103

以上相关资料都是网上查阅找到的如有侵犯您的权益请及时联系小强一遍及时删除。

猜你喜欢

转载自blog.csdn.net/little__SuperMan/article/details/82777413