180 likes | 629 Views
20.6 实现任务的自动调度 (quartz). JSP 视频教学课程. Quartz 介绍. Quartz 是 OpenSymphony 开源组织在 Job scheduling 领域又一个开源项目 , 它可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。 Quartz 可以用来创建简单或为运行十个,百个,甚至是好几万个 Jobs 这样复杂的日程序表。 Jobs 可以做成标准的 Java 组件或 EJBs 。 Quartz 是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。
E N D
20.6 实现任务的自动调度(quartz) JSP 视频教学课程
Quartz 介绍 • Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。 • Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。 • Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。 • 基本结构 • 任务调度器Scheduler • 作业Job • 触发器Trigger • 任务分配 • 任务控制 • 任务存储
Quartz 介绍 • 任务调度器Scheduler • 是Quartz框架的核心,管理 Scheduler,管理 Job,Trigger 和 Calendar • 基本用法 • 使用配置文件初始化工厂 • new StdSchedulerFactory("quartz.properties"); • 或factory.initialize("quartz.properties"); • 启动任务调度器 • SchedulerFactory factory = new StdSchedulerFactory("quartz.properties"); • Scheduler scheduler = factory.getScheduler(); • scheduler.start(); • 暂停任务调度器 • scheduler.standBy(); • 关闭任务调度器 • scheduler.shutdown();或scheduler.shutdown(true);
Quartz 介绍 • 作业Job • 一个 Quartz Job 就是一个需要执行一个任务的 Java 类 • 编写一个任务需要实现org.quartz.Job接口 • public class myJob implements Job { • public void execute(JobExecutionContext context) • throws JobExecutionException { • // 方法体 • } • } • 当scheduler调用该任务时,就执行execute()方法 • 可以通过JobDataMap向Job传递数据
Quartz 介绍 • 触发器Trigger • 触发器决定何时去执行一个Job • Quartz中有三种Trigger • SimpleTrigger 简单的触发器,可以实现基本的定时触发功能,如以固定的时间间隔执行n次Job • CronTrigger 使用克隆表达式来设定任务触发的时间,如 “0 0/5 8 ? * 1,2 *” 格式为 “秒 分 时 日 月 周 年” • NthIncludedDayTrigger 用于设定某一间隔类型的第几天执行任务,如 NthIncludedDayTrigger trigger = new NthIncludedDayTrigger( "MyTrigger", Scheduler.DEFAULT_GROUP); trigger.setIntervalType( NthIncludedDayTrigger.INTERVAL_TYPE_MONTHLY); trigger.setN(15);
Quartz 介绍 • 任务分配 • 实例化JobDetail,Job不直接注册到scheduler,而是通过JobDetail • JobDetail jobDetail = new JobDetail(jobName, Scheduler.DEFAULT_GROUP,jobClass); • Job名称和组名称唯一地决定一个任务,不能重复 • 可以通过JobDataMap向Job类传递数据 • 实例化触发器Trigger • Trigger trigger = new CronTrigger(triggerName,Scheduler.DEFAULT_GROUP, cronExp); • Trigger名称和组名称唯一地决定一个触发器,不能重复 • JobDetail和Trigger组成一个计划任务,注册到scheduler • scheduler.schedule(jobDetail,trigger); • 一个JobDetail能够支持多个Trigger,但一个Trigger只能被指派给一个Job
Quartz 介绍 • 任务控制 • 移除任务,scheduler.deleteJob(jobName, groupName); • 暂停任务,scheduler.pauseJob(jobName, groupName); • 暂停trigger,scheduler.pauseTrigger(triggerName, groupName); • 恢复任务,scheduler.resumeJob(jobName, groupName); • 恢复trigger,scheduler.resumeTrigger(triggerName, groupName); • 重新分配trigger, scheduler.rescheduleJob(triggerName, groupName, newTrigger)
Quartz 介绍 • 任务存储JobStore • Quartz 用 JobStores 对 Job、Trigger、calendar 和 Schduler 数据提供一种存储机制。 • Quartz中提供两种Job存储机制 • 内存(非持久化)存储 • 优点: • 配置简单 • 速度快 • 缺点: • 程序停止后,所有信息都无法恢复 • 持久化存储 • 程序再重启后能不能恢复任务,取决于所采用的JobStore类型
Quartz 介绍 • Quartz配置 • Quartz配置文件quartz.properties主要分为以下几部分 • Main Scheduler Properties • ThreadPool 线程池 • JobStore 任务存储 • DataSources 数据源 • Plugins 插件
Quartz 介绍 • Main Scheduler Properties 配置 • org.quartz.scheduler.instanceName = TestScheduler • org.quartz.scheduler.instanceId = AUTO • 说明 • instanceName用于区分多个scheduler实例 • instanceId必须是所有scheduler实例中唯一的,设为AUTO,则为quartz生成 • 集群环境下生成为主机名加上当前的日期和时间 • 非集群环境下生成为NON_CLUSTERED
Quartz 介绍 • ThreadPool线程池配置 • org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool • org.quartz.threadPool.threadCount = 5 • org.quartz.threadPool.threadPriority = 5 • 说明: • threadCount为线程池大小 • threadPriority为线程优先级
Quartz 介绍 • JobStore任务存储设置 • org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX • 配置使用的JobStore的类型 • org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.MSSQLDelegate • 配置使用的数据库代理 • org.quartz.jobStore.misfireThreshold = 60000 • 错过触发时间后,是否还会执行任务的阈值,错过时间超过此值则不执行 • org.quartz.jobStore.tablePrefix = QRTZ_ • 所使用的数据库表前缀 • org.quartz.jobStore.dataSource = myDS • 数据源名称,与后面的数据源配置对应
Quartz 介绍 • DataSources数据源配置 • org.quartz.dataSource.myDS.driver = net.sourceforge.jtds.jdbc.Driver • 数据库jdbc驱动 • org.quartz.dataSource.myDS.URL = jdbc:jtds:sqlserver://192.168.1.109:1433;databasename=quartz • 连接数据库url • org.quartz.dataSource.myDS.user = sa • 数据库用户名 • org.quartz.dataSource.myDS.password = sa • 数据库密码 • org.quartz.dataSource.myDS.maxConnections = 5 • 数据库最大连接数
SPRING与QUARTZ集成 • Spring提供了对QUARTZ的支持。使用者需要做的就是提供QUARTZ运行时所需要的作业及触发器的相关信息。下面看一段配置: <beans> <!-- 要调用的工作类 --> <bean id="quartzJob" class="com.kay.quartz.QuartzJob"></bean> <!-- 定义调用对象和调用对象的方法 --> <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 调用的类 --> <property name="targetObject"> <ref bean="quartzJob"/> </property>
SPRING与QUARTZ集成 <!-- 调用类中的方法 --> <property name="targetMethod"> <value>work</value> </property> </bean> <!-- 定义触发时间 --> <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="jobtask"/> </property> <!-- cron表达式 --> <property name="cronExpression"> <value>10,15,20,25,30,35,40,45,50,55 * * * * ?</value> </property> </bean>
SPRING与QUARTZ集成 • 在这段配置里面定义了作业和触发器,这也是和业务相关的信息。 <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="doTime"/> </list> </property> </bean> </beans>
"0 0 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分每分钟一次触发 • "0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发 • "0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 • "0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发 • "0 10,44 14 ? 3 WED" 三月的每周三的14:10和14: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" 每月最后一个周五的10:15触发 • "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月最后一个周五的10:15触发 • "0 15 10 ? * 6#3" 每月的第三个周五的10:15触发
谢谢收看! JSP 视频教学课程