`
feicer
  • 浏览: 133191 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Quartz 项目应用

阅读更多
       Quartz是一个强大的企业级Schedule工具,也是目前最好的开源Schedule 工具


        在Quartz 的应用中,我们用到了以下的一些东西,ScheduleFactory, Scheduler, Job, JobDetail, Trigger,简单说明一下他们的用途。

SchedulerFactory 是 Scheduler 的工厂,我们可以从中获得受工厂管理的 Scheduler 对象。

SchedulerFactory scheduleFactory = new StdSchedulerFactory();
Scheduler scheduler = scheduleFactory.getScheduler();


Scheduler 是一个计划集,其中可以包含多个 JobDetail 和 Trigger 组成的计划任务。

        我们可以从 SchedulerFactory 中取得 Scheduler。

        1.
        接口Job是每个业务上需要执行的任务需要实现的接口,该接口只有一个方法:

    public interface Job {
        public void execute(JobExecutionContext context)
        throws JobExecutionException;
    }   
    
     
我们可以在里面定义我们的 Job 执行逻辑,比如清除过期数据,更新缓存等。

        JobDetail描述了一个任务具体的信息,比如名称,组名等等。

JobDetail jobDetail = new JobDetail("SayHelloWorldJob", Scheduler.DEFAULT_GROUP, SayHelloWorldJob.class);    在上面的构造方法中,第一个是任务的名称,第二个是组名,第三个就是实际当任务需要执行的回调类。

        2.

        Trigger顾名思义就是触发器,Quartz有个很好的想法就是分离了任务和任务执行的条件。Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。分离的好处是:
1.你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件
2.当Trigger失效后(比如:一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。


        目前的Quartz实现中,存在两种Trigger,SimpleTrigger和CronTrigger,SimpleTrigger用来完成一些比如固定时间执行的任务,比如:从现在开始1分钟后等等;而CronTrigger(没错,和unix的cron进程的含意一样)用来执行calendar-like的任务,比如:每周五下午3:00,每月最后一天等等。

        在一些项目中,都是一些固定时间的 Job,所以只用到了 SimpleTrigger。

Trigger trigger = new SimpleTrigger("SayHelloWorldJobTrigger",Scheduler.DEFAULT_GROUP,new Date(),null,0,0L);        这个构造方法中,第一个是Trigger的名称,第二个是Trigger的组名,第三个是任务开始时间,第四个是结束时间,第五个是重复次数(使用SimpleTrigger.REPEAT_INDEFINITELY常量表示无限次),最后一个是重复周期(单位是毫秒),那么这样就创建了一个立刻并只执行一次的任务。

        3.
        我们定义好了 JobDetail,Job,和 Trigger 后,就可以开始 Schedule 一个 Job 了。 scheduler.scheduleJob(jobDetail, trigger);
        这条语句就是把job和Trigger关联,这样当Trigger认为应该触发的时候就会调用(实际上是Scheduler调用)job.execute方法了。

scheduler.start();
        千万别忘了加上上面的语句,这条语句通知Quartz使安排的计划生效。

        4.


        关于execute方法的参数JobExecutionContext
        JobExecutionContext就和很多Context结尾的类功能一样,提供的运行时刻的上下文环境,JobExecutionContext中有Scheduler,JobDetail,Trigger等很多对象的引用,从而当你在execute方法内部须需要这些对象的时刻提供的便利。

        在项目中,我们把需要执行的 Job 相对应的一些信息放在 JobExecutionContext 中,在 Job 执行的时候可以调用。

jobDetail.getJobDataMap().put(userid, id);

        在 Job 中,我们可以拿到相关的 Context 信息:

jobExecutionContext.getJobDetail().getJobDataMap().getInt(userid);

       
        5.
        JobDetail和Trigger的name和group
        Scheduler实例对应了很多job和trigger的实例,为了方便的区分,Quartz使用name和group这两个特性,正如你想向的一样,同一个group下不能有两个相同name的JobDetail,Trigger同理,同一个Scheduler下不能有两个相同group的JobDetail,Trigger同理,JobDetail和Trigger的完全限定名为:group + name

        6.
        为了让服务器重启以后,我们的 Scheduler 信息仍然不丢失,我们通常采用数据库持久化 Scheduler 的信息。
DBScript. 在 Quartz 的下载包中的:quartz-1.6.0\docs\dbTables 下,选择自己使用的 DB 相应的 Script. 导入数据库就可以了。
        在应用中,我们需要配置一个 quartz.properties 才能正常使用 DB。我们可以在 quartz-1.6.0\examples\example10 中找到该文件的样例,稍作一些修改,就可以放到自己项目源码的根目录下使用了。
        设置 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 即可启用基于 JDBC 的 Quartz 信息持久化。

        根据项目情况设置以下配置信息:
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false

org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/myapplication
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password =
org.quartz.dataSource.myDS.maxConnections = 5


        光设置了 Database 不够,我们还需要在 Application 启动的时候自动启动 Scheduler 才行,我们只需要简单的写一个 Servlet 的 Listener 并在 web.xml 中声明该 Listener ,在 Servlet 容易启动的时候,Scheduler 就开始自动执行。
public class ScheduleStartListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        try {
            scheduleFactory.getScheduler().start();
        } catch (SchedulerException e) {
            // write log
        }
    }
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        try {
            scheduleFactory.getScheduler().shutdown();
        } catch (SchedulerException e) {
            // write log
        }
    }
}


在 web.xml 里面加入以下配置:

<listener>
    <listener-class>org.agilejava.scheduler.ScheduleStartListener</listener-class>
</listener>
分享到:
评论

相关推荐

    quartz指南,Quartz 工程

    Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独...

    自开发实现Quartz Web管理工具

    而且网上那个东西稍微还是有点复杂的,不方便集成的自己的项目中,无论是风格还是样式。 基于这样的原因,也是为了学习一个Quartz(以前还没有用到过)。就想着做一个简单Quartz的Web管理工具。包括可以添加一个...

    Quartz开源项目实例

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以...

    quartz1.5,quartz1.6,quartz1.8

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表

    Spring+Quartz集群部署案例

    最近项目中使用了spring+Quartz定时任务、但是项目最近要集群部署、多个APP下如何利用Quartz 协调处理任务。 大家可以思考一下、现在有 A、B、C三个应用同时作为集群服务器对外统一提供服务、每个应用下各有一个...

    quartz 在WEB中应用小结

    博文链接:https://daoger.iteye.com/blog/195486

    Quartz_2.2.1_API

    Quartz 是个开放源码项目,提供了丰富的作业调度集。在这篇文章中,软件工程师 Michael Lipton 和 IT 架构师 Soobaek Jang 对 Quartz API 进行了介绍,从对框架的一般概述开始,并以一系列展示 Quart 基本特性的代码...

    Quartz+spring实例应用

    Quartz+spring实例应用 导入项目直接可以运行,注释详细

    spring整合java quartz实现动态定时任务的前台网页配置与管理

    在实际项目应用中经常会用到定时任务,可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间、频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quartz与spring的组合...

    Quartz jar包和相关资料2.3.0

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成...

    quartz-1.6.5.jar+quartz-all-1.6.5.jar.zip

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。

    quartz-1.6.5 API

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可 以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs...

    spring-Quartz(作业调度)

    Quartz 是个开放源码项目,提供了丰富的作业调度集。在这篇文章中,软件工程师 Michael Lipton 和IT 架构师 Soobaek Jang 对 Quartz API 进行了介绍,从对框架的一般概述开始,并以一系列展示 Quart 基本特性的代码...

    Quartz教程

    本人最近学习了传智播客的一个电商项目,把里面用到的工具和大家分享一下,方便大家的javaweb的学习。-quartz基本上任何公司都会用到调度这个...正如官网所说,小到独立应用大到大型电子商务网站, Quartz都能胜任。

    P2P网络借贷平台项目SSH+Redis+ActiveMQ+POI+Shiro+AngularJS+Nginx+Quartz等

    3、该项目采用了struts2 hibernate spring和 spring data jpa 开源框架完成,并融入了cxf开源webservice框架的应用,而这些技术都是当下流行的技术。 4、在缓存方面运用了互联网的流行技术redis实现缓存存贮,...

    Java定时器 quartz jar包

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成...

    quartz-all-1.8.4

    Quartz 是个开放源码项目,提供了丰富的作业调度集。在这篇文章中,软件工程师 Michael Lipton 和 IT 架构师 Soobaek Jang 对 Quartz API 进行了介绍,从对框架的一般概述开始,并以一系列展示 Quart 基本特性的代码...

    quartz学习ppt,document和示例代码

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。

    spring+quartz实现定时任务动态管理

    本项目实现对quartz定时任务的增加、停止、恢复等功能。前端为jQuery+ bootstrap实现可视化操作,附带有mybatis分页插件应用

Global site tag (gtag.js) - Google Analytics