- 浏览: 1012052 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
用quartz实现多任务动态加载
Hudson报表系统二期结束了,这次新增了邮件定制功能,实现此功能的核心在于quartz框架。
Quartz 是什么
Quartz是一个用Java编写的任务调度框架,任务调度是什么,举例说明:比如我们需要在每个星期四下午三点时候发周报,我们需要一个系统在两点半的 时候给我们一个发周报的提醒,这个提醒就是一次任务,每周星期四下午两点半的时候自动触发这个任务,这就可以理解为这个系统的一次任务调度。Quartz 提供给我们定时调度已定义好的任务的能力,如果你了解quartz的调度计划cronExpression表达式的配置,你会感叹quartz的灵活与强 大。
Quartz的应用广泛,对于Hudson报表系统,恰好为邮件定制功能提供强有力的支持。
Quartz 的简单使用
在Hudson报表系统的一期中也用到了quartz,不过当时是把任务调度信息写死在配置文件中,每次系统启动后,调度的配置都加载在内存中,没有实现 多任务的动态加载。我们先以此来说明quartz的基本用法。Hudson报表系统是用spring框架将quartz整合起来的,故只介绍spring 和quartz的整合使用。
下图为spring配置文件中quartz的配置:
其实quartz的使用主要有三个部分,一个调度器Scheduler,一个要被调度的任务JobDetail,一个触发器Trigger,对上面的配置做一说明,在图中从下到上:
1、 配置一个job,这个job就是我们要调度的任务类,
2、 配置jobDetail,jobDetail需要加载job实现类,并且指定目标方法即完成任务需要执行的方法为execute,在这个方法里面定义我们要做的任务,execute方法需要我们在job类中实现。
3、 配置trigger,用于触发我们定义的任务,在触发器的配置中,我们需要加载需要调度的任务jobDetail,当然还要配置好我们需要触发的时间,触 发的时间配置在cronExperssion表达式中,这个表达式非常灵活与强大,举个例子:我们需要每个工作日早八点到晚八点之间,每半个小时触发一次 任务,我们可以将表达式配置为:0 0/30 8-20 ? * MON-FRI。这个表达式的详细解释可以登录Hudson报表系统(链接:http://10.232.29.21:8080/hudson-report/ ),点击邮件信息维护里面的“邮件发送时间计划配置帮助”查看。
4、 配置scheduler,只需要加载trigger即可,可以在list标签下配置多个trigger。注意,scheduler的配置中有个lazy- init=false的配置,这表明只要我们的spring一启动,quartz的scheduler也跟着启动,否则其值为true的话,会因为惰性加 载的问题,导致quartz不起作用,此项默认值是false。
至此,我们的配置写好了,只需要实现拥有execute方法的job类就可以了。
这种方法也可以实现多任务调度,具体做法为:我们每新增一个调度,就需要在配置文件中多加这个调度相关的配置,这样显然很麻烦。
Quartz 的多任务动态加载
先做简要说明:
多个任务的动态加载是指:在当前的scheduler中已经有可触发的任务的情况下,我们需要新增一条任务进去,并且使得新增的任务也立即加载到 scheduler中,等待触发。要实现这样的功能,上面的方法明显不能达到,而且我们需要使得我们的任务状态持久化,即每次重启quartz后,自动加 载重启前拥有的任务,把任务保存于内存也明显不能达到此目的。怎么办?添加数据库支持,将信息保存于数据表中。
Quartz的官方文档中提供了在各种类型数据库中建立数据表的sql文件(/docs/dbTables目录下),我们采用MySQL数据库可以选择 tables_mysql_innodb.sql这个文件。这里需要注意的是编码,quartz默认采用latin1编码,我们一般用urf-8或者 gbk编码,建立表的时候会提示表中存在过长的字段,怎么办,改编码?但我们需要中文字符,所以我们可以将过长的字段长度改为支持的长度即可,现阶段并没 有发现副作用。
建立起来的数据表如下图:
共十二张表,从上到下依次解释:
qrtz_blob_triggers:
qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范围。
qrtz_cron_triggers:存放cron类型的触发器
qrtz_fired_triggers:存放已触发的触发器
qrtz_job_details:存放一个jobDetail信息
qrtz_job_listeners:job监听器
qrtz_locks:
qrtz_paused_trigger_graps:存放暂停掉的触发器
qrtz_scheduler_state:调度器状态
qrtz_simple_triggers:简单触发器的信息
qrtz_trigger_listeners:触发器监听器
qrtz_triggers:触发器的基本信息
Quartz的触发时间的配置有三种方式:
cron的方式:采用cronExpression表达式配置时间;
simple的方式,和JavaTimer差不多,可以指定一个开始时间和结束时间外加一个循环时间;
calendars方式,可以和cron配合使用,用cron表达式指定一个触发时间规律,用calendar指定一个范围。
我们采用的是cron方式,需要用到的数据表主要是:qrtz_triggers ,qrtz_cron_triggers,qrtz_fired_triggers,qrtz_job_details。
到这里开始讲到底怎么来实现我们的多任务动态加载。
其实我们要实现我们的多任务动态调度根本不需要了解这些表,我们要做的只是实现一个做任务的job类,然后新建一个jobDetail,设置参数,新建一个trigger,设置参数,一起加入到scheduler里面去就行了。具体过程如下:
1、 建立数据表,配置好数据库连接。
2、 在Spring的配置文件中配置好schedule:
其中dataSource配置的是数据库连接,threadCount配置的是容许同时5个任务触发,
startupDelay配置的是触发启动后的时延,这些配置的具体信息大家可以阅读quartz的官方帮助文档来了解。
3、 建立一个用于提供schedule服务的接口ScheduleService及其实现类ScheduleServiceImpl,
这里提供scheduleJob的方法作为示例,以我们的邮件任务为例,我们直接传入一条邮件记录对象,这个对象拥有id,name,收件人,抄送人,主题,还要有一个cronExpression表达式用于定时发送,看具体实现:
在上面的方法中,我们要新增一条邮件任务的时候,拿到这个邮件信息对象,先新建一个JobDetail对象,设置参数,setName方法可以给 jobDetail对象指定一个名字,我们希望一条邮件信息对象对应一个jobDetail,故把邮件信息对象的id传入,否则假如两次新增任务时 jobDetail的名字一样,那么后者会覆盖前者的数据,使得前者失效。JopDataMap里面可以保存我们需要传入的业务参数,邮件信息的参数就保 存在邮件信息对象里面,所以我们把整个对象传入,最重要的是setJobClass这个方法,设置了要处理我们任务的类,使得任务触发后quartz知道 去哪里执行任务。最后将此任务加入scheduler。
然后新建一个CronTrigger对象,构造对象的时候就传入trigger自己的名字和所在组,jobDetail的名字和所在组,设置好 cronExpression表达式,这样此trigger就会按此表达式的计划做触发。需要说明的是:一个jobDetail可以对应多个 trigger,只要在构造时设置trigger名字不同,而jobDetail的名字相同,就可以为相同的jobDetail建立不同的trigger 触发器。而且对于trigger也可以设置jobDataMap,保存此触发器触发时需要的业务参数。
最后SchedulerJob方法把trigger加入scheduler,等待触发。
4、 建立任务类MyJob,MyJob类需要继承QuartzJobBean类,重载其executeInternal方法:
在重载executeInternal方法时,其形参jobExecutionContext中包含了触发任务的环境信息,和触发这个任务的jobDetail实例和trigger实例,我们可以从中取得我们想要的信息。
发表评论
-
调试jdk中的源码,查看jdk局部变量
2013-06-15 23:30 1049调试jdk中的源码,查看jdk局部变量 2012-04 ... -
Eclipse快捷键 10个最有用的快捷键<转>
2013-04-11 23:28 1072Eclipse中10个最有用的快捷键组合 一个Eclip ... -
Lucene 3.6 中文分词、分页查询、高亮显示等
2012-12-09 23:35 18131、准备工作 下载lucene 3.6.1 : htt ... -
Maven实战(九)——打包的技巧(转)
2012-10-12 00:41 933“打包“这个词听起 ... -
基于Maven的web工程如何配置嵌入式Jetty Server开发调试环境(转)
2012-10-12 00:28 9231、首先在web工程的POM文件里添加依赖jar包如下: ... -
轻轻松松学Solr(1)--概述及安装[转]
2012-09-18 14:59 991概述 这段时间对企 ... -
分析Netty工作流程[转]
2012-09-04 19:02 885下面以Netty中Echo的例 ... -
让eclipse在ubuntu下面好看一点
2012-03-27 10:17 915<p> </p> <h1 cla ... -
zookeeper安装和应用场合(名字,配置,锁,队列,集群管理)[转]
2012-01-12 17:59 1647安装和配置详解 本文 ... -
Jakarta-Common-BeanUtils使用笔记[转]
2012-01-10 14:13 1153Jakarta-Common-BeanUtils ... -
一个关于Java Thread wait(),notify()的实用例【转】
2012-01-07 16:05 1019///// // ProducerConsume ... -
Java基础:Java中的 assert 关键字解析【转】
2012-01-06 19:50 1056J2SE 1.4在语言上提供了 ... -
一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发[转]
2012-01-06 15:02 1262六种异常处理的陋习 ... -
如何解决HP QC(Quality Center)在Windows 7下不能工作的问题
2011-12-26 10:48 1576HP QC(Quantity Center) 是一款不错的测 ... -
JAVA读写文件,中文乱码 【转】
2011-12-19 23:43 2115最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来。 ... -
Java 6 JVM参数选项大全(中文版)【转】
2011-12-19 19:51 969Java 6 JVM参数选项大全(中文版) 作者 ... -
使用assembly plugin实现自定义打包【转】
2011-12-13 01:58 966在上一篇文章中,讨论到在对maven的机制不熟悉的情况下,为了 ... -
使用maven ant task实现非标准打包[转]
2011-12-13 01:56 1045maven很强大,但是总有些事情干起来不是得心应手,没有使用a ... -
Java日期转换SimpleDateFormat格式大全【转】
2011-12-08 20:22 130924小时制时间 显示: public clas ... -
使用Spring的表单标签库
2011-11-22 20:08 106913.9. 使用Spring的 ...
相关推荐
3. **集群支持**:Quartz.NET可以在多服务器环境下运行,通过集群实现任务的负载均衡和故障转移。 4. **API**:Quartz.NET提供了一套丰富的API,使得开发者能够方便地创建、修改和删除作业与触发器。 **C#编程** ...
通过上述介绍,我们可以看到使用 Quartz 实现动态定时任务不仅可以大大提高系统的灵活性,还能更好地满足业务需求的变化。同时,通过对数据库配置信息的动态加载和更新,还可以实现更加精细化的任务管理和控制。当然...
在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+mybatis+quartz动态定时任务创建"就是一个常见的技术栈,用于实现这样的目标。这个组合充分利用了各组件的优势,提供了强大的后端服务支持...
在很多场景下,我们可能需要动态地修改任务的配置,而无需重启服务器。这个示例就是关于如何在不重启服务器的情况下,利用Quartz实现自定义配置的更改。 首先,我们需要了解Quartz的基本概念: 1. **Job**:是实际...
实现动态加载的方式有很多种,例如使用Java的`java.util.Properties`类结合监听器,或者利用第三方库如Apache Commons Configuration。 接下来,我们转向Spring Quartz。Spring Quartz是一个强大的任务调度框架,...
Quartz.NET 是一个开源的作业调度框架,专为.NET ...总之,Quartz.NET 是一个强大的任务调度工具,通过加载到 Windows 服务,可以实现持续且可靠的后台任务执行。开发者可以通过其丰富的特性来满足各种复杂的调度需求。
通过学习Quartz.NET的源码,我们可以理解其内部调度算法,如PriorityBlockingQueue在处理并发和优先级方面的实现,以及如何通过ThreadPool或线程池进行任务调度。同时,这也有助于我们更好地调试和优化自己的任务...
接下来,配置Quartz以使用数据库存储任务信息。在`application.yml`或`application.properties`中设置: ```yaml quartz: job-store-type: jdbc jdbc-job-store-settings: dataSource: myDataSource table-...
Quartz调度器可以在应用启动时加载这些配置,实现定时任务的自动化执行。 4. **插件部署** TaskManager.Plugins可能指的是Quartz的插件系统,它允许扩展Quartz的功能。Quartz提供了一些内置插件,如JobStore(用于...
在这个简单的示例中,我们将探讨如何利用Quartz来实现动态定时任务,并理解相关的核心概念。 首先,让我们了解Quartz的基本组成部分: 1. **Job**:在Quartz中,Job代表了实际要执行的任务。你需要创建一个Job类,...
本项目聚焦于使用Java编程语言和Quartz库来实现一个简单的任务调度器。 Quartz是一个开源的作业调度框架,允许开发者创建、调度和管理任务。它提供了丰富的API,支持复杂的调度策略,如定时、间隔、依赖关系等。...
- 了解如何在Web应用(如Spring Boot)中集成Quartz,创建一个启动时自动加载的定时任务。 - 学习如何动态管理任务,如添加、删除、暂停和恢复定时任务。 这个Demo提供了一个很好的起点,帮助开发者快速上手...
本教程将深入探讨如何使用Quartz与Spring框架结合来创建一个能从数据库读取配置的定时任务。 Quartz是一个开源的作业调度框架,它提供了丰富的API和功能,可以用来安排和执行任务。Spring框架则是一个全面的企业级...
也可以作为独立程序的集群来被初始化(通过负载平衡和 fail-over capabilities),进而执行多任务。 任务调度 任务调度是 Quartz Scheduler 的核心功能。当给定触发器被触发后相应的任务会被执行。触发器可以是...
Quartz和IIS是两种在IT领域中广泛使用的工具,它们分别用于任务调度和Web服务管理。这篇内容将深入探讨这两个概念以及如何解决IIS闲置时间的问题。 首先,让我们了解Quartz。Quartz是一个开源的Java作业调度框架,...
在题目中的代码中,`SchedulerFactoryBean` 被配置为非懒加载,这意味着当 Spring 上下文初始化时,Quartz 调度器就会被创建并准备好调度任务。 ```xml <bean name="quartzScheduler" class="org.springframework....
- **动态任务管理**:通过API动态添加、修改或删除任务,实现任务管理的灵活性。 - **监控与日志**:可以集成监控工具,如Quartz Admin,以便实时查看任务状态,同时确保有良好的日志记录系统,便于问题排查。 在...
3. **集群支持**: 在多台服务器环境下,Quartz可以通过共享数据库或JDBC作业存储实现任务的负载均衡,确保任务的正确执行。 4. **插件扩展**: Quartz提供了丰富的插件,如邮件通知插件,可以在任务执行失败时发送...
在本实例中,我们可能会看到一个自定义的Job类,该类继承自`org.quartz.Job`接口,并实现`execute(JobExecutionContext context)`方法,这个方法是实际执行的任务逻辑。 在Quartz中,我们还需要一个Scheduler实例来...
为了监控任务的执行情况,可以使用Quartz提供的Web界面或集成到Spring Boot Actuator等监控工具。 6. **优化和扩展**:根据网站的规模和需求,你可能需要考虑并发生成、错误处理、缓存同步等问题。例如,可以使用多...