2010-04-14 37 views
5

我在web应用程序中安排作业有一个问题。如果我们必须在Web应用程序中安排作业,我们可以使用java util Timer/TimerTask或Quartz(还有其他调度机制,但我认为Quartz)。我正在考虑使用哪一个,当我点击该网站http://oreilly.com/pub/a/java/archive/quartz.html?page=1时说,使用计时器会产生不良影响,因为它会在最后一行创建一个超出容器控制的线程。其他页面讨论Quartz及其功能,但我可以读懂Quartz也使用线程和/或线程池来安排任务。我的猜测是这些线程也不在容器控制之下在Web应用程序中的石英

有人可以向我澄清这个 在我的Web应用程序中使用Quartz是否安全而不会创建悬挂线程或线程锁定问题? 在此先感谢

回答

2

有人可以向我澄清这是否可以安全地在我的Web应用程序中使用Quartz而不会创建悬挂线程或线程锁定问题?

石英和JDK Timer都启动了无法访问Java EE上下文信息的非托管线程,这是最大的问题。 此外,他们可以在没有[应用程序服务器]了解的情况下使用资源,存在管理员无法控制其数量和资源使用情况,并妨碍应用程序服务器正常关闭或从故障中恢复资源的能力(请参阅Unmanaged threads )。有这个说法,我没有面对挂线或锁定问题(我想这取决于你在做什么,但他们)。

如果真的这是一个问题,请考虑使用JSR-237定时器和WorkManager实现(与托管线程一起工作),如Foo-CommonJ而不是石英或JDK计时器。

1

两种方法都创建了非托管线程。我使用Quartz进行调度,而不是java Timer,因为它提供了更多的灵活性(例如cron表达式),并且它更易于管理。

1

如果我必须在一行中说,我会说使用Quartz,因为它会照顾到为您管理与调度相关的低级别工作。使用定时器,您可以完成石英所做的一切(甚至可以让定时器线程继续轮询以检查Web应用程序是否正在运行并退出)。但是这需要由您的代码完成。使用Quartz,你可以开箱即用。

现在详细 Quartz提供 1.工作持续 2.管理线程池,以便在创建线程的适当数量,使以后的工作等待。 3.初始化servlet与您的Web应用程序集成。当应用程序关闭时,我认为它需要关闭您的线程,但我没有尝试过。所以我不会对此发表评论。 4.基于RMI的调度,适用于集群环境。

还有其他的,但这些是人们更频繁使用石英的最大动力。

相关问题