快速业务通道

在Java Web应用中如何实现任务有效调度 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
Servlet.QUARTZ_FACTORY_KEY); try{ // Retrieve the scheduler from the factory // 从factory取得scheduler scheduler = factory.getScheduler(); // Start the scheduler in case, it isn''t started yet // 如果scheduler尚未启动,则启动它 if (m_startOnLoad != null && m_startOnLoad.equals(Boolean.TRUE.toString())){ System.out.println("Scheduler Will start in " + m_startupDelayString + " milliseconds!"); //wait the specified amount of time before // starting the process. // 在启动之前等待指定长度的时间 Thread delayedScheduler = new Thread(new DelayedSchedulerStarted ( scheduler, m_startupDelay)); //give the scheduler a name. All good code needs a name //给任务调度器命名。好的代码总该有名字! delayedScheduler.setName("Delayed_Scheduler"); //Start out scheduler //启动任务调度器 delayedScheduler.start(); } } catch (Exception e){ e.printStackTrace(); } sm_scheduler = scheduler; }

在Java Web应用中如何实现任务有效调度(2)

时间:2011-02-28

配置过程的第二步是在web.xml中加入用来初始化Quartz servlet(org.quartz.ee.servlet.QuartzInitializerServlet)的内容,因为需要它将SchedulerFactory添加到ServletContext中,以便在我们的Struts插件中可以访问。SchedulerFactory就是我们在Struts插件中获得Scheduler对象的来源。除了struts-config.xml 和web.xml之外,还要在web应用的classes目录下放置一个quartz.properties文件。此文件的位置也可以在web.xml中作为QuartzInitializerServlet的启动参数来指定。

QuartzInitializer

Quartz Initializer Servlet

org.quartz.ee.servlet.QuartzInitializerServlet

1

shutdown-on-unload

true

start-scheduler-on-load

false

这里其实完全可以不使用Struts和SchedulerPlugIn,但如果将来决定要以其它的任务调度框架替换Quartz的话,额外的抽象层就很有用了。长远看来,让一切保持松散耦合总会使工作变得容易些。如果你使用其它MVC框架,也可以用SchedulerPlugIn.init()方法中的代码达到同样的效果。此外,还可以用Servlet 2.3规范中的ServletContextListener来实现同样的初始化过程。

到此为止web应用已配置完毕,我们可以创建一个.war文件并部署到服务器上,从控制台观察SchedulerPlugIn的输出信息。然而在此之前,让我们先看看如何向任务调度器提交一项任务。

我们可以从web应用中的任何类访问SchedulerPlugIn的唯一实例,并调度一些要执行的工作。首先需要一个Trigger(触发器)对象来告诉任务何时运行、每隔多久运行一次。Quartz支持多种触发器,在这个例子中我们使用CronTrigger。

Trigger trigger = new CronTrigger("trigger1", "group1");

trigger.setCronExpression("0 0 15 ? * WED");

以上的触发器会在每周三的下午3点执行指定任务。现在我们只要创建一个JobDetail对象,并把它和上面的触发器一起传递给SchedulerPlugIn的scheduleWork()方法。

JobDetail jobDetail =new JobDetail("Hello World Job", "Hello World Group",HelloWorld.class,true, true, true); //Schedule The work //调度这项任务 SchedulerPlugIn.scheduleWork(scheduledJobDetail, trigger);

实际工作在何处?

至此我们已决定Trigger,可以开始调度工作了。看上去一切都已完成,但实际上我们只是调度了一项任务,还有最重要的一步有待完成。注意HelloWorld.class作为参数传递给了JobDetail的构造函数。这个类就是实际完成工作的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号