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

应该如何正确使用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 定时WebForm和WinForm使用的dll

    这个标题“Quartz 定时WebForm和WinForm使用的dll”暗示了我们将在WebForm和WinForm应用中使用Quartz来实现定时功能。在.NET环境中,Quartz通过引入特定的DLL文件来实现其功能。 首先,我们要理解什么是DLL...

    使用quartz需要的jar包

    在使用Quartz时,确保正确引入所需的jar包至关重要,因为这些jar包包含了Quartz运行所需的所有类和资源。 1. **Quartz核心库**: 主要的jar包是`quartz.jar`,它包含了Quartz的核心组件,如Scheduler、Job、...

    Android studio下的quartz工程

    **Android Studio下的Quartz工程详解** ...通过正确配置和使用,Quartz可以成为Android应用的强大工具。不过,需要注意Android的特殊性,如主线程限制和生命周期管理,确保任务能够正常且高效地运行。

    quartz-2.2.3版本的quartz初始化sql语句

    Quartz是一款广泛使用的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Quartz 2.2.3版本中,初始化数据库是使用...正确理解和使用这些SQL语句,有助于确保Quartz在各种数据库环境中稳定运行。

    quartz-1.6.5使用手册

    注意需要将 Quartz 的 JAR 包添加到类路径中,以便正确地使用 Quartz 的功能。 示例程序 Quartz 提供了一个 examples 文件夹,里面包含了官方提供的示例源代码。我们可以创建一个新的 Java 项目,并将 examples ...

    Quartz使用小结

    Quartz是一款开源的作业调度框架,它允许开发者创建和管理作业计划,以便在特定时间执行任务。这个小结将深入探讨Quartz的...在实际项目中,正确使用Quartz可以大大提高系统的自动化程度,减少手动干预,提高工作效率。

    quartz quartz-1.8.6 dbTables 建表sql

    正确设置并使用这些数据库表后,Quartz就可以在数据库中持久化作业和触发器的状态,即使应用程序重启,也能恢复之前设定的调度信息,实现任务的连续性和可靠性。 总之,"quartz quartz-1.8.6 dbTables" 提供了构建...

    关于spring中quartz的配置

    如果使用的是Spring Boot,可以在`application.properties`或`application.yml`中配置Quartz,并通过`@EnableScheduling`注解启用定时任务支持。 8. **动态管理定时任务** Spring提供的`SchedulerFactoryBean`...

    quartz创建表sql

    在部署Quartz时,确保正确配置了Scheduler的数据库连接信息,这样Quartz才能正确地读取和写入这些表。同时,为了保证系统的稳定运行,建议定期备份这些表,以便在出现问题时能够快速恢复。 总结,创建Quartz表是...

    Quartz所需jar包

    Quartz是一款开源的作业调度框架,它允许开发者在Java应用程序中定义和执行复杂的定时任务。在Java应用开发中,Quartz常被用来自动化各种后台任务...正确理解和使用Quartz所需jar包,可以极大地提升你的项目管理效率。

    quartz_2.3.0 SQL脚本

    Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它允许开发者灵活地定义作业和触发器,实现复杂的时间调度。...了解并正确使用这些脚本对于成功部署和维护Quartz系统至关重要。

    quartz.jar包下载

    Quartz.jar是一个非常重要的Java库,它主要用于计划和执行任务,特别是在企业级应用程序中。这个包包含了一系列的类和接口,使得开发者能够方便地...正确理解和使用Quartz,能极大地提高你的工作效率并优化系统运行。

    quartz实例sqlserver数据库连接

    以上就是使用Quartz.NET与SQL Server数据库连接的基本配置和使用步骤。通过这种方式,你可以利用Quartz的强大功能在SQL Server数据库的支持下实现复杂的时间调度逻辑。记住,配置和使用过程中要根据具体需求进行调整...

    Java使用quartz实现任务调度定时任务

    `quartz_job.sql`文件可能包含Quartz所需的数据库表结构,Quartz使用数据库来存储Job和Trigger的信息,以便在系统重启后仍能恢复之前设置的任务。你需要根据自己的数据库类型(如MySQL、Oracle等)对这个SQL脚本进行...

    quartz数据库脚本

    总的来说,Quartz数据库脚本是实现Quartz在不同数据库环境下的关键组件,它们使得开发者能够在不修改Quartz源码的情况下,方便地在各种数据库系统中部署和使用作业调度服务。这不仅提高了灵活性,也降低了项目维护的...

    Spring Quartz如何动态配置时间

    Spring Quartz 动态配置时间 Spring Quartz 是一个功能强大的任务调度框架,...使用 Spring Quartz 实现动态配置时间可以提高系统的灵活性和可维护性,但需要正确地选择时间规则、转换时间规则和记录时间规则表达式。

    spring+quartz使用jar包

    Spring 和 Quartz 是两个在 Java 开发中非常重要的框架。Spring 是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、MVC...正确配置和使用这两个框架,能够为企业的后台服务带来极大的灵活性和可维护性。

    quartz各种数据库的建表语句

    总之,正确地在各种数据库上设置Quartz的表结构是确保任务调度系统正常运行的基础。请务必仔细阅读官方文档,以获取最新的建表语句和配置指南,因为随着Quartz版本的更新,这些信息可能会有所变化。同时,不要忘记在...

    quartz实例

    这个实例可以立即运行,展示了如何在实际应用中配置和使用Quartz。 Quartz的核心概念包括作业(Job)、触发器(Trigger)和调度器(Scheduler)。作业是你要执行的任务,而触发器定义了任务何时运行。调度器则负责...

    quartz

    Quartz 的基本配置对于正确设置和管理调度器至关重要,它允许用户定制调度器的行为以满足特定的需求。 在配置 Quartz 时,主要关注以下几个关键设置: 1. **org.quartz.scheduler.instanceName**:这个属性用于...

Global site tag (gtag.js) - Google Analytics