专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Quartz工具类

抄别人的。

工具类



import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; 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.Trigger.TriggerState; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.triggers.CronTriggerImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class QuartzManager { private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); private static final Logger logger = LoggerFactory.getLogger(QuartzManager.class); /** 添加一个任务(4要素),由对应的jobName,jobGroup,triggerName,griggerGroup来的确定任务 */ public static void addJob(String jobName, String jobGroup, String triggerName, String triggerGroup, String taskClass, String taskExpress) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobDetail job = JobBuilder.newJob((Class<? extends Job>) Class.forName(taskClass)) .withIdentity(jobName, jobGroup).build(); // 表达式调度构建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(taskExpress); // 按新的cronExpression表达式构建一个新的trigger Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroup) .withSchedule(scheduleBuilder).build(); sched.scheduleJob(job, trigger); // 启动 if (!sched.isShutdown()) { sched.start(); } } catch (Exception e) { throw new RuntimeException(e); } } /** 修改一个任务的时间(4要素),由对应的jobName,jobGroup,triggerName,griggerGroup来的确定任务 */ public static void modifyJobTime(String jobName, String jobGroup, String triggerName, String triggerGroup, String taskClass, String taskExpress) { try { Scheduler sched = gSchedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(taskExpress)) { /** 方式一 :调用 rescheduleJob 开始 */ // 触发器 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger(); // 触发器名,触发器组 triggerBuilder.withIdentity(triggerName, triggerGroup); triggerBuilder.startNow(); // 触发器时间设定 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(taskExpress)); // 创建Trigger对象 trigger = (CronTrigger) triggerBuilder.build(); // 方式一 :修改一个任务的触发时间 sched.rescheduleJob(triggerKey, trigger); /** 方式一 :调用 rescheduleJob 结束 */ /** 方式二:先删除,然后在创建一个新的Job */ // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName,jobGroupName)); // Class<? extends Job> jobClass = jobDetail.getJobClass(); // removeJob(jobName, jobGroupName, triggerName, triggerGroupName); // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron); /** 方式二 :先删除,然后在创建一个新的Job */ } } catch (Exception e) { throw new RuntimeException(e); } } /** 删除一个任务(4要素),由对应的jobName,jobGroup,triggerName,griggerGroup来的确定任务 */ public static void removeJob(String jobName, String jobGroup, String triggerName, String triggerGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); sched.pauseTrigger(triggerKey);// 停止触发器 sched.unscheduleJob(triggerKey);// 移除触发器 sched.deleteJob(JobKey.jobKey(jobName, triggerGroup));// 删除任务 } catch (Exception e) { throw new RuntimeException(e); } } /** 根据jobName和jobGroup来获取对应jobKey,暂停对应jobKey的任务 */ public static void pauseJob(String jobName, String jobGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); sched.pauseJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } /** 根据jobName和jobGroup来获取对应jobKey,恢复对应jobKey的任务 */ public static void resumeJob(String jobName, String jobGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); sched.resumeJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } /** 启动Scheduler */ public static void startJobs() { try { Scheduler sched = gSchedulerFactory.getScheduler(); sched.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** 关闭Scheduler */ public static void shutdownJobs() { try { Scheduler sched = gSchedulerFactory.getScheduler(); if (!sched.isShutdown()) { sched.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } /** 根据jobName和jobGroup来获取对应的jobKey,及时triggerJob对应的jobKey */ public static void triggerJob(String jobName, String jobGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); sched.triggerJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } /** 根据triggerName和triggerGroup来获取对应trigger的状态 */ public static String getTriggerState(String triggerName, String triggerGroup) { String triggerStateStr = null; try { Scheduler sched = gSchedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); TriggerState triggerState = sched.getTriggerState(triggerKey); triggerStateStr = triggerState.name(); } catch (SchedulerException e) { e.printStackTrace(); } return triggerStateStr; } /** 获取最近8次执行时间 */ public static List<String> getRecentTriggerTime(String taskExpress, Integer numTimes) { List<String> list = new ArrayList<String>(); try { CronTriggerImpl cronTriggerImpl = new CronTriggerImpl(); cronTriggerImpl.setCronExpression(taskExpress); // 这个是重点,一行代码搞定 List<Date> dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, numTimes); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); for (Date date : dates) { list.add(dateTimeFormatter.format(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()))); } // SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // for (Date date : dates) { // list.add(dateFormat.format(date)); // } } catch (ParseException e) { e.printStackTrace(); } return list; } }

测试




import com.imddysc.taskweb.manager.QuartzManager; public class QuartzManagerTest { public static void main(String[] args) { System.err.println("【系统启动】"); String corn = "0/5 * * * * ?"; QuartzManager.addJob("job1", "jobGooup", "trigger1", "triggerGroup", "com.imddysc.taskweb.jobs.MyJob", corn); System.err.println("添加任务一"); QuartzManager.getTriggerState("trigger1","triggerGroup"); // 睡眠一分钟 try { Thread.sleep(60L * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } QuartzManager.modifyJobTime("job1", "jobGooup", "trigger1", "triggerGroup","com.imddysc.taskweb.jobs.MyJob", "0/3 * * * * ?"); System.out.println("修改触发时间"); try { Thread.sleep(15L * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } QuartzManager.removeJob("job1", "jobGooup", "trigger1", "triggerGroup"); System.out.println("删除任务"); try { Thread.sleep(5L * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("【添加定时任务】"); QuartzManager.addJob("job2", "jobGooup", "trigger2", "triggerGroup", "com.imddysc.taskweb.jobs.MyJob", corn); // QuartzManager.shutdownJobs(); // System.out.println("停止所有任务"); try { Thread.sleep(5L * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("【暂停定时任务】"); QuartzManager.pauseJob("job2","jobGooup"); System.out.println("【立即运行一次】"); QuartzManager.triggerJob("job2","jobGooup"); try { Thread.sleep(30L * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("【恢复定时任务】"); QuartzManager.resumeJob("job2","jobGooup"); try { Thread.sleep(50L * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } QuartzManager.shutdownJobs(); } }

/*DDL 信息*/------------ CREATE TABLE `task` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `job_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'job任务名称', `job_group` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'job任务组名', `trigger_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'trigger名称', `trigger_group` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'trigger组名', `task_express` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '任务表达式', `task_class` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '任务类名', `task_status` int(11) DEFAULT '0' COMMENT '0,关闭;1,开启', `task_descript` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '任务描述', `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', `create_by` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建者', `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间', `update_by` varbinary(255) DEFAULT NULL COMMENT '修改者', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

问题,暂停调度后恢复调度,会一次补偿暂停时时间的调度,导致恢复调度时会多次调度,看来取消暂停,直接停止,恢复时,直接开启。后面可以加入group的部分控制,一次控制一组,加上web页面可以封装成web来存入数据库来控制。

1,quartz.propertis 添加【 org.quartz.jobStore.misfireThreshold = 5000 】

2,在cronScheduleBuilder中添加【 cronScheduleBuilder.withMisfireHandlingInstructionDoNothing() 】

quartz.properties


\#org.quartz.jobStore.misfireThreshold = 2000 # Default Properties file for use by StdSchedulerFactory # to create a Quartz Scheduler Instance, if a different # properties file is not explicitly specified. # org.quartz.scheduler.instanceName = DefaultQuartzScheduler 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 = 10 org.quartz.threadPool.threadPriority = 5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true org.quartz.jobStore.misfireThreshold = 5000 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

新的QuartzManager.java 这里添加了【 cronScheduleBuilder.withMisfireHandlingInstructionDoNothing() 】



import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; 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.Trigger.TriggerState; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.triggers.CronTriggerImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class QuartzManager { private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); private static final Logger logger = LoggerFactory.getLogger(QuartzManager.class); /** 添加一个任务(4要素),由对应的jobName,jobGroup,triggerName,griggerGroup来的确定任务 */ public static void addJob(String jobName, String jobGroup, String triggerName, String triggerGroup, String taskClass, String taskExpress) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobDetail job = JobBuilder.newJob((Class<? extends Job>) Class.forName(taskClass)) .withIdentity(jobName, jobGroup).build(); // 表达式调度构建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(taskExpress); // 按新的cronExpression表达式构建一个新的trigger Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroup) .withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build(); sched.scheduleJob(job, trigger); // 启动 if (!sched.isShutdown()) { sched.start(); } } catch (Exception e) { throw new RuntimeException(e); } } /** 修改一个任务的时间(4要素),由对应的jobName,jobGroup,triggerName,griggerGroup来的确定任务 */ public static void modifyJobTime(String jobName, String jobGroup, String triggerName, String triggerGroup, String taskClass, String taskExpress) { try { Scheduler sched = gSchedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(taskExpress)) { /** 方式一 :调用 rescheduleJob 开始 */ // 触发器 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger(); // 触发器名,触发器组 triggerBuilder.withIdentity(triggerName, triggerGroup); triggerBuilder.startNow(); // 触发器时间设定 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(taskExpress).withMisfireHandlingInstructionDoNothing()); // 创建Trigger对象 trigger = (CronTrigger) triggerBuilder.build(); // 方式一 :修改一个任务的触发时间 sched.rescheduleJob(triggerKey, trigger); /** 方式一 :调用 rescheduleJob 结束 */ /** 方式二:先删除,然后在创建一个新的Job */ // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName,jobGroupName)); // Class<? extends Job> jobClass = jobDetail.getJobClass(); // removeJob(jobName, jobGroupName, triggerName, triggerGroupName); // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron); /** 方式二 :先删除,然后在创建一个新的Job */ } } catch (Exception e) { throw new RuntimeException(e); } } /** 删除一个任务(4要素),由对应的jobName,jobGroup,triggerName,griggerGroup来的确定任务 */ public static void removeJob(String jobName, String jobGroup, String triggerName, String triggerGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); sched.pauseTrigger(triggerKey);// 停止触发器 sched.unscheduleJob(triggerKey);// 移除触发器 sched.deleteJob(JobKey.jobKey(jobName, triggerGroup));// 删除任务 } catch (Exception e) { throw new RuntimeException(e); } } /** 根据jobName和jobGroup来获取对应jobKey,暂停对应jobKey的任务 */ public static void pauseJob(String jobName, String jobGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); sched.pauseJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } /** 根据jobName和jobGroup来获取对应jobKey,恢复对应jobKey的任务 */ public static void resumeJob(String jobName, String jobGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); sched.resumeJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } /** 启动Scheduler */ public static void startJobs() { try { Scheduler sched = gSchedulerFactory.getScheduler(); sched.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** 关闭Scheduler */ public static void shutdownJobs() { try { Scheduler sched = gSchedulerFactory.getScheduler(); if (!sched.isShutdown()) { sched.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } /** 根据jobName和jobGroup来获取对应的jobKey,及时triggerJob对应的jobKey */ public static void triggerJob(String jobName, String jobGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); sched.triggerJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } /** 根据triggerName和triggerGroup来获取对应trigger的状态 */ public static String getTriggerState(String triggerName, String triggerGroup) { String triggerStateStr = null; try { Scheduler sched = gSchedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); TriggerState triggerState = sched.getTriggerState(triggerKey); triggerStateStr = triggerState.name(); } catch (SchedulerException e) { e.printStackTrace(); } return triggerStateStr; } /** 获取最近8次执行时间 */ public static List<String> getRecentTriggerTime(String taskExpress, Integer numTimes) { List<String> list = new ArrayList<String>(); try { CronTriggerImpl cronTriggerImpl = new CronTriggerImpl(); cronTriggerImpl.setCronExpression(taskExpress); // 这个是重点,一行代码搞定 List<Date> dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, numTimes); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); for (Date date : dates) { list.add(dateTimeFormatter.format(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()))); } // SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // for (Date date : dates) { // list.add(dateFormat.format(date)); // } } catch (ParseException e) { e.printStackTrace(); } return list; } }

来个附件


/** 根据jobName和jobGroup来获取对应jobKey,暂停对应jobKey的任务 */ public static void pauseJob(String jobName, String jobGroup, String triggerName, String triggerGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); sched.pauseTrigger(triggerKey); sched.pauseJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } /** 根据jobName和jobGroup来获取对应jobKey,恢复对应jobKey的任务 */ public static void resumeJob(String jobName, String jobGroup, String triggerName, String triggerGroup) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); sched.resumeTrigger(triggerKey); sched.resumeJob(jobKey); } catch (SchedulerException e) { e.printStackTrace(); } }

文章永久链接:https://tech.souyunku.com/24751

未经允许不得转载:搜云库技术团队 » Quartz工具类

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们