quartz动态任务调度实现

xiaoxiao2021-02-28  10

以maven工程为讲解例子:

pom.xml

<!--quartz--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> <exclusions> <exclusion> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> </exclusion> </exclusions> </dependency> </dependencies>

QuartzScheduleUtil.java(调度工具类)

package com.wlt.quartz.util; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; /** * Created by wlt on 2018/2/20. */ public class QuartzScheduleUtil { private Scheduler scheduler; public Scheduler getScheduler() { return scheduler; } public void setScheduler(Scheduler scheduler) { this.scheduler = scheduler; } public QuartzScheduleUtil(){ } public QuartzScheduleUtil(Scheduler scheduler){ this.scheduler = scheduler; } /** * 启动一个调度对象 * @throws SchedulerException */ public void start() throws SchedulerException { if (!scheduler.isShutdown()) { scheduler.start(); } } /** * 判断调度器是否关闭 * @return */ private boolean isShutdown(){ try { return scheduler.isShutdown(); } catch (SchedulerException e) { e.printStackTrace(); } return false; } /** * 调度是否启动 * @return * @throws SchedulerException */ public boolean isStarted() throws SchedulerException { return scheduler.isStarted(); } /** * 关闭调度器 * @throws SchedulerException */ public void shutdown() throws SchedulerException { scheduler.shutdown(); } /** * 暂停调度任务 * @return * @throws SchedulerException */ public void unscheduleJob(QuartzScheduleJob job) throws SchedulerException{ if (!isShutdown()) { scheduler.pauseJob(new JobKey(job.getJobName(), job.getJobGroup())); scheduler.pauseTrigger(new TriggerKey(job.getJobName(), job.getTriggerGroup())); } } /** * 重启任务调度 * @param job */ public void resumeJob(QuartzScheduleJob job){ try { if (!isShutdown()) { scheduler.resumeJob(new JobKey(job.getJobName(), job.getJobGroup())); scheduler.resumeTrigger(new TriggerKey(job.getJobName(), job.getTriggerGroup())); } } catch (SchedulerException e) { e.printStackTrace(); } } /** * 暂停触发器 * @param job */ public void pauseTrigger(QuartzScheduleJob job) { try { if (!isShutdown()) { scheduler.pauseTrigger(new TriggerKey(job.getJobName(), job.getTriggerGroup()));// 停止触发器 } } catch (SchedulerException e) { throw new RuntimeException(e); } } /** * 恢复触发器 * @param job */ public void resumeTrigger(QuartzScheduleJob job) { try { if (!isShutdown()) { scheduler.resumeTrigger(new TriggerKey(job.getJobName(), job.getTriggerGroup()));// 重启触发器 } } catch (SchedulerException e) { throw new RuntimeException(e); } } /** * 删除触发器 * @param job * @return */ public boolean removeTrigdger(QuartzScheduleJob job) { TriggerKey triggerKey = new TriggerKey(job.getJobName(), job.getTriggerGroup()); try { if (!isShutdown()) { scheduler.pauseTrigger(triggerKey);// 停止触发器 } return scheduler.unscheduleJob(triggerKey);// 移除触发器 } catch (SchedulerException e) { throw new RuntimeException(e); } } /** * 暂停调度中所有的job * 恢复任务时,停止时间段之间的任务会被执行 */ public void pauseAll() { try { if (!isShutdown()) { scheduler.pauseAll(); } } catch (Exception e) { throw new RuntimeException(e); } } /** * 恢复调度中所有的job * @throws SchedulerException */ public void resumeAll() throws SchedulerException { if (!isShutdown()) { scheduler.resumeAll(); } } /** * 删除一个任务 * @param job * @throws SchedulerException */ public void removeJob(QuartzScheduleJob job) throws SchedulerException{ TriggerKey triggerKey = new TriggerKey(job.getJobName(), job.getTriggerGroup()); if (!isShutdown()) { scheduler.pauseTrigger(triggerKey);//停止触发器 scheduler.unscheduleJob(triggerKey);//移除触发器 scheduler.deleteJob(new JobKey(job.getJobName(), job.getJobGroup()));//删除任务 } } /** * 创建一个调度对象 * * @return * @throws SchedulerException */ public static Scheduler newScheduler() { SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = null; try { scheduler = sf.getScheduler(); } catch (SchedulerException e) { e.printStackTrace(); } return scheduler; } } 测试类TIMER.JAVA package com.wlt.quartz; import com.wlt.quartz.job.HelloJob; import com.wlt.quartz.util.QuartzScheduleJob; import com.wlt.quartz.util.QuartzScheduleUtil; import org.junit.Test; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.IOException; import static org.quartz.CronScheduleBuilder.cronSchedule; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; /** * Created by wlt on 2018/2/20. */ public class Timer { @Test public void initJob() throws SchedulerException, IOException, InterruptedException { // Grab the Scheduler instance from the Factory QuartzScheduleUtil quartzScheduleUtil = new QuartzScheduleUtil(QuartzScheduleUtil.newScheduler()); quartzScheduleUtil.start(); String jobName = "wltTimer"; String jobGroup = "job-group"; String triggerGroup = "trigger-group"; String triggerRule = "*/5 * * * * ?"; QuartzScheduleJob quartzScheduleJob = new QuartzScheduleJob(); quartzScheduleJob.setJobGroup(jobGroup); quartzScheduleJob.setJobName(jobName); quartzScheduleJob.setTriggerGroup(triggerGroup); JobDetail job = newJob(HelloJob.class) .withIdentity(jobName, jobGroup) .build(); Trigger trigger = newTrigger() .withIdentity(jobName, triggerGroup) .withSchedule(cronSchedule(triggerRule)) .build(); try { quartzScheduleUtil.getScheduler().scheduleJob(job, trigger); System.out.println("初始化定时任务success"); System.out.println(quartzScheduleUtil.isStarted()); quartzScheduleUtil.pauseTrigger(quartzScheduleJob); Thread.sleep(6000); quartzScheduleUtil.resumeTrigger(quartzScheduleJob); } catch (SchedulerException e) { System.out.println("初始化定时任务失败"); } System.in.read(); // 按任意键退出 } }

测试任务类HelloJob.java

package com.wlt.quartz.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.PersistJobDataAfterExecution; import java.util.Date; /** * Created by wlt on 2018/2/20. */ //下面注解代表job是有状态的,即多次运行的job,可以共享变量,默认是每次都会启动一个全新的job,即无状态job //@PersistJobDataAfterExecution public class HelloJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println(new Date().getSeconds()); } }

控制台结果

转载请注明原文地址: https://www.6miu.com/read-2650294.html

最新回复(0)