在Java SE中,当我运行main()时,我有一个等待执行的计划任务。
但是在Java EE(JBoss webservice)中,这些方法在有Web请求时运行。
部署应用程序后,有没有办法开始计划任务?
我希望使用ScheduledExecutorService
。
答案 0 :(得分:3)
ServletContextListener
仅当Servlet从用户到达时,Request才会运行。必须在处理第一个请求之前完成诸如调度程序之类的设置任务。
这就是ServletContextListener
界面的目的。术语“Servlet上下文”仅表示您的Web应用程序。 "听众" part表示将自动调用实现此接口的类。
具体来说,将调用两种方法中的任何一种。部署Web应用程序时会调用一种方法,另一种方法是在Web应用程序关闭时调用。使用一个启动ScheduledExecutorService
。使用另一个终止ScheduledExecutorService
。非常重要的是终止,因为您的执行程序的线程池可能会在您的Web应用程序停止很久之后,甚至在您的Web容器关闭后继续运行。
当您编写实现此接口的类时,您可以使用不同的途径进行部署。最简单的方法是使用@WebListener
注释标记类。您的Web容器将自动检测这样一个标记的类并加载它。 Web容器初始化Web应用程序后,但在处理第一个传入请求之前,将调用ServletContextListener
。 Servlet spec版本2.3及更高版本保证了此行为。所以它适用于all Web containers:Tomcat,Jetty,TomEE,Glassfish,JBoss,WildFly等。
ServletContextListener
架构是Servlet的明智补充,对于更严肃的Web应用程序至关重要。设计通常很好但缺少一个重要特性:如果在安装过程中出现问题,您的监听器将无法停止Web应用程序的部署。如果您的数据库已关闭,或者需要Web服务无法访问,或其他重要资源不可用,您可能不希望启动Web应用程序。 Servlet规范无法满足这一需求。解决方法是以某种方式在监听器和servlet之间进行通信,也许在context “attributes”中设置一些标志并检查servlet中的那个标志。
我给了talk on this subject of ServletContextListener
at Devoxx Morocco 2017。我的一些幻灯片显示在上面,整个幻灯片是available as a PDF。