Quartz之QuartzInitializerServlet

12 篇文章 0 订阅
[color=red]问题:我想在应用程序启动之后去执行任务怎么办呢!
Quartz:使用QuartzInitializerServlet可满足需要 :lol: [/color]
参考资料
1 Quartz调度框架应用总结
[url]http://java.chinaitlab.com/advance/752064_3.html[/url]
2 Integrating quartz in a web application
[url]http://www.oreillynet.com/cs/user/view/cs_msg/52725[/url]
3 基于Quartz的开源项目
[url]myschedule[/url]
4 Adding multiple jobs via the quartz_jobs.xml skips jobs
[url]http://jira.opensymphony.com/browse/QRTZNET-250[/url]
5 Quartz with Apache ServiceMix
[url]http://forums.terracotta.org/forums/posts/list/5427.page[/url]
6 Web应用中使用Quartz进行任务调度
[url]http://www.hujun.me/post?id=12001[/url]
7 Quartz的XML定义说明:New in Quartz.Net 2.0–New Job File Format
[url]http://jvilalta.blogspot.com/2011/03/new-in-quartznet-20new-job-file-format.html[/url]
来自于Quartz的文档说明:
[i]A Servlet that can be used to initialize Quartz, if configured as a load-on-startup servlet in a web application.Using this start-up servlet may be preferred to using the QuartzInitializerListener in some situations - namely when you want to initialize more than one scheduler in the same application.You'll want to add something like this to your WEB-INF/web.xml file: [/i]

<servlet>
<servlet-name>
QuartzInitializer
</servlet-name>
<display-name>
Quartz Initializer Servlet
</display-name>
<servlet-class>
org.quartz.ee.servlet.QuartzInitializerServlet
</servlet-class>
<load-on-startup>
1
</load-on-startup>
<init-param>
<param-name>config-file</param-name>
<param-value>/some/path/my_quartz.properties</param-value>
</init-param>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>wait-on-shutdown</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>start-scheduler-on-load</param-name>
<param-value>true</param-value>
</init-param>
</servlet>

相应参数说明:
[color=green]
The init parameter 'config-file' can be used to specify the path (and filename) of your Quartz properties file. If you leave out this parameter, the default ("quartz.properties") will be used.
The init parameter 'shutdown-on-unload' can be used to specify whether you want scheduler.shutdown() called when the servlet is unloaded (usually when the application server is being shutdown). Possible values are "true" or "false". The default is "true".
The init parameter 'wait-on-shutdown' has effect when 'shutdown-on-unload' is specified "true", and indicates whether you want scheduler.shutdown(true) called when the listener is unloaded (usually when the application server is being shutdown). Passing "true" to the shutdown() call causes the scheduler to wait for existing jobs to complete. Possible values are "true" or "false". The default is "false".

The init parameter 'start-scheduler-on-load' can be used to specify whether you want the scheduler.start() method called when the servlet is first loaded. If set to false, your application will need to call the start() method before the scheduler begins to run and process jobs. Possible values are "true" or "false". The default is "true", which means the scheduler is started.
A StdSchedulerFactory instance is stored into the ServletContext. You can gain access to the factory from a ServletContext instance like this:
StdSchedulerFactory factory = (StdSchedulerFactory) ctx
.getAttribute(QuartzFactoryServlet.QUARTZ_FACTORY_KEY);
The init parameter 'servlet-context-factory-key' can be used to override the name under which the StdSchedulerFactory is stored into the ServletContext, in which case you will want to use this name rather than QuartzFactoryServlet.QUARTZ_FACTORY_KEY in the above example.
The init parameter 'scheduler-context-servlet-context-key' if set, the ServletContext will be stored in the SchedulerContext under the given key name (and will therefore be available to jobs during execution).
The init parameter 'start-delay-seconds' can be used to specify the amount of time to wait after initializing the scheduler before scheduler.start() is called.
Once you have the factory instance, you can retrieve the Scheduler instance by calling getScheduler() on the factory.
[/color]
所要的jar文件包含:
[b]quartz-all-2.0.1.jar, jta-1.1.jar,log4j-1.2.14.jar,slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar[/b]
具体代码如下:
web.xml

<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<display-name>Quartz Initializer Servlet</display-name>
<servlet-class>
org.quartz.ee.servlet.QuartzInitializerServlet
</servlet-class>
<load-on-startup>1</load-on-startup>

<init-param>
<param-name>config-file</param-name>
<param-value>/quartz.properties</param-value>
</init-param>

<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<!--
<init-param>
<param-name>start-scheduler-on-load</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>wait-on-shutdown</param-name>
<param-value>true</param-value>
</init-param>
-->
</servlet>

位于src下:quartz.properties

org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer=true
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
# Configure Main Scheduler Properties
org.quartz.scheduler.instanceName=QuartzScheduler
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.skipUpdateCheck=true
org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer=true
# Configure ThreadPool
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=3
org.quartz.threadPool.threadPriority=5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
# Configure JobStore
org.quartz.jobStore.misfireThreshold=60000
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
#org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.useProperties=false
#org.quartz.jobStore.dataSource=myDS
#org.quartz.jobStore.tablePrefix=QRTZ_
#org.quartz.jobStore.isClustered=false
# Configure Datasources
#org.quartz.dataSource.myDS.driver=org.postgresql.Driver
#org.quartz.dataSource.myDS.URL=jdbc:postgresql://localhost/dev
#org.quartz.dataSource.myDS.user=jhouse
#org.quartz.dataSource.myDS.password=
#org.quartz.dataSource.myDS.maxConnections=5
# Configure Plugins
org.quartz.plugin.triggHistory.class=org.quartz.plugins.history.LoggingJobHistoryPlugin org.quartz.plugin.jobInitializer.class=org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames=quartz_job.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound=true
org.quartz.plugin.jobInitializer.scanInterval=120
org.quartz.plugin.jobInitializer.wrapInUserTransaction=false

有些时候其实可按需配置,如下:

org.quartz.scheduler.instanceName= MyQuartzScheduler
org.quartz.scheduler.rmi.export= false
org.quartz.scheduler.rmi.proxy= false
org.quartz.scheduler.wrapJobExecutionInUserTransaction= false
org.quartz.threadPool.class= org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount= 10
org.quartz.threadPool.threadPriority= 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread= true
org.quartz.jobStore.misfireThreshold= 60000
org.quartz.jobStore.class= org.quartz.simpl.RAMJobStore
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
#job and trigger configuration file
org.quartz.plugin.jobInitializer.fileNames =quartz_job.xml

位于src下的:quartz_job.xml

<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data
xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData
http://www.quartz-scheduler.org/xml/job_scheduling_data_2_0.xsd"
version="2.0">

<pre-processing-commands>
<delete-jobs-in-group>*</delete-jobs-in-group> <!-- clear all jobs in scheduler -->
<delete-triggers-in-group>*</delete-triggers-in-group> <!-- clear all triggers in scheduler -->
</pre-processing-commands>

<processing-directives>
<!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them -->
<overwrite-existing-data>true</overwrite-existing-data>
<!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error -->
<ignore-duplicates>false</ignore-duplicates>
</processing-directives>

<schedule>
<job>
<name>job1</name>
<job-class>net.liuzd.tools.quartz.servlet.Job1</job-class>
</job>
<trigger>
<cron>
<name>t1</name>
<job-name>job1</job-name>
<cron-expression>0/10 * * * * ?</cron-expression>
</cron>
</trigger>

<job>
<name>job2</name>
<job-class>net.liuzd.tools.quartz.servlet.Job2</job-class>
</job>

<trigger>
<cron>
<name>t2</name>
<job-name>job2</job-name>
<cron-expression>0/20 * * * * ?</cron-expression>
</cron>
</trigger>

</schedule>
</job-scheduling-data>

src下的log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="default" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d{yyyy-MM-dd hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>
</layout>
</appender>
<logger name="org.quartz">
<level value="info" />
</logger>
<root>
<level value="info" />
<appender-ref ref="default" />
</root>
</log4j:configuration>

二个任务类:

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Job1 implements Job {

private static Logger _log = LoggerFactory.getLogger(Job1.class);

public Job1() {

}

public void execute(JobExecutionContext context)
throws JobExecutionException {
_log.info("执行天涯的第一个任务: " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
}
}

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Job2 implements Job {

private static Logger _log = LoggerFactory.getLogger(Job2.class);

public Job2() {
}


public void execute(JobExecutionContext context)
throws JobExecutionException {
_log.info("执行天涯的第二个任务: " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
}
}

在WEB应用启动时控制台输出结果如下:

[INFO] 2011-08-15 02:18:50.015 下午 QuartzScheduler_Worker-2 [org.quartz.plugins.history.LoggingJobHistoryPlugin]
Job DEFAULT.job1 fired (by trigger DEFAULT.t1) at: 14:18:50 08/15/2011

[INFO] 2011-08-15 02:18:50.015 下午 QuartzScheduler_Worker-2 [net.liuzd.tools.quartz.servlet.Job1]
执行天涯的第一个任务: 2011-08-15 02:18:50

[INFO] 2011-08-15 02:18:50.015 下午 QuartzScheduler_Worker-2 [org.quartz.plugins.history.LoggingJobHistoryPlugin]
Job DEFAULT.job1 execution complete at 14:18:50 08/15/2011 and reports: null

[INFO] 2011-08-15 02:19:00.000 下午 QuartzScheduler_Worker-3 [org.quartz.plugins.history.LoggingJobHistoryPlugin]
Job DEFAULT.job1 fired (by trigger DEFAULT.t1) at: 14:19:00 08/15/2011

[INFO] 2011-08-15 02:19:00.000 下午 QuartzScheduler_Worker-3 [net.liuzd.tools.quartz.servlet.Job1]
执行天涯的第一个任务: 2011-08-15 02:19:00

[INFO] 2011-08-15 02:19:00.000 下午 QuartzScheduler_Worker-3 [org.quartz.plugins.history.LoggingJobHistoryPlugin]
Job DEFAULT.job1 execution complete at 14:19:00 08/15/2011 and reports: null

[INFO] 2011-08-15 02:19:00.000 下午 QuartzScheduler_Worker-1 [org.quartz.plugins.history.LoggingJobHistoryPlugin]
Job DEFAULT.job2 fired (by trigger DEFAULT.t2) at: 14:19:00 08/15/2011

[INFO] 2011-08-15 02:19:00.000 下午 QuartzScheduler_Worker-1 [net.liuzd.tools.quartz.servlet.Job2]
执行天涯的第二个任务: 2011-08-15 02:19:00
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值