转http://my.oschina.net/u/1177710/blog/284608
一、 说明
由于最近工作要实现定时任务的执行,而且要求定时周期是不固定的,所以就用到了quartz来实现这个功能;
spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错。至于原因,则是spring对于quartz的支持实现,org.springframework.scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是个类,而在quartz2.x系列中org.quartz.CronTrigger变成了接口,从而造成无法用spring的方式配置quartz的触发器(trigger)。
我使用的quartz版本是2.2.1 。
最终实现的功能:
1) 项目启动时,可执行的定时任务启动,按时执行相应的逻辑 ;
2) 可添加新任务,删除任务,更新任务,暂停任务,恢复任务 ;
二、 添加quartz包
我使用Gradle构建项目,加包时只需下面一行即可:
compile "org.quartz-scheduler:quartz:2.2.1"
三、 配置及使用
1. 配置任务调度器 (对应的文件名为quartz-task.xml)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<? xml version = "1.0" encoding = "UTF-8" ?>
< beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init = "false" >
<!-- 调度器 -->
< bean name = "schedulerFactoryBean" class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<!-- 通过applicationContextSchedulerContextKey属性配置spring上下文 --> < property name = "applicationContextSchedulerContextKey" >
< value >applicationContext</ value >
</ property >
</ bean >
<!--加载可执行的任务-->
< bean id = "loadTask" class = "com.quartz.LoadTask" init-method = "initTask" />
</ beans >
|
2. 服务器启动时加载,在web.xml文件里配置
1
2
3
4
|
< context-param >
< param-name >contextConfigLocation</ param-name >
< param-value >classpath:quartz-task.xml</ param-value >
</ context-param >
|
3. 加载可执行任务的类LoadTask.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
public class LoadTask {
public void initTask() throws Exception {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
// 可执行的任务列表
Collection<Task> taskList = taskService.findTask();
for (Task task : taskList) {
// 任务名称和任务组设置规则:
// 名称:task_1 ..
// 组 :group_1 ..
TriggerKey triggerKey = TriggerKey.triggerKey(
"task_" + task.getId(), "group_" + task.getId());
CronTrigger trigger = (CronTrigger) scheduler
.getTrigger(triggerKey);
// 不存在,创建一个
if ( null == trigger) {
JobDetail jobDetail = JobBuilder
.newJob(QuartzJobFactory. class )
.withIdentity( "task_" + task.getId(),
"group_" + task.getId()).build();
jobDetail.getJobDataMap().put( "scheduleJob" , task);
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(getCronExpression());
// 按新的表达式构建一个新的trigger
trigger = TriggerBuilder
.newTrigger()
.withIdentity( "task_" + task.getId(),
"group_" + task.getId())
.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
} else {
// trigger已存在,则更新相应的定时设置
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(taskService.getCronExpression());
// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
.withSchedule(scheduleBuilder).build();
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}
}
}
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
@Autowired
private TaskService taskService;
} |
4. 调度任务的入口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class QuartzTaskFactory implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
// TODO Auto-generated method stub
try {
System.out.println( "任务运行..." );
Task task = (Task) context.getMergedJobDataMap().get(
"scheduleJob" );
System.out.println( "任务名称: [" + task.getTaskName() + "]" );
//在这里执行你的任务...
} catch (Exception e) {
e.printStackTrace();
}
}
} |
5. 暂停任务
1
2
3
|
Scheduler scheduler = schedulerFactoryBean.getScheduler(); JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.pauseJob(jobKey); |
6. 恢复任务
1
2
3
|
Scheduler scheduler = schedulerFactoryBean.getScheduler(); JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.resumeJob(jobKey); |
7. 删除任务
1
2
3
|
Scheduler scheduler = schedulerFactoryBean.getScheduler(); JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.deleteJob(jobKey); |
8. 立即运行任务
1
2
3
|
Scheduler scheduler = schedulerFactoryBean.getScheduler(); JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.triggerJob(jobKey); |
9. 更新任务(时间表达式)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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); |
四、时间表达式说明
字段 允许值 允许的特殊字符
秒 0-59 , – * /
分 0-59 , – * /
小时 0-23 , – * /
日期 1-31 , – * ? / L W C
月份 1-12 或者 JAN-DEC , – * /
星期 1-7 或者 SUN-SAT , – * ? / L C #
年(可选) 留空, 1970-2099 , – * /
表达式意义
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
每天早上6点
0 6 * * *
每两个小时
0 */2 * * *
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
1月1日早上4点
0 4 1 1 *
ok,定时任务已经正确执行....
我是看了这篇文章,http://www.meiriyouke.net/?p=140 ,写的很好。
相关推荐
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,为应用提供灵活的任务调度能力。