- 浏览: 531555 次
- 性别:
- 来自: 山东济南
文章分类
最新评论
-
dragon_8844:
非常不错,nice
java.util.concurrent 多线程框架 -
wusendong:
很好的文章!受益匪浅,谢谢!
java.util.concurrent 多线程框架 -
SINCE1978:
你也关注并发啊
java.util.concurrent 多线程框架 -
lku1314:
这个不错 刚刚找到这个组建 以前孤陋寡闻了 像lz学习!标 ...
quartz 在WEB中应用小结 -
lliiqiang:
人们对于目标需要的需求明确的去做,对于目标以外的因素是随机的执 ...
flex和后端的数据交互(一)--XML和HTTPService
前一个项目曾经用到过quartz,没好好总结一下,现在的项目中又用到了,害得我又花了查了两天查资料、做测试!现在OK了,系统目前运行正常,做个小结。
1. 基本配置
官网上有quartz的所有版本,下一个,把quartz-all-*.jar(根据需要)添加到lib目录中,在classpath目录添加quartz.properties属性文件,接下来你就可以进行开发了。
这是quartz.properties的基本配置。
2. web基本应用
quartz在web项目中有多种应用方式,和项目使用的其他技术也有关系。
添加一个servlet,将它配置到web.xml中:
这样你就可以在这个servlet中,在服务器加载的时候同时加载定时任务:
任务定义和加载在quartz的示例中有,这里不多费口舌了。
3. xml形式的任务配置
xml形式的应用,需要使用quartz的xml支持插件,只需有实现Job接口的任务就可以;这时需要在web.xml中添加默认的servlet配置:
在quartz.properties中添加xml配置需要的参数:
上面配置中的fileNames是指向的classpath根目录。
在xml文件中定义任务名称和触发器,例如:
这样就OK了!几种配置可以同时应用,不会冲突!
4. quartz的动态时间管理
有时需要在不停止web服务的情况下修改任务的执行时间格式,网上的资料大多是在使用spring框架支持时如何动态管理时间格式的介绍。在使用spring支持时可以,不使用spring时更加简单。
动态时间管理的关键是要共享调度管理器对象Scheduler,我们可以在最初加载任务调度的时候将它添加到servlet上下文中。
这样,我们就可以在需要修改时间格式的地方使用了!下面的ctt变量就是一个ServletContext对象。通过Scheduler 的getTrigger方法取到触发器,用触发器对象的getCronExpression方法可以获得时间格式。之后你可以另外创建一个同名的触发器,也可以修改现有触发器,再让调度管理器重新加载到内存就可以了!
5.相关问题
配置完成后,定时任务不加载执行,在日志中报错:
java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set;
这个是commons-collections.jar版本过低的原因,更换个新版本的就可以了!
还有,为了防止开发人员在本地测试时,执行定时任务造成数据冲突,需要对主机服务器Ip进行判断,只有指定的服务器上才可以执行定时任务!
quartz还可以对数据库操作,还有JobStore等等,以后应用到再说!哈!附带一份《quartz开发指南》!
顶一个
前段时间刚把quartz用到项目中去
不过和LZ手段不太相同
1. 基本配置
官网上有quartz的所有版本,下一个,把quartz-all-*.jar(根据需要)添加到lib目录中,在classpath目录添加quartz.properties属性文件,接下来你就可以进行开发了。
这是quartz.properties的基本配置。
#============================================================================ # Configure Main Scheduler Properties #============================================================================ org.quartz.scheduler.instanceName = TestScheduler org.quartz.scheduler.instanceId = AUTO #============================================================================ # Configure ThreadPool #============================================================================ org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 3 org.quartz.threadPool.threadPriority = 5 #============================================================================ # Configure JobStore #============================================================================ org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
2. web基本应用
quartz在web项目中有多种应用方式,和项目使用的其他技术也有关系。
添加一个servlet,将它配置到web.xml中:
<servlet> <servlet-name>QuartzStartupServlet</servlet-name> <servlet-class>com.StartupServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
这样你就可以在这个servlet中,在服务器加载的时候同时加载定时任务:
public void init(ServletConfig cfg) throws javax.servlet.ServletException { log.info("server start!"); initScheduler(cfg); } protected void initScheduler(ServletConfig cfg) { try { SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = sf.getScheduler(); SimpleExample simpleExample = new SimpleExample(scheduler); simpleExample.run(); } catch (Exception e) { log.error(e); } }
任务定义和加载在quartz的示例中有,这里不多费口舌了。
3. xml形式的任务配置
xml形式的应用,需要使用quartz的xml支持插件,只需有实现Job接口的任务就可以;这时需要在web.xml中添加默认的servlet配置:
<servlet> <display-name>Quartz Initializer Servlet</display-name> <servlet-name>QuartzInitializer</servlet-name> <servlet-class> org.quartz.ee.servlet.QuartzInitializerServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
在quartz.properties中添加xml配置需要的参数:
#============================================================================ # Configure Plugins #============================================================================ org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin org.quartz.plugin.jobInitializer.fileNames = jobs.xml org.quartz.plugin.jobInitializer.overWriteExistingJobs = true org.quartz.plugin.jobInitializer.failOnFileNotFound = true org.quartz.plugin.jobInitializer.scanInterval = 10 org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
上面配置中的fileNames是指向的classpath根目录。
在xml文件中定义任务名称和触发器,例如:
<?xml version="1.0" encoding="UTF-8"?> <quartz> <job> <job-detail> <name>dailybalance</name> <group>balance</group> <job-class>com.SimpleJob</job-class> </job-detail> <trigger> <cron> <name>dailybalancetrigger</name> <group>balance</group> <job-name>dailybalance</job-name> <job-group>balance</job-group> <cron-expression>0/50 * * * * ?</cron-expression> </cron> </trigger> </job> </quartz>
这样就OK了!几种配置可以同时应用,不会冲突!
4. quartz的动态时间管理
有时需要在不停止web服务的情况下修改任务的执行时间格式,网上的资料大多是在使用spring框架支持时如何动态管理时间格式的介绍。在使用spring支持时可以,不使用spring时更加简单。
动态时间管理的关键是要共享调度管理器对象Scheduler,我们可以在最初加载任务调度的时候将它添加到servlet上下文中。
SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = sf.getScheduler(); ...... ...... cfg.getServletContext().setAttribute(SCHEDULER_KEY, scheduler); scheduler.start();
这样,我们就可以在需要修改时间格式的地方使用了!下面的ctt变量就是一个ServletContext对象。通过Scheduler 的getTrigger方法取到触发器,用触发器对象的getCronExpression方法可以获得时间格式。之后你可以另外创建一个同名的触发器,也可以修改现有触发器,再让调度管理器重新加载到内存就可以了!
/** * reset quartz job time */ public void reSetLotteryLoseBiddingTime(int lotteryType, Date date) { scheduler = (Scheduler) this.ctt.getAttribute(TIMING_WORK_SCHEDULER); try { String lotteryName = ""; switch (lotteryType) { case 1:// lotteryName = "ssq"; break; case 2:// { lotteryName = "3D"; } break; case 3:// { lotteryName = "qlc"; } break; case 4:// { lotteryName = "23x5"; } break; default: break; } loseBiddingJob = scheduler.getJobDetail("loseBiddingJob_" + lotteryName, "loseBiddingGroup"); loseBiddingTrigger = (CronTrigger) scheduler.getTrigger("loseBiddingTrigger_" + lotteryName, "loseBiddingGroup"); String time = loseBiddingTrigger.getCronExpression(); if (!time.equals(this.timeFormat(date))) { loseBiddingTrigger = new CronTrigger("loseBiddingTrigger_" + lotteryName, "loseBiddingGroup", "loseBiddingJob_" + lotteryName, "loseBiddingGroup", this.timeFormat(date)); Date ft = scheduler.rescheduleJob("loseBiddingTrigger_" + lotteryName, "loseBiddingGroup", loseBiddingTrigger); log.info(loseBiddingJob.getFullName() + " has been scheduled to run at: " + ft + " and excute based on expression: " + loseBiddingTrigger.getCronExpression()); } } catch (Exception e) { log.error(e); } }
5.相关问题
配置完成后,定时任务不加载执行,在日志中报错:
java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set;
这个是commons-collections.jar版本过低的原因,更换个新版本的就可以了!
还有,为了防止开发人员在本地测试时,执行定时任务造成数据冲突,需要对主机服务器Ip进行判断,只有指定的服务器上才可以执行定时任务!
public boolean compareService(String thisIp) { Properties properties = this.getProperties(); String serviceIp = ""; try { if (properties != null) { serviceIp = properties.getProperty("timing.work.serviceIp"); if (serviceIp != null && serviceIp.equals(thisIp)) return true; } } catch (Exception e) { log.error(e); } return false; }
quartz还可以对数据库操作,还有JobStore等等,以后应用到再说!哈!附带一份《quartz开发指南》!
- Quartz开发指南.rar (280.7 KB)
- 下载次数: 1640
评论
10 楼
lku1314
2013-07-12
这个不错 刚刚找到这个组建 以前孤陋寡闻了 像lz学习!标记一下
8 楼
chc123456
2008-05-23
我倒是不喜欢吧quartz直接放到Web容器里头 都是单独启动 当然也可以单独启动个tomcat来干调度的事情~
7 楼
lsk
2008-05-23
我用的没有这么复杂.只需要在spring当中注册一下就可以了.
具体可以看看
http://lsk.iteye.com/admin/blogs/173924
具体可以看看
http://lsk.iteye.com/admin/blogs/173924
6 楼
daoger
2008-05-23
笔误!已改正!
5 楼
fight_bird
2008-05-23
基于jdk6的应用基本可以抛开quartz,楼主的标题是不是笔误?还是新名词?
4 楼
王者之剑
2008-05-23
写得不错,不过我认为不应该把定时的程序和Web程序绑在一起。
做成一个单独的程序要好一些。
做成一个单独的程序要好一些。
3 楼
miracle9i
2008-05-23
牛人 支持一下~
2 楼
daoger
2008-05-22
LS这位老兄也说一下你们的用法吧!让俺学习一下,哈!
1 楼
imKenny
2008-05-22
顶一个
前段时间刚把quartz用到项目中去
不过和LZ手段不太相同
发表评论
-
ubuntu14.04下编译安装Tora
2015-08-11 16:19 1210需预先安装oracle客户端;以下类库,有的可能需要提前安 ... -
ubuntu14.04下oracle客户端最小化安装
2015-08-11 16:04 1056在Oracle官网下载Oracle Instant Clien ... -
ubuntu14.04下编译安装QT
2015-08-11 16:03 15051. 首先配置一些编译Qt ... -
55种开源可视化数据分析工具
2015-07-22 14:50 0http://mp.weixin.qq.com/s?__bi ... -
响应式设计理念
2013-09-29 10:00 0概念 响应式Web设计(Responsive Web desi ... -
Liferay 使用随笔
2010-04-19 14:18 01.如何根据权限去除每一个portlet中右上角的选项。 关于 ... -
Liferay中ajax应用用户session超时
2010-03-26 09:31 3918基于Liferay Portal开发ajax应用时,如果长时间 ... -
Liferay portlet实例化配置
2009-11-10 09:06 4375在默认的情况下,一个p ... -
带checkbox的dhtmlxtree菜单树异步加载时的问题解决
2009-10-24 11:27 5970最近一直很忙,自己负责几个模块的设计开发,还有和其他服务接口的 ... -
JS代码示例
2009-10-21 14:23 22811.数组操作时的push var a = [],b = [ ... -
dhtmlxtree异步加载时的一个bug修正
2009-09-15 10:00 3807前面已经对dhtmlx的东西有所介绍,使用中也发现了不少bug ... -
WEB Page to PDF
2009-06-17 11:10 2546现在有很多网页页面转换成PDF文档的支持项目,我使用的是pd4 ... -
Liferay中使用dhtmlxlayout在IE下的问题
2009-06-12 13:43 2096Liferay 中使用dhemtlx系列UI的时候,dhtml ... -
Liferay相关配置
2009-06-10 13:35 1257修改liferay中portlet的加载目录 前面 ... -
Spring JDBC对Oracle10g数据库操作时RowSet的问题
2009-05-19 08:56 3466使用Spring JDBC对Oracle10g进行数据库分页的 ... -
Dynamic Tables In JavaScript for IE and Firefox
2009-05-06 14:03 1710http://www.sweetvision.com/2007 ... -
liferay中对struts桥接处理后的response
2009-04-18 14:29 1835对于在liferay开发平台中 ... -
liferay开发小记---Struts,Spring,Hibernate架构
2009-04-07 11:11 6261liferay有自己的struts和spring扩展,有兴趣的 ... -
liferay开发小记---portlet文件构造
2009-04-03 17:09 3280书接上回,说说portlet的开发,每一个portlet就是对 ... -
liferay开发小记---开发环境的搭建
2009-04-02 13:42 3805用惯了MyEclipse,我的环境也是在它上面搭建的,试用过M ...
相关推荐
13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速...
13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速...
7.4 保护Web应用程序 7.4.1 代理Spring Security的过滤器 7.4.2 处理安全上下文 7.4.3 提示用户登录 7.4.4 处理安全例外 7.4.5 强制Web安全性 7.4.6 确保一个安全的通道 7.5 视图层安全 7.5.1 有条件地渲染...
7.4 保护Web应用程序 7.4.1 代理Spring Security的过滤器 7.4.2 处理安全上下文 7.4.3 提示用户登录 7.4.4 处理安全例外 7.4.5 强制Web安全性 7.4.6 确保一个安全的通道 7.5 视图层安全 7.5.1 有条件地渲染...
7.4保护web应用程序 7.4.1代理springsecurity的过滤器 7.4.2处理安全上下文 7.4.3提示用户登录 7.4.4处理安全例外 7.4.5强制web安全性 7.4.6确保一个安全的通道 7.5视图层安全 7.5.1有条件地渲染内容 7.5.2...
3.9.3 在eclipse中运行grails应用程序 3.10 本章小结 第4章 grails中的域(domain) 4.1 简化的orm和grails对象关系映射(gorm) 4.2 gorm基础 4.3 设置属性可选 4.4 gorm中的关系 ...
6.1 在一般Web应用中访问Spring 209 6.1.1 问题 209 6.1.2 解决方案 210 6.1.3 工作原理 210 6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 ...
6.1 在一般Web应用中访问Spring 209 6.1.1 问题 209 6.1.2 解决方案 210 6.1.3 工作原理 210 6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 ...
3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. Class...
3.8.5. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署Spring ApplicationContext 3.11. 基于注解(Annotation-based)的配置 3.11.1. @Autowired ...
3.8.5. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署Spring ApplicationContext 3.11. 基于注解(Annotation-based)的配置 3.11.1. @Autowired ...
3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. ...
3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. ...