quartz 定时任务的删除 恢复 已经暂停

在动态添加定时任务中其实已经涉及到了其中的一些代码,这里我们再来细化的理一理。先来看一下我们初步要实现的目标效果图,这里我们只在内存中操作,并没有把quartz的任何信息保存到数据库,即使用的是RAMJobStore,当然如果你有需要,可以实现成JDBCJobStore,那样任务信息将会更全面,貌似还有专门的监控工具,不过本人没有用过:

如上图,我们要先列出计划中的定时任务以及正在执行中的定时任务,这里的正在执行中指的是任务已经触发线程还没执行完的情况。比如每天2点执行一个数据导入操作,这个操作执行时间需要5分钟,在这5分钟之内这个任务才是运行中的任务。当任务正常时可以使用暂停按钮,任务暂停时可以使用恢复按钮。

trigger各状态说明:

None:Trigger已经完成,且不会在执行,或者找不到该触发器,或者Trigger已经被删除 NORMAL:正常状态 PAUSED:暂停状态 COMPLETE:触发器完成,但是任务可能还正在执行中 BLOCKED:线程阻塞状态 ERROR:出现错误

计划中的任务

指那些已经添加到quartz调度器的任务,因为quartz并没有直接提供这样的查询接口,所以我们需要结合JobKey和Trigger来实现,核心代码:

 
 
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
  3. Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
  4. List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
  5. for (JobKey jobKey : jobKeys) {
  6. List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
  7. for (Trigger trigger : triggers) {
  8. ScheduleJob job = new ScheduleJob();
  9. job.setJobName(jobKey.getName());
  10. job.setJobGroup(jobKey.getGroup());
  11. job.setDesc("触发器:" + trigger.getKey());
  12. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
  13. job.setJobStatus(triggerState.name());
  14. if (trigger instanceof CronTrigger) {
  15. CronTrigger cronTrigger = (CronTrigger) trigger;
  16. String cronExpression = cronTrigger.getCronExpression();
  17. job.setCronExpression(cronExpression);
  18. }
  19. jobList.add(job);
  20. }
  21. }

上面代码中的jobList就是我们需要的计划中的任务列表,需要注意一个job可能会有多个trigger的情况,在下面讲到的立即运行一次任务的时候,会生成一个临时的trigger也会出现在这。这里把一个Job有多个trigger的情况看成是多个任务。我们前面包括在实际项目中一般用到的都是CronTrigger ,所以这里我们着重处理了下CronTrigger的情况。

运行中的任务

实现和计划中的任务类似,核心代码:

  
  
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
  3. List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(executingJobs.size());
  4. for (JobExecutionContext executingJob : executingJobs) {
  5. ScheduleJob job = new ScheduleJob();
  6. JobDetail jobDetail = executingJob.getJobDetail();
  7. JobKey jobKey = jobDetail.getKey();
  8. Trigger trigger = executingJob.getTrigger();
  9. job.setJobName(jobKey.getName());
  10. job.setJobGroup(jobKey.getGroup());
  11. job.setDesc("触发器:" + trigger.getKey());
  12. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
  13. job.setJobStatus(triggerState.name());
  14. if (trigger instanceof CronTrigger) {
  15. CronTrigger cronTrigger = (CronTrigger) trigger;
  16. String cronExpression = cronTrigger.getCronExpression();
  17. job.setCronExpression(cronExpression);
  18. }
  19. jobList.add(job);
  20. }
暂停任务

这个比较简单,核心代码:

  
  
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  3. scheduler.pauseJob(jobKey);
恢复任务

和暂停任务相对,核心代码:

  
  
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  3. scheduler.resumeJob(jobKey);
删除任务

删除任务后,所对应的trigger也将被删除

  
  
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  3. scheduler.deleteJob(jobKey);
立即运行任务

这里的立即运行,只会运行一次,方便测试时用。quartz是通过临时生成一个trigger的方式来实现的,这个trigger将在本次任务运行完成之后自动删除。trigger的key是随机生成的,例如:DEFAULT.MT_4k9fd10jcn9mg。在我的测试中,前面的DEFAULT.MT是固定的,后面部分才随机生成。

  
  
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  3. scheduler.triggerJob(jobKey);
更新任务的时间表达式

更新之后,任务将立即按新的时间表达式执行:

  
  
  1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
  2. TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),
  3. scheduleJob.getJobGroup());
  4. //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
  5. CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
  6. //表达式调度构建器
  7. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob
  8. .getCronExpression());
  9. //按新的cronExpression表达式重新构建trigger
  10. trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
  11. .withSchedule(scheduleBuilder).build();
  12. //按新的trigger重新设置job执行
  13. scheduler.rescheduleJob(triggerKey, trigger);
在Spring Boot中使用Quartz实现动态定时任务可以分为以下几个步骤: 1. 添加依赖 在`pom.xml`文件中添加Quartz依赖: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 2. 配置Quartz 在`application.properties`中添加Quartz的配置: ``` # 配置Quartz的JobStore org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.tablePrefix = QRTZ_ org.quartz.jobStore.isClustered = false # 配置Quartz的线程池 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 10 org.quartz.threadPool.threadPriority = 5 # 配置Quartz的数据源 org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/quartz org.quartz.dataSource.myDS.user = root org.quartz.dataSource.myDS.password = root org.quartz.dataSource.myDS.maxConnections = 5 org.quartz.dataSource.myDS.validationQuery = select 0 ``` 3. 创建Job 创建一个继承`org.quartz.Job`接口的类,用于执行定时任务的逻辑代码。 ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 执行定时任务逻辑 } } ``` 4. 创建Trigger 创建一个继承`org.quartz.Trigger`接口的类,用于设置定时任务的触发器,例如定时任务的执行时间、执行频率等。 ```java public class MyTrigger implements Trigger { @Override public Date getNextFireTime() { // 设置下一次执行时间 return null; } @Override public Date getPreviousFireTime() { // 获取上一次执行时间 return null; } @Override public void setNextFireTime(Date nextFireTime) { // 设置下一次执行时间 } @Override public void setPreviousFireTime(Date previousFireTime) { // 设置上一次执行时间 } // 其他方法省略... } ``` 5. 创建Scheduler 创建一个`org.quartz.Scheduler`实例,用于管理定时任务的执行。 ```java public class MyScheduler { private Scheduler scheduler; public MyScheduler(Scheduler scheduler) { this.scheduler = scheduler; } // 添加定时任务 public void addJob(JobDetail jobDetail, Trigger trigger) throws SchedulerException { scheduler.scheduleJob(jobDetail, trigger); } // 删除定时任务 public void deleteJob(JobKey jobKey) throws SchedulerException { scheduler.deleteJob(jobKey); } // 修改定时任务 public void updateJob(TriggerKey triggerKey, Trigger newTrigger) throws SchedulerException { scheduler.rescheduleJob(triggerKey, newTrigger); } // 启动定时任务 public void start() throws SchedulerException { scheduler.start(); } // 关闭定时任务 public void shutdown() throws SchedulerException { scheduler.shutdown(); } } ``` 6. 创建动态定时任务 创建一个类,用于动态添加、删除、修改定时任务。 ```java @Service public class DynamicJobService { @Autowired private Scheduler scheduler; // 添加定时任务 public void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class<? extends Job> jobClass, String cronExpression) throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build(); CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build(); scheduler.scheduleJob(jobDetail, trigger); } // 删除定时任务 public void deleteJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) throws SchedulerException { scheduler.pauseTrigger(new TriggerKey(triggerName, triggerGroupName)); scheduler.unscheduleJob(new TriggerKey(triggerName, triggerGroupName)); scheduler.deleteJob(new JobKey(jobName, jobGroupName)); } // 修改定时任务 public void updateJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String cronExpression) throws SchedulerException { CronTrigger trigger = (CronTrigger) scheduler.getTrigger(new TriggerKey(triggerName, triggerGroupName)); trigger = trigger.getTriggerBuilder().withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build(); scheduler.rescheduleJob(new TriggerKey(triggerName, triggerGroupName), trigger); } // 暂停定时任务 public void pauseJob(String jobName, String jobGroupName) throws SchedulerException { scheduler.pauseJob(new JobKey(jobName, jobGroupName)); } // 恢复定时任务 public void resumeJob(String jobName, String jobGroupName) throws SchedulerException { scheduler.resumeJob(new JobKey(jobName, jobGroupName)); } } ``` 7. 测试 ```java @Service public class TestService { @Autowired private DynamicJobService dynamicJobService; public void test() throws SchedulerException { // 添加定时任务 dynamicJobService.addJob("job1", "group1", "trigger1", "group1", MyJob.class, "0/5 * * * * ?"); // 修改定时任务 dynamicJobService.updateJob("job1", "group1", "trigger1", "group1", "0/10 * * * * ?"); // 暂停定时任务 dynamicJobService.pauseJob("job1", "group1"); // 恢复定时任务 dynamicJobService.resumeJob("job1", "group1"); // 删除定时任务 dynamicJobService.deleteJob("job1", "group1", "trigger1", "group1"); } } ``` 以上就是使用Spring Boot和Quartz实现动态定时任务的步骤。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值