最近在做一个自动探测服务的功能。需要每天在后台自动执行。所以很容易就想到用Quartz框架。这个框架和spring集成使用是相对比较简单的。我们就一些概念在这里记录一下。为方便以后回忆和复习。
简单来说quratz框架主要有几个必须理解的名[img][/img]词。他们主要是job jobdetail trigger Calendar Scheduler。下面就他们来一一简述。
job 简单的来说他就是一个接口。主要包含一个方法。void execute(JobExecutionContext context)开发者如果来定义任务类就必须实现这个接口。JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在 JobDataMap实例中;
jobdetail quartz每次运行都需要生成一个实例类。而job是接口,所以就得需要这个实例类。通过构造函数,你就可以清晰的看到这个jobdetail的实际用法。JobDetail(java.lang.String name, java.lang.String group, java.lang.Class jobClass),构造函数需要指定job的名字,所处的组,以及实现job接口的实体类。
trigger 是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;
Calendar:org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。
SchedulerScheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在 Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。
Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。 Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和 Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例;
●ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。
Job有一个StatefulJob子接口,代表有状态的任务,该接口是一个没有方法的标签接口,其目的是让Quartz知道任务的类型,以便采用不同的执行方案。无状态任务在执行时拥有自己的JobDataMap拷贝,对JobDataMap的更改不会影响下次的执行。而有状态任务共享共享同一个 JobDataMap实例,每次任务执行对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,也即每次执行任务后都会对后面的执行发生影响。
正因为这个原因,无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行,这意味着如果前次的StatefulJob还没有执行完毕,下一次的任务将阻塞等待,直到前次任务执行完毕。有状态任务比无状态任务需要考虑更多的因素,程序往往拥有更高的复杂度,因此除非必要,应该尽量使用无状态的Job。
如果Quartz使用了数据库持久化任务调度信息,无状态的JobDataMap仅会在Scheduler注册任务时保持一次,而有状态任务对应的JobDataMap在每次执行任务后都会进行保存。
Trigger自身也可以拥有一个JobDataMap,其关联的Job可以通过 JobExecutionContext#getTrigger().getJobDataMap()获取Trigger中的JobDataMap。不管是有状态还是无状态的任务,在任务执行期间对Trigger的JobDataMap所做的更改都不会进行持久,也即不会对下次的执行产生影响。
Quartz拥有完善的事件和监听体系,大部分组件都拥有事件,如任务执行前事件、任务执行后事件、触发器触发前事件、触发后事件、调度器开始事件、关闭事件等等,可以注册相应的监听器处理感兴趣的事件。
图1描述了Scheduler的内部组件结构,SchedulerContext提供Scheduler全局可见的上下文信息,每一个任务都对应一个JobDataMap,虚线表达的JobDataMap表示对应有状态的任务:
Scheduler结构图
一个Scheduler可以拥有多个Triger组和多个JobDetail组,注册Trigger和JobDetail时,如果不显式指定所属的组,Scheduler将放入到默认组中,默认组的组名为Scheduler.DEFAULT_GROUP。组名和名称组成了对象的全名,同一类型对象的全名不能相同。
Scheduler本身就是一个容器,它维护着Quartz的各种组件并实施调度的规则。Scheduler还拥有一个线程池,线程池为任务提供执行线程——这比执行任务时简单地创建一个新线程要拥有更高的效率,同时通过共享节约资源的占用。通过线程池组件的支持,对于繁忙度高、压力大的任务调度,Quartz将可以提供良好的伸缩性。
ps:http://www.iteye.com/topic/210482
- 大小: 39.5 KB
分享到:
相关推荐
Spring 和 Quartz 是两个在 Java 开发中常用的框架,Spring 是一个全面的企业级应用开发框架,而 Quartz 是一个开源的作业调度框架,常用于实现定时任务。在这个文档中,我们将探讨如何将它们结合使用来实现一个...
Quartz是一款开源的作业调度框架,它允许开发者创建和管理定时任务,以便在特定时间执行。在Java世界中,Quartz被广泛应用于自动化任务、批处理以及后台服务的定时触发等场景。本教程将带你逐步了解Quartz的基础知识...
Quartz 是一个强大的开源作业调度框架,专为 Java 平台设计,无论是 J2SE 还是 J2EE 应用程序,都能轻松集成。它的核心功能在于允许开发者定义任务和调度策略,使得应用程序能够在预定的时间执行特定的任务,极大地...
Quartz是一个完全由Java编写的开源作业调度框架,它可以用来调度各种类型的任务,如执行数据库脚本、发送邮件等。Quartz支持 Cron 表达式和触发器,可以灵活地定义任务执行的时间和频率。它还提供了集群功能,确保在...
Quartz 是一个开源的作业调度框架,用于在 Java 应用程序中安排任务。Quartz 使用简单、灵活的 API 来创建、管理和执行作业。在本文中,我们将深入探讨如何在 .NET 应用程序中使用 Quartz.NET,这是一个专门为 .NET ...
通常,此类框架会包含定时任务的创建、调度、取消和管理等功能。 3. **定时任务的创建** 在定时器框架中,创建定时任务通常涉及定义一个Runnable或Callable对象,然后通过定时器接口将其与特定的时间点或周期关联...
然而,Spring Batch 不是一个调度框架,它专注于任务的执行,而任务的调度通常需要结合其他如 Quartz 这样的调度工具来完成。 在整合 SpringBatch 到 SpringBoot 微服务系统中,我们需要进行以下步骤: 1. **添加 ...
此外,还可以使用Quartz或CronTrigger等库来实现更复杂的定时任务调度。 项目的readme.htm文件可能是项目说明文档,包含了如何构建、运行以及测试项目的指导。而3220961264583680.zip文件可能包含了项目的所有源...
7. **任务调度**:如果系统有定时发布、审核兼职信息等功能,可能会使用Quartz或Spring Task等任务调度库。 8. **前端页面布局与交互**:微信小程序的界面设计需考虑用户体验,包括布局、颜色搭配、图标设计、按钮...
Quartz 是一个开源的作业调度框架,可以集成到 Spring 中,用于实现更复杂的定时任务。Spring 提供了对 Quartz 的支持,简化了它的配置和使用。 **Spring Security** Spring Security 是一个全面的安全框架,提供...
`TaskScheduler`接口提供了一个调度任务的方法,而`@Scheduled`注解则可以用于标记需要定时执行的方法。 在上述文档的示例中,我们看到一个名为`ExcelAccountHolderImport`的类,该类继承了`HibernateDaoSupport`,...
Spring 2.0支持Quartz作为任务调度框架,方便地进行定时任务的管理和执行。 ### 10. 支持JMX(Java Management Extensions) Spring 2.0通过`PlatformMBeanServer`接口提供了对JMX的集成,使得应用中的bean可以...
1. **定时任务**:使用Quartz等定时任务调度库,定期启动爬虫任务。 2. **增量更新**:只抓取新产生的数据,提高效率。 #### 增量更新 1. **检查更新标记**:通常基于时间戳或版本号等字段判断数据是否已经存在。 2...
在Spring中,我们可以利用其内置的定时任务功能来实现周期性的任务执行,而无需依赖其他外部定时框架如Quartz或Cron。本篇文章将详细介绍两种使用Spring自身实现轻量级定时器的方法。 方法一:基于`@Scheduled`注解...
- **Quartz**: 一个强大的任务调度框架。 - **Zookeeper**: 分布式服务协调框架。 #### 开发工具与方法 - **MyEclipse**: Eclipse的一个增强版IDE,支持Java EE开发。 - **Eclipse**: 开源的集成开发环境。 - **SVN...
- **任务管理**:实现任务的创建、分配、跟踪和完成,可能涉及到Quartz或Spring Task进行定时任务的调度。 - **审批流程**:可能使用工作流引擎如Activiti或Flowable,实现流程定义和执行。 - **文档管理**:存储...
- **定时任务框架**:如Quartz,用于调度执行计划任务。 - **Web服务器与中间件**:例如Tomcat、Nginx等,涉及服务部署与性能优化。 - **分布式框架**:如Dubbo,用于构建高性能、易扩展的微服务架构。 - **开发工具...
在IT行业中,调度器(Scheduler)是一个至关重要的概念,尤其在任务自动化、资源管理以及时间驱动的系统中。本文将围绕“工作日计划程序入门代码”这一主题,深入探讨scheduler的相关知识点,并结合HTML标签来说明...
“Quartz”是一个开源的作业调度库;“POI”是Apache提供的操作Microsoft Office文档的Java库;“workflow”指的是工作流,涉及工作流程管理和自动化;“dwr”即Direct Web Remoting,是一个用于允许Web页面上的...