【2017年整理】quartz定时执行任务

上传人:爱****1 文档编号:992403 上传时间:2017-05-24 格式:DOCX 页数:7 大小:24.21KB
返回 下载 相关 举报
【2017年整理】quartz定时执行任务_第1页
第1页 / 共7页
【2017年整理】quartz定时执行任务_第2页
第2页 / 共7页
【2017年整理】quartz定时执行任务_第3页
第3页 / 共7页
【2017年整理】quartz定时执行任务_第4页
第4页 / 共7页
【2017年整理】quartz定时执行任务_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《【2017年整理】quartz定时执行任务》由会员分享,可在线阅读,更多相关《【2017年整理】quartz定时执行任务(7页珍藏版)》请在金锄头文库上搜索。

1、QuartzWeb 任务调度(转)字号 大 中 小在 web 应用中,大多数任务是以一种防止用户长时间等待的方式完成的。在 Google 搜索这样的例子中,减少等待时间对用户体验来说至关重要。异步任务的一种解决方案是在用户提交后生成一个线程(来处理异步任务),但这也不能解决那些需要以一定时间间隔重复运行任务、或在每天的指定时间运行任务的情况。让我们从一个数据库报表的例子来看看任务调度能如何帮助改善系统设计。报表可能是错综复杂的,这取决于用户所需数据的种类,以及是否需要从一个或多个数据库收集大量数据。用户可能需要很长时间来运行这样的按需 报表。因此,我们向这个报表示例中添加任务调度机制,以便用户

2、可以安排在任何他们需要的时间生成报表,并以 PDF 或其他格式在 email 中发送。用户可以让报表在每天的凌晨 2:22,系统正处于低负荷时运行;也可以选择只在特定时间运行一次。通过在报表应用中加入任务调度,我们可以为产品添加一项有用的功能,并改善用户体验。幸运的是,有一个强大的开源解决方案可以让我们以标准的方式在 web 应用(或任何Java 应用)中实施任务调度。以下示例展示了在 web 应用中,如何使用 Quartz 来创建一个任务调度框架。这个示例还使用了 Struts Action framework 插件,以便在 web 应用启动时初始化任务调度机制。Struts 是最常见的 M

3、VC 框架,为大多数开发人员所熟悉。当然除此之外还有许多框架可以协助在 web 应用中实现 MVC 模式。启动时初始化任务调度器我们首先要做的是建立一个 Struts 插件,让它在容器启动时创建我们的任务调度器。在以下例子中,我们选择 Tomcat 作为 web 应用容器,不过这些示例在其他容器中也应当可以运行。我们要创建一个 Struts 插件类,并在 struts-config.xml 中加入几行代码以使之可以工作。这个插件有两个可配置的初始化参数:startOnLoad 指定是否要在容器启动时立即启动任务调度器,而 startupDelay 指定启动任务调度器之前的等待时间。启动延时很有

4、用,因为我们可能需要首先执行一些更重要的初始化步骤。此外还可以使用 listener 机制,以更复杂的方式来通知 SchedulerPlugIn 何时启动 Quartz Scheduler。我们要创建的是一个实现 Struts 插件接口 org.apache.struts.action.PlugIn 的单子类SchedulerPlugIn。Struts 会按照配置文件中出现的顺序初始化各个插件。要特别注意的是init()方法中的代码,在此我们初始化了所需的 Quartz 对象,并得到 Scheduler。我们的任务信息就要提交到此 org.quartz.Scheduler 对象,后者将在随后讨

5、论。Scheduler 对象由Quartz servlet 根据其配置初始化,就像 Struts 初始化它的 ActionServlet 类一样。让我们来看 init()方法:public void init(ActionServlet actionServlet,ModuleConfig moduleConfig) System.out.println(Initializing Scheduler PlugIn for Jobs!);/ Retrieve the ServletContext/ 获取 ServletContextServletContext ctx = actionServl

6、et.getServletContext();/ The Quartz Scheduler/ Quartz Scheduler 对象Scheduler scheduler = null;/ Retrieve the factory from the ServletContext./ It will be put there by the Quartz Servlet/ 从 ServletContext 取得由 Quartz Servlet 放置在此的 factory 对象。StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAt

7、tribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY);try/ Retrieve the scheduler from the factory/ 从 factory 取得 schedulerscheduler = factory.getScheduler();/ Start the scheduler in case, it isnt started yet/ 如果 scheduler 尚未启动,则启动它if (m_startOnLoad != null & m_startOnLoad.equals(Boolean.TRUE.toString

8、()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 n

9、eeds a name/给任务调度器命名。好的代码总该有名字!delayedScheduler.setName(Delayed_Scheduler);/Start out scheduler/启动任务调度器delayedScheduler.start(); catch (Exception e)e.printStackTrace();sm_scheduler = scheduler;配置过程的第二步是在 web.xml 中加入用来初始化 Quartz servlet( org.quartz.ee.servlet.QuartzInitializerServlet)的内容,因为需要它将Schedu

10、lerFactory 添加到 ServletContext 中,以便在我们的 Struts 插件中可以访问。SchedulerFactory 就是我们在 Struts 插件中获得 Scheduler 对象的来源。除了 struts-config.xml 和 web.xml 之外,还要在 web 应用的 classes 目录下放置一个quartz.properties 文件。此文件的位置也可以在 web.xml 中作为 QuartzInitializerServlet 的启动参数来指定。QuartzInitializerQuartz Initializer Servletorg.quartz.e

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

12、初始化过程。此为止 web 应用已配置完毕,我们可以创建一个.war 文件并部署到服务器上,从控制台观察 SchedulerPlugIn 的输出信息。然而在此之前,让我们先看看如何向任务调度器提交一项任务。我们可以从 web 应用中的任何类访问 SchedulerPlugIn 的唯一实例,并调度一些要执行的工作。首先需要一个 Trigger(触发器)对象来告诉任务何时运行、每隔多久运行一次。Quartz 支持多种触发器,在这个例子中我们使用 CronTrigger。Trigger trigger = new CronTrigger(trigger1, group1);trigger.setCr

13、on;以上的触发器会在每周三的下午 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);实际工作在何处?至此

14、我们已决定 Trigger,可以开始调度工作了。看上去一切都已完成,但实际上我们只是调度了一项任务,还有最重要的一步有待完成。注意 HelloWorld.class 作为参数传递给了 JobDetail 的构造函数。这个类就是实际完成工作的地方。HelloWorld 继承了 Quartz的 Job 类,并覆盖了 execute()方法。当任务管理器决定运行这个任务时,execute()方法将被调用。来看代码:import org.quartz.JobDataMap;import org.quartz.JobDetail;import org.quartz.JobExecutionContext

15、;/extend the proper Quartz class/继承适当的 Quartz 类public class HelloWorld extends Job /override the execute method/覆盖 execute 方法public void execute(JobExecutionContext context) / Every job has its own job detail/每个 Job 都有独立的 JobDetailJobDetail jobDetail = context.getJobDetail();/ The name is defined in

16、 the job definition/name 在 Job 定义中指定String jobName = jobDetail.getName();/Every job has a Job Data map for storing extra information/每个 Job 都有一个 Job Data map 来存放额外的信息JobDataMap dataMap = jobDetail.getJobDataMap();System.out.println(Hello World!);出于测试的目的,你可能希望将触发器的频率调的高一点,以便观察到 HelloWorld 的动作。毕竟,你不想一直等到凌晨 2 点才能确定调度的任务确实运行了。相反,你可能需要一个每隔 10 秒运行的触发器:Trigger trigger = new SimpleTri

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号