Web环境下Quartz配置实例及问题总结【二】Servlet+Quartz


#B/S下的Quartz应用配置涉及到三个文件:

#1.配置启动Quartz服务的web.xml;
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!--quartz start****************************  -->  
  2.      <servlet>  
  3.          <servlet-name>  
  4.              QuartzInitializer  
  5.          </servlet-name>  
  6.          <servlet-class>  
  7.              org.quartz.ee.servlet.QuartzInitializerServlet  
  8.          </servlet-class>  
  9.          <init-param>  
  10.              <param-name>config-file</param-name>  
  11.              <param-value>/quartz.properties</param-value>  
  12.          </init-param>  
  13.          <init-param>  
  14.              <param-name>shutdown-on-unload</param-name>  
  15.              <param-value>true</param-value>  
  16.          </init-param>  
  17.          <load-on-startup>1</load-on-startup>  
  18.      </servlet>  
  19.     <!--quartz end****************************  -->  
#2.配置Quartz运行时环境的quartz.properties;
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #---------调度器属性----------------  
  2. org.quartz.scheduler.instanceName = TestScheduler  
  3. org.quartz.scheduler.instanceId = one  
  4. #---------线程配置---------------  
  5. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
  6. org.quartz.threadPool.threadCount = 2  
  7. org.quartz.threadPool.threadPriority = 4  
  8. #---------插件配置-------------  
  9. org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin  
  10. org.quartz.plugin.jobInitializer.fileName = quartz_job.xml  
  11. org.quartz.plugin.jobInitializer.overWriteExistingJobs = false  
  12. org.quartz.plugin.jobInitializer.failOnFileNotFound = true  
  13. org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin  
  14. org.quartz.plugin.shutdownhook.cleanShutdown = true  
#3.配置任务明细的任务单[ jobs.xml ] (PS:后两个配置文件的名称可变. )
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <quartz>  
  3. <job>  
  4.     <job-detail>  
  5.       <name>listener1</name>  
  6.       <group>group1</group>  
  7.       <job-class>com.bvit.sa.report.quartz.QuartzJob</job-class>  
  8.   
  9.     </job-detail>  
  10.     <trigger>  
  11.       <cron>  
  12.         <name>job1</name>  
  13.         <group>group1</group>  
  14.         <job-name>listener1</job-name>  
  15.         <job-group>group1</job-group>  
  16.         <!-- <cron-expression>0 0 0 * * ?</cron-expression>  -->  
  17.         <cron-expression>0 47 15 * * ?</cron-expression> <!-- 每天零点触发 -->  
  18.   
  19.      </cron>  
  20.     </trigger>  
  21. </job>  
  22.   
  23. </quartz>  

#Quart问题1:
应用服务器启动状态下,当对任务进行了修改时(即修改了job.xml中的任务明细),Quartz无法响应这种变化.也就是说,Quartz并没有进行"有状态"作业!
#需求: 无论是修改了任务明细中的参数列表--JobDataMap,或是CronExpression中的定时表达式,都应该立即做出响应,并按照新的配置参数去执行这个任务.
#解决: 
在quartz.properties中加入下面两行配置即可:
#自动扫描任务单并发现改动的时间间隔,单位为秒
org.quartz.plugin.jobInitializer.scanInterval = 10
#覆盖任务调度器中同名的jobDetail,避免只修改了CronExpression所造成的不能重新生效情况
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true

#Quartz问题2:
测试任务单变更自检的问题时,突然发现,当通过web页面提供的任务配置接口进行报表订阅任务的新增、修改等操作时,由于job.xml是在classes目录下,所以tomcat会进行自动的reload(hot deploy).这看起来好象没什么问题,但在实际的应用环境下却非常危险,因为web.xml中配置的随tomcat启动而启动的程序都会reload.可能这些程序很简单,并不会产生什么问题,但我们的软件则不同,随tomcat的启动,会有很多服务被启动并进行着极为复杂的操作,所以classes目录下的程序配置项都不会轻易修改.即使是修改,那也会重新启动tomcat使服务正常运转. 修改了任务单后发现某个服务出现了Illegal Access问题.
解决:
Quartz的两个主要配置文件名称可变,而且是从web.xml加载quartz.properties,又从quartz.properties找到job.xml,那么job.xml没必要放到classes目录下。拿到web目录下,就放到config/job.xml,然后修改quartz.properties文件,将文件指向修改成绝对路径:
org.quartz.plugin.jobInitializer.fileName = D:/tomcat/webapps/report/config/job.xml
job.xml无论如何变更,tomcat都不会reload,因为它已经不在classes目录下了。

#Quartz问题3:
在Debug过程中,发现Quartz的一个小问题,可能会对资源造成无谓的占用,那就是当一个任务从job.xml中被删除时,Quartz是不会响应这种减少任务的改变且此任务的进程仍然被占用,而且任务还会被执行。
解决:
可以考虑在JobDataMap中增加是否执行的配置项,即使任务会执行,但根据这种配置项,仍然可以拒绝下一步的操作.当然了,修改CronExpression使之成为一个永远不会执行到的时间也是一个办法.

#Quartz问题4:
如何使Quartz加载多个job.xml
解决:
实现SchedulerPlugin接口并提供多任务文件加载功能,将会是解决这个事情的好方法.


B/S下的Quartz应用配置涉及到三个文件:
1.配置启动Quartz服务的web.xml;
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!--quartz start****************************  -->  
  2.      <servlet>  
  3.          <servlet-name>  
  4.              QuartzInitializer  
  5.          </servlet-name>  
  6.          <servlet-class>  
  7.              org.quartz.ee.servlet.QuartzInitializerServlet  
  8.          </servlet-class>  
  9.          <init-param>  
  10.              <param-name>config-file</param-name>  
  11.              <param-value>/quartz.properties</param-value>  
  12.          </init-param>  
  13.          <init-param>  
  14.              <param-name>shutdown-on-unload</param-name>  
  15.              <param-value>true</param-value>  
  16.          </init-param>  
  17.          <load-on-startup>1</load-on-startup>  
  18.      </servlet>  
  19.     <!--quartz end****************************  -->  


2.配置Quartz运行时环境的quartz.properties;
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #---------调度器属性----------------  
  2. org.quartz.scheduler.instanceName = TestScheduler  
  3. org.quartz.scheduler.instanceId = one  
  4. #---------线程配置---------------  
  5. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
  6. org.quartz.threadPool.threadCount = 2  
  7. org.quartz.threadPool.threadPriority = 4  
  8. #---------插件配置-------------  
  9. org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin  
  10. org.quartz.plugin.jobInitializer.fileName = quartz_job.xml  
  11. org.quartz.plugin.jobInitializer.overWriteExistingJobs = false  
  12. org.quartz.plugin.jobInitializer.failOnFileNotFound = true  
  13. org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin  
  14. org.quartz.plugin.shutdownhook.cleanShutdown = true  


3.配置任务明细的任务单--job.xml.
(PS:后两个配置文件的名称可变. )
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <quartz>  
  3. <job>  
  4.     <job-detail>  
  5.       <name>listener1</name>  
  6.       <group>group1</group>  
  7.       <job-class>com.bvit.sa.report.quartz.QuartzJob</job-class>  
  8.   
  9.     </job-detail>  
  10.     <trigger>  
  11.       <cron>  
  12.         <name>job1</name>  
  13.         <group>group1</group>  
  14.         <job-name>listener1</job-name>  
  15.         <job-group>group1</job-group>  
  16.         <!-- <cron-expression>0 0 0 * * ?</cron-expression>  -->  
  17.         <cron-expression>0 47 15 * * ?</cron-expression> <!-- 每天零点触发 -->  
  18.   
  19.      </cron>  
  20.     </trigger>  
  21. </job>  
  22.   
  23. </quartz>  


问题1.
应用服务器启动状态下,当对任务进行了修改时(即修改了job.xml中的任务明细),Quartz无法响应这种变化.也就是说,Quartz并没有进行"有状态"作业!
需求:
无论是修改了任务明细中的参数列表--JobDataMap,或是CronExpression中的定时表达式,都应该立即做出响应,并按照新的配置参数去执行这个任务.
解决: 
在quartz.properties中加入下面两行配置即可:
#自动扫描任务单并发现改动的时间间隔,单位为秒
org.quartz.plugin.jobInitializer.scanInterval = 10
#覆盖任务调度器中同名的jobDetail,避免只修改了CronExpression所造成的不能重新生效情况
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true

 
问题2:
测试任务单变更自检的问题时,突然发现,当通过web页面提供的任务配置接口进行报表订阅任务的新增、修改等操作时,由于job.xml是在classes目录下,所以tomcat会进行自动的reload(hot deploy).这看起来好象没什么问题,但在实际的应用环境下却非常危险,因为web.xml中配置的随tomcat启动而启动的程序都会reload.可能这些程序很简单,并不会产生什么问题,但我们的软件则不同,随tomcat的启动,会有很多服务被启动并进行着极为复杂的操作,所以classes目录下的程序配置项都不会轻易修改.即使是修改,那也会重新启动tomcat使服务正常运转. 修改了任务单后发现某个服务出现了Illegal Access问题.
解决:
Quartz的两个主要配置文件名称可变,而且是从web.xml加载quartz.properties,又从quartz.properties找到job.xml,那么job.xml没必要放到classes目录下。拿到web目录下,就放到config/job.xml,然后修改quartz.properties文件,将文件指向修改成绝对路径:
org.quartz.plugin.jobInitializer.fileName = D:/tomcat/webapps/report/config/job.xml
job.xml无论如何变更,tomcat都不会reload,因为它已经不在classes目录下了。
 
问题3:
在Debug过程中,发现Quartz的一个小问题,可能会对资源造成无谓的占用,那就是当一个任务从job.xml中被删除时,Quartz是不会响应这种减少任务的改变且此任务的进程仍然被占用,而且任务还会被执行。
解决:
可以考虑在JobDataMap中增加是否执行的配置项,即使任务会执行,但根据这种配置项,仍然可以拒绝下一步的操作.当然了,修改CronExpression使之成为一个永远不会执行到的时间也是一个办法.
 
问题4:
如何使Quartz加载多个job.xml
解决:
实现SchedulerPlugin接口并提供多任务文件加载功能,将会是解决这个事情的好方法.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值