我正在开发一个Web应用程序,它需要立即清除过期的缓存元素。我想使用Quartz框架来完成这项工作,并有一个单独的工作来参与其中。
现在,我在其他项目中使用了Quartz,并且通常使用contextInitialised(ServletContextEvent sce)和contextDestroyed(ServletContextEvent sce)从ServletContextListener安排所有作业。但是,我这样做了,因为我曾经读过的教程是这样做的。
我不确定我是否可以从servlet的init()和destroy()方法中安排任务?我想有人可能会争辩说我现在正在混合后台任务和servlet,以及责任,但我想听听是否有“最佳实践”?
答案 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)。