Java Servlets:运行后台任务的“最佳实践”?

时间:2011-12-04 13:45:23

标签: java servlets background-process

我正在开发一个Web应用程序,它需要立即清除过期的缓存元素。我想使用Quartz框架来完成这项工作,并有一个单独的工作来参与其中。

现在,我在其他项目中使用了Quartz,并且通常使用contextInitialised(ServletContextEvent sce)和contextDestroyed(ServletContextEvent sce)从ServletContextListener安排所有作业。但是,我这样做了,因为我曾经读过的教程是这样做的。

我不确定我是否可以从servlet的init()和destroy()方法中安排任务?我想有人可能会争辩说我现在正在混合后台任务和servlet,以及责任,但我想听听是否有“最佳实践”?

3 个答案:

答案 0 :(得分:3)

部署webapp时,不一定要初始化servlet。它可能会被懒惰地初始化。

并且您可能在一个Web应用程序中有许多servlet,因此您可能会想知道哪个servlet将负责调度。

在部署和取消部署时必须完成某些事情时,ServletContextListener是正确的工具。

答案 1 :(得分:3)

首先,通常的免责声明:你不应该乱用Servlet容器中的线程。所以所有方法都是错误的(我怀疑正确的方法是从curl调用crontab)。

ServletContextListener是目前首选的方法;当init()不在此时,Servlet的ServletContextListener是一个OK方法。但是,servlet存在不同的问题:首先,它可能不会在启动时出现(由load-on-startup参数解决);它可以卸载只是因为包含的servlet决定这样做(从未在实践中看到过 - 但规范说它可以)。

然而,最重要的是,这是一个技巧 - 而且除了你仔细记录之外,它对读者来说没什么意义,或者他知道这是一个技巧。所以,如果有疑问,请避免。

答案 2 :(得分:1)

使用contextInitialised的{​​{1}}和contextDestroyed方法看起来非常适合您的情况。

例如,Spring Framework在初始化spring bean和调度任务(ServletContextListener)时完全相同。

另外,我会考虑使用某种抽象来调度石英任务(例如提到的Spring Framework)。