`
robbin
  • 浏览: 4795367 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:135471
社区版块
存档分类
最新评论

应该如何正确使用Quartz

    博客分类:
  • Java
阅读更多
对于Web容器来说,最忌讳应用程序私自启动线程,自行进行线程调度,像Quartz这种在web容器内部默认就自己启动了10个线程进行异步job调度的框架本身就是很危险的事情,很容易造成servlet线程资源回收不掉,所以我一向排斥使用quartz。

quartz还有一个问题就是不支持cluster。导致使用quartz的应用都没有办法做群集。

那么应该如何正确的使用quartz的同时,又不影响web容器自身的线程调度呢?

办法就是自己单独启动一个Job Server,来quartz跑job,不要部署在web容器中。

其他web节点当需要启动异步任务的时候,可以通过种种方式(DB, JMS, Web Service, etc)通知Job Server,而Job Server收到这个通知之后,把异步任务加载到自己的任务队列中去。

其实想改造当前已经集成quartz的web应用也不算困难:

例如可以使用数据库的表来记录和维护任务队列和状态,把quartz部分完全从web应用中剥离出去,自己写一个Java Main程序把配置quartz的spring容器跑起来,这样Job Server就启动了(注意这个Job Server完全脱离tomcat)。此外这个Main程序应该再启动一个子线程,定期扫描数据库的任务队列表:
有新的任务就加入quartz的任务调度;
把当前任务的执行状态写入任务表;
看到删除任务的表字段状态以后,删除相应的任务。

然后web应用去掉quartz部分配置,把原来的调用quartz任务的代码改写为读写数据库的任务表,这样就把job部分完全从web容器剥离掉了,甚至web容器做cluster也没有问题了,并且多个web节点在同时读写任务表的时候,还有数据库的事务来确保操作的一致性,实在是很棒。

另外还可以单独做一个job管理界面,可以通过web界面手工添加任务,查看任务状态,删除任务等等。

分享到:
评论
28 楼 kevin-whui-liu 2012-12-01  
robbin 写道
引用
最好搞明白了再发表高论,呵

1、Quartz的线程是另外起的,有专门的线程池来管理(Quartz自己实现的),根本就不会使用容器的线程

2、Quartz是支持集群的,通过将任务持久化到数据库,利用行锁功能来实现集群

3、Quartz也支持非容器方式独立运行


你也最好看明白了再发表你的高论

1、我说Quartz使用web容器的线程了吗?拜托你自己看看清楚我的原话是“Quartz自己启动了10个线程”!

2、在我写这篇文章的时候,Quartz尚未添加cluster功能,拜托你看看清楚这是哪年的文章。

3、我说过Quartz不能独立运行吗? 拜托你看看清楚我给出的方案就是让Quartz以非容器的方式独立运行的。


支持法还是比crontab+batch复杂的,但如果是异步执行任务,又没有JMS支持,例如系统只有tomcat,则这样的做法没有JMS可靠又比message driven bean复杂,而且cluster的话,总是有问题的。有时候,有一些看似基本的功能,在web这样的环境中执行起来,异步执行后台操作的用户体验会比较好一些,例如,在接受用户postback数据后,处理数据库操作,又发出邮件这样的行为,往往是把发邮件这样的动作配置为异步执行会使用户页面的响应变快。
所以,我设计比较大容量的系统时,一般不考虑仅使
robbin 写道
引用
最好搞明白了再发表高论,呵

1、Quartz的线程是另外起的,有专门的线程池来管理(Quartz自己实现的),根本就不会使用容器的线程

2、Quartz是支持集群的,通过将任务持久化到数据库,利用行锁功能来实现集群

3、Quartz也支持非容器方式独立运行


你也最好看明白了再发表你的高论

1、我说Quartz使用web容器的线程了吗?拜托你自己看看清楚我的原话是“Quartz自己启动了10个线程”!

2、在我写这篇文章的时候,Quartz尚未添加cluster功能,拜托你看看清楚这是哪年的文章。

3、我说过Quartz不能独立运行吗? 拜托你看看清楚我给出的方案就是让Quartz以非容器的方式独立运行的。



我今天遇到同样的问题,用jvisualVm看到,每次开机启动就开启了10个job线程一直在等待。搞不懂它开那么多干嘛,我一天就执行一次job.
因为资源有限(服务器的内存只有512M,很少),我现在还是不想将Quartz从应用中剥离出来.不知道robbin有没有好的办法?
27 楼 2157524 2012-05-07  
求解答  LinkedBlockingQueue  这个队列是当前线程队列,可以处理并发!
我用quartz任务调度,他使用了另外的线程了!于是获取不到当前线程变量LinkedBlockingQueue   ,这个应该怎么处理呢???
26 楼 ligangligang 2012-02-22  
请问 定时任务大约跑了12个小时就自动停止了,不知道是何原因,重启服务器之后才能在次跑起来,纠结!!!! 无缘无故就停止了,没有任何错误信息
25 楼 liliugen 2011-08-25  
确实有这个问题, quartz一下子启动十个线程,

如果不在tomcat的里面做,也就是剥离出项目,在别的地方用cron脚本做。对于产品上面要维护两个地方的东西。
不剥离出来吧,确实线程启动多了,可能会带来别的问题。

24 楼 ap0406708 2010-10-13  
robbin 写道
引用
最好搞明白了再发表高论,呵

1、Quartz的线程是另外起的,有专门的线程池来管理(Quartz自己实现的),根本就不会使用容器的线程

2、Quartz是支持集群的,通过将任务持久化到数据库,利用行锁功能来实现集群

3、Quartz也支持非容器方式独立运行


你也最好看明白了再发表你的高论

1、我说Quartz使用web容器的线程了吗?拜托你自己看看清楚我的原话是“Quartz自己启动了10个线程”!

2、在我写这篇文章的时候,Quartz尚未添加cluster功能,拜托你看看清楚这是哪年的文章。

3、我说过Quartz不能独立运行吗? 拜托你看看清楚我给出的方案就是让Quartz以非容器的方式独立运行的。


争论出真理,理系越辨越明的~~~
23 楼 robbin 2008-09-01  
引用
最好搞明白了再发表高论,呵

1、Quartz的线程是另外起的,有专门的线程池来管理(Quartz自己实现的),根本就不会使用容器的线程

2、Quartz是支持集群的,通过将任务持久化到数据库,利用行锁功能来实现集群

3、Quartz也支持非容器方式独立运行


你也最好看明白了再发表你的高论

1、我说Quartz使用web容器的线程了吗?拜托你自己看看清楚我的原话是“Quartz自己启动了10个线程”!

2、在我写这篇文章的时候,Quartz尚未添加cluster功能,拜托你看看清楚这是哪年的文章。

3、我说过Quartz不能独立运行吗? 拜托你看看清楚我给出的方案就是让Quartz以非容器的方式独立运行的。

22 楼 hill_xxg 2008-09-01  
最好搞明白了再发表高论,呵

1、Quartz的线程是另外起的,有专门的线程池来管理(Quartz自己实现的),根本就不会使用容器的线程

2、Quartz是支持集群的,通过将任务持久化到数据库,利用行锁功能来实现集群

3、Quartz也支持非容器方式独立运行

  
21 楼 YuanYang 2007-07-17  
另外,一般定时任务都是业务流程的一部分,如果把定时任务和web应用分开,需要处理并发(分布并发)会增加代码的复杂程度。
20 楼 YuanYang 2007-07-17  
对于Web容器来说,最忌讳应用程序私自启动线程,自行进行线程调度,像Quartz这种在web容器内部默认就自己启动了10个线程进行异步job调度的框架本身就是很危险的事情,很容易造成servlet线程资源回收不掉,所以我一向排斥使用quartz。

有些不明白,能详细说说?

如果把Application Server看成一个空间,servlet和quartz是同一份内存下、平等的两个线程,这么会相互影响?

我想只要不是在Action(servlet)里面初始化quartz应该没有问题吧?

19 楼 wdmsyf 2007-05-22  
我的做法跟Robbin的看法一致,握个手先
18 楼 ivan 2007-04-21  
有的,Quartz官方就有一个,不过现在好像没人维护了?

http://wiki.opensymphony.com/display/QRTZ1/QuickStart
17 楼 tuwen 2007-04-03  
引用

另外还可以单独做一个job管理界面,可以通过web界面手工添加任务,查看任务状态,删除任务等等。

请问这个怎么实现呢,有没有demo代码,有开源程序支持吗?
16 楼 bitlong 2007-02-20  
如果Job内部的缓存和WEB容器内都是使用了缓存那应该怎么处理,在搭建一个第三方独立进程的缓存?对于一个小的应用来说是不是开销太大了。这个进程间的低耦合带来的可能是系统的更加不稳定。因为增加了很多故障点
15 楼 Hejrcc 2007-02-14  
引用
quartz还有一个问题就是不支持cluster。


我没有实际使用过cluster.

不过quartz官方网站上面有段话, 不知道是不是说quartz支持cluster呢?

引用
Runtime Environments
...
Quartz can be instantiated as a cluster of stand-alone programs (with load-balance and fail-over capabilities)


from: http://www.opensymphony.com/quartz/wikidocs/Features.html
14 楼 Hejrcc 2007-02-14  
引用
quartz还有一个问题就是不支持cluster。


我没有实际使用过cluster.

不过quartz上面有段话, 不知道是不是说支持 quartz还有一个问题就是不支持cluster。 呢?

Runtime Environments
...
Quartz can be instantiated as a cluster of stand-alone programs (with load-balance and fail-over capabilities)

13 楼 SteveGY 2007-02-01  
如果只是定期的Job,Robbin提的方法还是比crontab+batch复杂的,但如果是异步执行任务,又没有JMS支持,例如系统只有tomcat,则这样的做法没有JMS可靠又比message driven bean复杂,而且cluster的话,总是有问题的。有时候,有一些看似基本的功能,在web这样的环境中执行起来,异步执行后台操作的用户体验会比较好一些,例如,在接受用户postback数据后,处理数据库操作,又发出邮件这样的行为,往往是把发邮件这样的动作配置为异步执行会使用户页面的响应变快。
所以,我设计比较大容量的系统时,一般不考虑仅使用tomcat的,message queue server是必须的,有没有其他的EJB支持倒不重要,JMS几乎一定会用到。
异步发邮件这种事情,在NT的CDONTS上,天生是支持异步的(通过NT SMTP服务),所以ASP系统处理这类问题都没有性能问题,javamail没有这个优势,麻烦啊。
12 楼 ppeter 2007-01-24  
偶没看过官方wiki,也没做过整合quartz的cluster,但我觉得
robbin提出的设计方案,看似增加了工作,但带来的结果是系统的灵活性更好,同时也可以处理好web容器线程安全问题,Quartz这块完全可以抽象成独立的模块,这样设计似乎也更符合oo思想吧.
11 楼 dohc 2007-01-05  
引用
quartz还有一个问题就是不支持cluster。导致使用quartz的应用都没有办法做群集。


引用
然后web应用去掉quartz部分配置,把原来的调用quartz任务的代码改写为读写数据库的任务表,这样就把job部分完全从web容器剥离掉了,甚至web容器做cluster也没有问题了,并且多个web节点在同时读写任务表的时候,还有数据库的事务来确保操作的一致性,实在是很棒。


可以集群的, 大家要把全文看清楚.
可以参考官方wiki:
http://wiki.opensymphony.com/display/QRTZ1/ConfigJDBCJobStoreClustering
10 楼 melin 2007-01-03  
引用
quartz还有一个问题就是不支持cluster。导致使用quartz的应用都没有办法做群集。

这是诋毁大师的作品。我已经在至少三个地方看见你这样说了,你现在也算是软件行业的“公众人物了”,你的言行会对他人有不小的误导。罪过!罪过!罪过!
9 楼 laojiang 2006-12-30  
前台和后台分开部署,程序分开写,前台一般不需要Quartz,后台管理用Quartz,后台管理的人比较少,应该不需要集群。

相关推荐

    Quartz在.Net网站中的使用方法

    结果在苦寻之下找到了Quartz这个组件.看过之后感觉还不错.决定用它实现计划任务了. 再找找看有没有现成的任务.但找了大半天.大多数都是C/S结构中用的. 于是就把自已的写的Demo放到网上,供大家参考一下,如有不正确之...

    spring+quartz动态定时任务创建 +mybatis

    上一次传错了资源了,这个是正确的,包含quartz动态定时任务的

    Quartz最全开发手册(中文版)

    1. 第一课:使用Quartz 2. 第二课:Jobs And Triggers 3. 第三课:更多关于Jobs和JobDetails的内容 4. 第四课:关于Triggers更多的内容 5. 第五课:SimpleTriggers 6. 第六课: CronTriggers 7. 第七课: TriggerListeners...

    spring-quartz:使用三种方式实现quartz定时任务

    定时任务数据存储在内存,定时任务信息保存数据库3.JDBCJobStore官方11张数据库表所有数据存储在数据库,可实现复杂任务(日历配置)项目运行方法:1.MySQL数据库启动导入数据(spring-quartz/quartz_test)且正确配置...

    Quartz实现阶梯式任务调度

    使用Quartz的JobListene实现阶梯式任务调度,任务在一个阶段的执行次数达到上限则进入下一个执行阶段,任务收到正确的相应信息终止整个调度任务,

    HIPImageCropper:可重复使用的图像裁剪和缩放界面

    Quartz绘制的iOS相机捕捉风格叠加 自动将照片捕捉到边缘 这是使用基本“捕获”按钮的演示应用程序的屏幕截图: : 。 要求 弧 QuartzCore.framework 学分 HIPImageCropper 由 Hipo带给您。 执照 HIPImageCropper 根据...

    LoopiaDynamicDNSClient:适用于Loopia的动态DNS客户端

    根据Loopias的“ forbereda-doman-for-vart-dyndns-stod”,这应该是正确的。 如果有人对此有疑问,我将对其进行更新,以便轻松选择要更新的索引。 根据以下示例设置Quartz Crontab时间表: 致谢 正在使用以下组件...

    apple-ios-samples

    它演示了如何使用UIAccelerometer类以及如何使用Quartz2D和Core Animation提供高性能的图形视图。 它还演示了可以用来隔离重力影响的低通滤波器,以及可以用来消除重力影响的高通滤波器。用户体验健康套件此示例...

    探秘工业机器人的视觉系统.doc

    一般的灯光形式是高频荧光灯、LED、白炽灯和石英卤(quartz-halogen)光纤。   3. 部件传感器 通常以光栅或传感器的形式出现,当传感器感知到部件靠近,它会给出一个触发信号。当部件处于正确位置时,...

    prototype:用于创建模型的Mac应用程序

    代替有人接手并做很多工作,该项目应该被视为已停用,并且仅在此处用于共享。 阅读“部分以获取更多详细信息。 原型 用于创建模型的Mac应用程序。 样本 这是该应用程序以和导出的示例导出。 动机 有许多很棒的应用...

    v002-Image-Loader:完全支持32位图像的图像加载器

    v002-图像加载器完全支持32位图像的图像加载器尽管Quartz Composer声称支持32位图像加载,但是内部纹理提交趋于下降到每个通道8位,即使对于报告32位浮点格式的图像也是如此。 完美是许多正确的小事情。 注意纹理的...

    基于有限元分析QCM电极尺寸的优化设计* (2007年)

    提出了一种优化石英晶体微天平(Quartz Crystal Microbalance,简称QCM)结构、抑制寄生振动模的设计方法.用 Ansys9.0有限元软件直接对QCM进行三维有限元分析,从而避免了一般解析和半解析中对控制方程的简化.首先...

    石英挠性加速度计数字闭环检测电路噪声研究

    为解决目前数字闭环石英挠性加速度计(Digital ClosedLoop quartz flex Accelerometer, DCLA)实测精度与其理论极限精度存在一个数量级的问题,进行DCLA闭环检测电路噪声分析。建立闭环系统误差模型,采用噪声逐级...

    石英波片相位延迟随温度的变化行为

    理论和数值地分析了石英波片的温度特性,得到石英波片的折射率温度系数和热膨胀系数的关系及折射率温度系数与波长的关系,为正确设计和使用波片提供参数选择依据。一块厚约1.8 mm的波片,对应波长632.8 nm,温度每升高1 ...

Global site tag (gtag.js) - Google Analytics