前面我们已经完成了spring 3和quartz 2的整合以及动态添加定时任务,我们接着来完善它,使之能支持更多的操作,例如暂停、恢复、修改等。
在动态添加定时任务中其实已经涉及到了其中的一些代码,这里我们再来细化的理一理。先来看一下我们初步要实现的目标效果图,这里我们只在内存中操作,并没有把quartz的任何信息保存到数据库,即使用的是RAMJobStore,当然如果你有需要,可以实现成JDBCJobStore,那样任务信息将会更全面,貌似还有专门的监控工具,不过本人没有用过:
如上图,我们要先列出计划中的定时任务以及正在执行中的定时任务,这里的正在执行中指的是任务已经触发线程还没执行完的情况。比如每天2点执行一个数据导入操作,这个操作执行时间需要5分钟,在这5分钟之内这个任务才是运行中的任务。当任务正常时可以使用暂停按钮,任务暂停时可以使用恢复按钮。
trigger各状态说明:
None:Trigger已经完成,且不会在执行,或者找不到该触发器,或者Trigger已经被删除
NORMAL:正常状态
PAUSED:暂停状态
COMPLETE:触发器完成,但是任务可能还正在执行中
BLOCKED:线程阻塞状态
ERROR:出现错误
计划中的任务
指那些已经添加到quartz调度器的任务,因为quartz并没有直接提供这样的查询接口,所以我们需要结合JobKey和Trigger来实现,核心代码:
- Scheduler scheduler = schedulerFactoryBean.getScheduler();
- GroupMatcher<JobKey> matcher =GroupMatcher.anyJobGroup();
- Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
- List<ScheduleJob> jobList =newArrayList<ScheduleJob>();
- for(JobKey jobKey : jobKeys){
- List<?extendsTrigger> triggers = scheduler.getTriggersOfJob(jobKey);
- for(Trigger trigger : triggers){
- ScheduleJob job =newScheduleJob();
- job.setJobName(jobKey.getName());
- job.setJobGroup(jobKey.getGroup());
- job.setDesc("触发器:"+ trigger.getKey());
- Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
- job.setJobStatus(triggerState.name());
- if(trigger instanceofCronTrigger){
- CronTrigger cronTrigger =(CronTrigger) trigger;
- String cronExpression = cronTrigger.getCronExpression();
- job.setCronExpression(cronExpression);
- }
- jobList.add(job);
- }
- }
上面代码中的jobList就是我们需要的计划中的任务列表,需要注意一个job可能会有多个trigger的情况,在下面讲到的立即运行一次任务的时候,会生成一个临时的trigger也会出现在这。这里把一个Job有多个trigger的情况看成是多个任务。我们前面包括在实际项目中一般用到的都是CronTrigger ,所以这里我们着重处理了下CronTrigger的情况。
运行中的任务
实现和计划中的任务类似,核心代码:
- Scheduler scheduler = schedulerFactoryBean.getScheduler();
- List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
- List<ScheduleJob> jobList =newArrayList<ScheduleJob>(executingJobs.size());
- for(JobExecutionContext executingJob : executingJobs){
- ScheduleJob job =newScheduleJob();
- JobDetail jobDetail = executingJob.getJobDetail();
- JobKey jobKey = jobDetail.getKey();
- Trigger trigger = executingJob.getTrigger();
- job.setJobName(jobKey.getName());
- job.setJobGroup(jobKey.getGroup());
- job.setDesc("触发器:"+ trigger.getKey());
- Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
- job.setJobStatus(triggerState.name());
- if(trigger instanceofCronTrigger){
- CronTrigger cronTrigger =(CronTrigger) trigger;
- String cronExpression = cronTrigger.getCronExpression();
- job.setCronExpression(cronExpression);
- }
- jobList.add(job);
- }
暂停任务
这个比较简单,核心代码:
- Scheduler scheduler = schedulerFactoryBean.getScheduler();
- JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
- scheduler.pauseJob(jobKey);
恢复任务
和暂停任务相对,核心代码:
- Scheduler scheduler = schedulerFactoryBean.getScheduler();
- JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
- scheduler.resumeJob(jobKey);
删除任务
删除任务后,所对应的trigger也将被删除
- Scheduler scheduler = schedulerFactoryBean.getScheduler();
- JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
- scheduler.deleteJob(jobKey);
立即运行任务
这里的立即运行,只会运行一次,方便测试时用。quartz是通过临时生成一个trigger的方式来实现的,这个trigger将在本次任务运行完成之后自动删除。trigger的key是随机生成的,例如:DEFAULT.MT_4k9fd10jcn9mg。在我的测试中,前面的DEFAULT.MT是固定的,后面部分才随机生成。
- Scheduler scheduler = schedulerFactoryBean.getScheduler();
- JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
- scheduler.triggerJob(jobKey);
更新任务的时间表达式
更新之后,任务将立即按新的时间表达式执行:
- Scheduler scheduler = schedulerFactoryBean.getScheduler();
- TriggerKey triggerKey =TriggerKey.triggerKey(scheduleJob.getJobName(),
- scheduleJob.getJobGroup());
- //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
- CronTrigger trigger =(CronTrigger) scheduler.getTrigger(triggerKey);
- //表达式调度构建器
- CronScheduleBuilder scheduleBuilder =CronScheduleBuilder.cronSchedule(scheduleJob
- .getCronExpression());
- //按新的cronExpression表达式重新构建trigger
- trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
- .withSchedule(scheduleBuilder).build();
- //按新的trigger重新设置job执行
- scheduler.rescheduleJob(triggerKey, trigger);
到这里,我们的spring3 整合quartz 2的定时任务功能终于是告一段落了,对常用的一些功能进行了实现,相信可以满足一般项目的需求了。
相关推荐
Spring 3整合Quartz 1.8实现定时任务三:动态暂停 恢复 修改和删除任务 任务保存到数据库,系统启动时读取数据库,页面显示加载,并管理 注:spring3+quartz2动态任务调度,任务保存在内存中,页面显示动态管理版...
本篇文章将详细探讨如何在Spring Boot项目中整合Quartz,并通过MySQL数据库实现定时任务的动态配置。 首先,我们需要在项目中添加依赖。在Spring Boot的`pom.xml`文件中,引入Spring Boot的`spring-boot-starter-...
7. **动态管理任务**:通过Spring的`Scheduler`实例,你可以方便地进行任务的添加、删除、暂停和恢复等操作,实现任务的动态管理。 以上就是Spring整合Quartz实现定时任务调度的基本流程。在实际开发中,你可能需要...
Spring整合Quartz 2.2.3是Java开发者在实现定时任务时常用的一种技术组合。Quartz是一款开源的作业调度框架,它允许程序在特定时间执行预定的任务,而Spring则是一个强大的企业级应用开发框架,提供了丰富的依赖注入...
为了实现动态管理定时任务,我们需要创建一个Controller,提供添加、删除、暂停和恢复任务的接口。在MyBatis-Plus的帮助下,我们可以方便地操作数据库中的任务信息。例如,添加任务的接口可以这样实现: ```java @...
通过整合SpringBoot和Quartz,我们可以利用Spring的自动配置能力,方便地在Spring应用中集成定时任务功能。 二、Quartz动态配置 1. 引入依赖:首先,在`pom.xml`文件中引入SpringBoot的SpringBoot-starter-quartz...
6. **动态管理任务**:Spring的`SchedulerFactoryBean`提供了API,可以用于暂停、恢复、删除或更新已调度的任务,实现动态管理。 在`spring-quartz-demo-master`这个项目中,我们可以看到实际的代码实现,包括...
Spring整合Quartz定时任务是企业级应用中常见的一种任务调度技术,它允许开发者在应用程序中设置定时执行的任务,比如数据同步、报表生成等。Quartz是一个功能强大的开源作业调度框架,而Spring则是一个广泛使用的...
**整合Quartz和SpringBatch** 将Quartz与SpringBatch整合,可以利用Quartz的定时功能触发SpringBatch的任务执行。首先,你需要在Spring配置中声明一个QuartzScheduler,并设置JobStore类型为支持集群的JDBCJobStore...
同时,通过自定义的 `SchedulerService` 接口和其实现,可以实现对任务的动态添加、删除和修改等功能。这种方案不仅提高了系统的可维护性和扩展性,也使得开发者能够更加专注于业务逻辑的实现,而无需过多关心任务...
在现代企业级应用中,定时任务的管理是一个重要的功能,它可以帮助我们自动化执行一系列周期性的任务...同时,通过数据库的方式,我们还能方便地进行任务的查询、暂停、恢复和删除,极大地提升了定时任务管理的便利性。
你还可以通过 Spring 的 API 来操作调度器,如暂停、恢复或删除任务。 通过这个小例子,你可以学习到如何在实际项目中结合 Spring 和 Quartz 来创建一个高效的任务调度系统。文档会进一步解释每个步骤的细节,帮助...
Quartz提供了Web管理界面JMX支持,允许开发者远程监控和管理任务,包括查看任务状态、暂停、恢复和删除任务等操作。 通过以上介绍,我们可以看出Spring Quartz是一个功能强大且灵活的任务调度解决方案,适用于各种...
Quartz提供了Web管理界面JMX(Java Management Extensions)以及API接口,方便对定时任务进行监控和管理,如查看、暂停、恢复和删除任务。 8. 错误处理与异常策略: 在`execute`方法中,应妥善处理可能的异常情况...
除了代码实现,还可以利用Quartz提供的管理工具(如Web-based Quartz Admin Console)监控和管理集群中的任务,查看任务状态,暂停、恢复或删除任务等。 这个"SpringQuartzClusterDemo"示例项目可以帮助开发者理解...
《Spring MVC + Quartz 整合实现定时任务管理》 在现代企业级应用中,系统往往需要执行一些定时任务,如数据同步、报表生成等。Spring框架以其强大的功能和灵活的扩展性,成为Java开发的首选,而Quartz作为一款开源...
Quartz和Spring整合是企业级应用中常见的任务调度解决方案,Quartz是一个开源的作业调度框架,而Spring则是Java领域广泛使用的轻量级框架。这两者的整合使得开发者可以在Spring管理的bean中灵活地定义和执行定时任务...
通过这个 "spring+quartz demo",开发者可以快速理解并实践 Spring 和 Quartz 的整合,掌握如何在 Spring 应用中高效地管理和执行定时任务。这个示例项目提供了直接运行的代码,有助于加深对这些概念的理解。
在IT行业中,Spring框架是Java企业级应用开发的首选,而Quartz则是一个强大的作业调度框架,常用于...同时,Quartz提供了丰富的API,可以方便地管理、暂停、恢复和删除Job和Trigger,为应用提供灵活的任务调度能力。