我有一个在Glassfish服务器上运行的java Web应用程序。使用war文件我用于在各种服务器中部署应用程序。现在为了保持我的应用程序的数据库更新,我想定期运行一些类(在应用程序内部)而不进行任何用户交互(不应该依赖于应用程序正在运行或不运行/当前用户/会话)。我已经看到使用一些计时器和 TimerTask 类我可以定期运行任何作业。但是如何首次初始化呢?
请考虑如何完成此过程。
答案 0 :(得分:3)
使用作业计划程序。考虑Quartz http://quartz-scheduler.org/并在程序启动时启动它。使用调度程序的好处是程序更易于维护,您可以轻松创建其他新作业
答案 1 :(得分:1)
创建一个servlet并在启动时加载它。我认为你可以在那里初始化你的任务。
答案 2 :(得分:1)
Quartz是一个很好的解决方案。但是如果你需要更轻量级的东西,我会看看预定的执行者:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html
它不如Quartz灵活,但您不需要添加任何依赖项,它可能足以满足您的需求。
关于启动;我通常使用Spring来连接我的应用程序及其依赖项。因此,启动调度程序和运行计划任务是没有道理的。
答案 3 :(得分:1)
答案会根据您使用的Java EE版本而变化。在Java EE 5和以前的版本中,您将使用ServletContextListener在使用Timer API的部署时运行代码(调用EJB)。在Java EE 6+中,您可以使用@Schedule注释,该注释使用注释和cron类型语法在部署时安排任务。
当然,如果您不需要自动部署时间安排,那么您只需创建一些在提交时调用EJB的Web表单,然后以编程方式调用Timer API。
有关详情,请参阅the Java EE tutorial