付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Chapter8Spring 定时任务*课程回顾*1Spring 邮件发送2Spring 配置文件拆分组合*教学导航*1Spring 任务调度概念2Spring quartz 任务调度实现3动态管理调度实现一、Spring 任务调度概念编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,可以考虑使用 JDK 中的 Timer 定时任务来实现。spring 也自带了一个轻量级的定时任务Task,但不够灵活,功能也不够强大。Spring 框架集成 Quartz 使用:Quartz 是一个开源项目,它可以与 j2EE 和 j2SE 结合使用,也可以单独使用,也可以和 spring 等的框架整
2、合使用。Quartz 可以用来创建许多 Jobs 这样的复杂的程序,并通过 cron 表达式自定义执行的规则。比 Timer 等多了很多的功能主要体现在:持久性作业,就是保持调度定时的状态;作业管理,对调度作业进行有效的管理;类 Corn(表达式)的定时支持,可以用 Corn 的方式来执行作业;线程处理模型 Timer 是单线程作业的,但是 Quartz 支持线程缓冲池。在 Spring 中可以很方便的使用 Quartz 来实现定时任务等功能,Quartz 的几个核心概念如下:Job:代表一个工作或一个任务,要执行的内容,此接口只有一个方法 execute().JobDetail:代表一个可执
3、行的调度程序,Job 是这个可执行调度程序的内容,另外,JobDetail 还包含了这个任务调度的方案和策略。Trigger:代表一个调度参数的配置4.Scheduler:代表一个调度容器,可以多个 JobDetial 和 Trigger5.SchedulerFactory:代表一个调度工厂,用来创建一个 scheduler 调度器它的方法有 start()、shutdown()等方法,负责管理整个调度作业。下图的调度流程体现在 Spring 就是,Job 注入到 JobDetial,JobDetial 注入到Trigger,Trigger 注入到 Scheduler 中1Jobspring
4、和 quartz 的整合对版本是有要求的,使用时注意 spring3.1 以下的版本必须使用 quartz1.x 系列,3.1 以上的版本才支持 quartz 2.x,不然会出错。至于原因,则是 spring 对于 quartz 的支持实现,.springframework.scheduling.quartz.CronTriggerBean 继承了.quartz.CronTrigger,在 quartz1.x 系列中.quartz.CronTrigger 是个类,而在 quartz2.x 系列中.quartz.CronTrigger 变成了接口,从而造成无法用 spring的方式配置 quar
5、tz 的触发器 (trigger)。NTriggerScheduleSchedulerFacto二、Springquartz 的整合实现任务调度在 Spring 中使用 Quartz 有两种方式实现:第一种是任务类继承 QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法可以是普通类。很显然,第二种方式远比第式来的灵活。本章示例采用第二种1、创建 javaWeb 工程项目 SpringEight,导入 Spring ioc 及 AOP 依赖的 jar 包及另增加依赖 Quartz 相关包 及 spring 支持 web 应用的 spring-webjar注意:这
6、个任务不太方便测试类启动,所以以 web 启动的方式测试2、增加 Service 服务层任务类业务接口 MyJobService业务实现 MyJobServiceImplpublic class MyJobServiceImpl implements MyJobService /*publicerface MyJobService /* 自定义创建任务要执行的内容*/public void run();3、编辑 spring 配置文件,applicationContext.xml!- 定义id=myJobServiceclass=com.spring.job.service.impl.MyJo
7、bServiceImpl/* 自定义创建任务要执行的内容*/ Overridepublic void run() System.out.prln(自定义的任务类开始执行了: +newSimpleDateFormat(yyyy-MM-ddHH:mm:ss).format(new Date();System.out.prln(任务持续执行中);System.out.prln(任务执行结束);!- 配置JobDetailid=jobDetailclass=.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBeanprop
8、erty name=Method value=run/!-id=myTrigger.springframework.scheduling.quartz.CronTriggerFactoryBea注入任务详情对象 -property name=cronExpres0/5 * * * * ?.springframework.scheduling.quartz.SchedulerFactoryBeanWeb.xml 增加 Spring 配置的加载4、启动项目按时间策略自动执行任务,结果为:CRON 表达式是用来自定义 Quartz 执行规则的,在实际使用时可以借助动生成。具体的规则如下:工具自CRO
9、N 由七个域组成,顺序为:秒 分 时 日 月特殊字符:,以空格作为分界?contextConfigLocationclasspapplicationContext.xml.springframework.web.context.ContextLoaderListe ner使用星号(*)指示着你想在这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发这个 trigger。?号只能用在日和上,但是不能在这两个域上同时使用,指不为该域指定值逗号(,)是用来在给某个域上指定一个值列表的。例如,使用值 0,15,30,45 在秒域上意味着每 15 秒触发一个 trigger。斜杠(/)
10、是用于时间表的递增的。例如 0/15 表示每 15 分钟的递增。中划线(-)用于指定一个范围。例如,在小时域上的 3-8 意味着3,4,5,6,7 和8点L 说明了某域上允许的最后一个值。它仅被日和支持W 字符代表着平日 (-Fri),并且仅能用于日域中#字符仅能用于中。它用于指定月份中的第几周的哪一天三、动态调度管理实现1、编辑 javaWeb 工程项目 SpringEight注意:同样的代码参见上例2、增加 Service 服务层任务类业务实现 MyJobServiceImpl业务层任务动态管理工具类 QuartzManagerpublic class MyJobImpl implemen
11、ts Job /* 要动态自己定义任务 须用实现job 接口的方式*/ Overridepublicvoidexecute(JobExecutionContextarg0)throws JobExecutionException System.out.prln(备份数据库任务类开始执行了: +newSimpleDateFormat(yyyy-MM-ddHH:mm:ss).format(new Date();System.out.prln(任务持续执行中=); System.out.prln(备份数据库任务执行结束=);public class QuartzManager private Sch
12、eduler scheduler;public Scheduler getScheduler() return scheduler;public void setScheduler(Scheduler this.scheduler = scheduler;scheduler)/*/Description: 添加一个定时任务param param param param paramparamjobName 任务名jobGroupName任务组名triggerName 触发器名triggerGroupName 触发器组名jobClass任务cron时间设置SuppressWarnings( unc
13、hecked, rawtypes)public void addJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName, Class jobClass, String cron) try / 任务名,任务组,任务执行类JobDetail jobDetail=JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();/ 触发器TriggerBuilder triggerBuilder = Trigge
14、rBuilder.newTrigger();/ 触发器名,触发器组triggerBuilder.withIdentity(triggerName, triggerGroupName);triggerBuilder.startNow();/ 触发器时间设定triggerBuilder.withSchedule(CronSchedu);/ 创建Trigger 对象uilder.cronSchedule(cron)CronTrigger trigger = (CronTrigger) triggerBuilder.build();/ 调度容器设置JobDetail 和Triggerscheduler
15、.scheduleJob(jobDetail,trigger);/ 启动if (!scheduler.isShutdown() scheduler.start(); catch (Exception e) throw new RuntimeException(e);/*Description: 修改一个任务的触发时间*param jobName*/param param paramparamjobGroupName triggerName 触发器名triggerGroupName 触发器组名cron时间设置public void modifyJobTime(String jobName,Str
16、ingjobGroupName, triggerGroupName, String cron) try StringtriggerName,StringTriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);CronTrigger trigger =(CronTrigger) scheduler.getTrigger(triggerKey); if (trigger = null) return;String oldTime = trigger.getCronExpres if (!oldTime
17、.equalsIgnoreCase(cron) /* 方式一 :调用 rescheduleJob 开始 */ 触发器();TriggerBuilder TriggerBuilder.newTrigger();/ 触发器名,触发器组triggerBuilder=triggerBuilder.withIdentity(triggerName, triggerGroupName);triggerBuilder.startNow();/ 触发器时间设定triggerBuilder.withSchedule(CronSchedu);uilder.cronSchedule(cron)/ 创建Trigger
18、 对象trigger = (CronTrigger) triggerBuilder.build();/ 方式一 :修改一个任务的触发时间scheduler.rescheduleJob(triggerKey, trigger);/* 方式一 :调用 rescheduleJob结束*/ catch (Exception e) throw new RuntimeException(e);/*/Description: 移除一个任务param param paramparamjobName jobGroupName triggerNametriggerGroupNamepublic void remo
19、veJob(String jobName,String jobGroupName,String triggerName, String triggerGroupName) try TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);schedulauseTrigger(triggerKey);/ 停止触发器scheduler.unscheduleJob(triggerKey);/ 移除触发器scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupN
20、ame);/ 删除任务 catch (Exception e) throw new RuntimeException(e);3、编辑 spring 配置文件,applicationContext.xml 增加下面内容/*Description:启动所有定时任务*/public void startJobs() try scheduler.start(); catch (Exception e) throw new RuntimeException(e);/*Description:关闭所有定时任务*/public void shutdownJobs() try if (!scheduler.i
21、sShutdown() scheduler.shutdown(); catch (Exception e) throw new RuntimeException(e);4、增加调用测试类可以把每个功能定义为一个方法也可以一部分一部分测试public class jobTest Testpublic void testJob() ApplicationContext context = newClassPathXmlApplicationContext(applicationContext.xml); QuartzManager quartzManager =(QuartzManager)context.getBean(quartzManager); try System.ou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 3734-2008卡套式锥螺纹直通管接头》
- 深度解析(2026)《GBT 3047.6-2007电子设备台式机箱基本尺寸系列》
- 2026年北师大版小学二年级数学下册万以内数比较卷含答案
- 《JBT 10632-2006凸轮轴测量仪》专题研究报告
- 《JBT 10426.2-2004风力发电机组制动系统 第2部分:试验方法》专题研究报告
- 湖南中考:语文重点基础知识点总结
- 2026年党建知识竞赛试题及答案(十三)
- 2026年专业实战备考宝典全面涵盖练习题
- 2026年国际知识产权交易市场与风险防范指南题目
- 2026年幼儿园防范中小学生欺凌和暴力专项治理题库
- 2026年333题库和答案
- 2026年物业房屋维修合同(1篇)
- 2026上海嘉定区区属国有企业春季招聘笔试参考题库及答案解析
- 2026华中科技大学同济医学院附属同济医院涂胜豪教授团队招聘项目聘请制科研人员1人(湖北)考试参考题库及答案解析
- 2026年辅警招聘公安基础知识练习题及答案
- 奥美2026年意见领袖营销趋势
- 2026年江西生物联赛试卷及答案
- 2026三年级道德与法治下册全册教学设计
- 家校同心 全力冲刺2026届高三高考冲刺家长会
- 离婚协议书(2026标准版)
- 高分子溶液的相平衡课件
评论
0/150
提交评论