如何在webapp中存在多个servlet时处理初始化失败

时间:2015-11-10 15:46:19

标签: java servlets

我的特定设置是在Tomcat7下打包为war文件的Java webapp,但问题更为笼统。在我们的webapp中,我们通过Servlet 3.x @WebServlet注释注册了多个servlet(并且还标记了loadOnStartup = 1)。问题是如果其中一个servlet在初始化期间因为抛出异常而出于某种正当理由而失败,该怎么办。在这种情况下,我们看到两个问题:

  1. Tomcat注意到servlet失败。但我们的服务一直受到负载均衡器的调查,试图决定是否将我们纳入池中。每个探测器都可以访问映射到失败的servlet的URL。 Tomcat不断尝试并重试初始化webapp,每次都失败。有没有办法让Tomcat停止尝试并放弃?我们可以监控初始化失败并在必要时采取纠正措施。

  2. 同一个webapp中的其他servlet没有失败(这些也通过带有loadOnStartup = 1的WebServlet注释加载)。因此,如果我们尝试通过点击适当的URL来访问它们,Tomcat就会让我们通过。如果webapp中的一个servlet失败会导致整个webapp失败,我们会更喜欢它。

2 个答案:

答案 0 :(得分:4)

您可以将所有可用的启动操作放在ServletContextListener中,该ServletContextListener在任何servlet之前初始化。如果ServletContextListener的init失败,则不会部署整个webapp。

然后,您的servlet可以在初始化时向单例float询问已经初始化的资源。

答案 1 :(得分:0)

这是我的方法:

  1. 将所有启动操作代码放入ServletContextListener
  2. 在所有启动操作结束时,将属性(true or false)放在上下文context.setAttribute()中。或者为不同的init操作结果添加几个T/F属性。
  3. 为此servlet添加过滤器以处理所有请求。检查上下文属性,如果启动操作失败,此过滤器将正常响应请求,通过重定向或发送错误响应代码来进行负载均衡器查询。