Chinaunix首页 | 论坛 | 博客
  • 博客访问: 483495
  • 博文数量: 1496
  • 博客积分: 79800
  • 博客等级: 大将
  • 技术积分: 9940
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 13:22
文章分类

全部博文(1496)

文章存档

2011年(1)

2008年(1495)

我的朋友

分类:

2008-09-09 17:22:05

    前一段时间项目需要做一个定时发送消息的功能,该功能依附于Web应用上,即当Web应用启动时,该应用就开始作用。起先决定使用java.util.Timer和java.util.TimerTask来实现,但是研究了一下以后发现 Timer的功能比较弱,而且其线程的范围不受Web应用的约束。后来发现了Quartz这个开源的调度框架,非常有趣。

    首先我们要得到Quartz的最新发布版。目前其最新的版本是1.6。我们可以从以下地址获得它的完整包,包中可谓汤料十足,不仅有我们要的quartz.jar,更包含多个例程和详细的文档,从API到配置文件的XSD一应俱全。感兴趣的朋友也可以在src目录下找到该项目的源码一看究竟。

    废话少说,下面就来看一看这个东东是怎么在 Web Application中得以使用的。

    首先不得不提出的是Quartz的三个核心概念:调度器、触发器、作业。让我们来看看他们是如何工作的吧。
    一.作业总指挥——调度器
    1.Scheduler接口
    该接口或许是整个Quartz中最最上层的东西了,它提携了所有触发器和作业,使它们协调工作。每个Scheduler都存有JobDetail和Trigger的注册,一个Scheduler中可以注册多个JobDetail和多个Trigger,这些JobDetail和Trigger都可以通过group name和他们自身的name加以区分,以保持这些JobDetail和Trigger的实例在同一个Scheduler内不会冲突。所以,每个Scheduler中的JobDetail的组名是唯一的,本身的名字也是唯一的(就好像是一个JobDetail的ID)。Trigger也是如此。

    Scheduler实例由SchedulerFactory产生,一旦Scheduler实例生成后,我们就可以通过生成它的工厂来找到该实例,获取它相关的属性。下面的代码为我们展示了如何从一个Servlet中找到SchedulerFactory并获得相应的Scheduler实例,通过该实例,我们可以获取当前作业中的testmode属性,来判断该作业是否工作于测试模式。
    view plaincopy to clipboardprint?
    //从当前Servlet上下文中查找StdSchedulerFactory

                ServletContext ctx=request.getSession().getServletContext();

                StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute("org.quartz.impl.StdSchedulerFactory.KEY");

                Scheduler sch = null;

                try {

                    //获取调度器

                    sch = factory.getScheduler("SchedulerName");

                    //通过调度器实例获得JobDetail,注意领会JobDetailName和GroupName的用法

                    JobDetail jd=sch.getJobDetail("JobDetailName", "GroupName");

                    Map jobmap1=jd.getJobDataMap();

                    istest=jobmap1.get("testmode")+"";

                } catch (Exception se) {

                    //如果得不到当前作业,则从配置文件中读取testmode

                    ReadXML("job.xml").get(“job.testmode”);

                }

    //从当前Servlet上下文中查找StdSchedulerFactory

       ServletContext ctx=request.getSession().getServletContext();

       StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute("org.quartz.impl.StdSchedulerFactory.KEY");

       Scheduler sch = null;

                try {

                    //获取调度器

                    sch = factory.getScheduler("SchedulerName");

                    //通过调度器实例获得JobDetail,注意领会JobDetailName和GroupName的用法

                    JobDetail jd=sch.getJobDetail("JobDetailName", "GroupName");

                    Map jobmap1=jd.getJobDataMap();

                    istest=jobmap1.get("testmode")+"";

                } catch (Exception se) {

                    //如果得不到当前作业,则从配置文件中读取testmode

                    ReadXML("job.xml").get(“job.testmode”);

                }
    Scheduler实例生成后,它处于"stand-by"模式,需要调用其start方法来使之投入运作。 view plaincopy to clipboardprint?
    public class SendMailShedule{

        //设置标准SchedulerFactory

        static SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();

        static Scheduler sched;

        public static void run()throws Exception{

            //生成Scheduler实例

                 sched = schedFact.getScheduler();

            //创建一个JobDetail实例,对应的Job实现类是SendMailJob

                 JobDetail jobDetail = new JobDetail("myJob",sched.DEFAULT_GROUP,SendMailJob.class);

            //设置CronTrigger,利用Cron表达式设定触发时间

            CronTrigger trigger = new CronTrigger("myTrigger","test","0 0 8 1 * ?");

            sched.scheduleJob(jobDetail, trigger);

            sched.start();

        }

        public static void  stop()throws Exception{

            sched.shutdown();

        }

    }

    public class SendMailShedule{

        //设置标准SchedulerFactory

        static SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();

        static Scheduler sched;

        public static void run()throws Exception{

            //生成Scheduler实例

                 sched = schedFact.getScheduler();

            //创建一个JobDetail实例,对应的Job实现类是SendMailJob

                 JobDetail jobDetail = new JobDetail("myJob",sched.DEFAULT_GROUP,SendMailJob.class);

            //设置CronTrigger,利用Cron表达式设定触发时间

            CronTrigger trigger = new CronTrigger("myTrigger","test","0 0 8 1 * ?");

            sched.scheduleJob(jobDetail, trigger);

            sched.start();

        }

        public static void  stop()throws Exception{

            sched.shutdown();

        }

    }另外,我们也可以通过监听器来跟踪作业和触发器的工作状态。

 

 

[1]   

【责编:landy】

--------------------next---------------------

阅读(115) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~