我的特定设置是在Tomcat7下打包为war文件的Java webapp,但问题更为笼统。在我们的webapp中,我们通过Servlet 3.x @WebServlet注释注册了多个servlet(并且还标记了loadOnStartup = 1)。问题是如果其中一个servlet在初始化期间因为抛出异常而出于某种正当理由而失败,该怎么办。在这种情况下,我们看到两个问题:
Tomcat注意到servlet失败。但我们的服务一直受到负载均衡器的调查,试图决定是否将我们纳入池中。每个探测器都可以访问映射到失败的servlet的URL。 Tomcat不断尝试并重试初始化webapp,每次都失败。有没有办法让Tomcat停止尝试并放弃?我们可以监控初始化失败并在必要时采取纠正措施。
同一个webapp中的其他servlet没有失败(这些也通过带有loadOnStartup = 1的WebServlet注释加载)。因此,如果我们尝试通过点击适当的URL来访问它们,Tomcat就会让我们通过。如果webapp中的一个servlet失败会导致整个webapp失败,我们会更喜欢它。
答案 0 :(得分:4)
您可以将所有可用的启动操作放在ServletContextListener
中,该ServletContextListener
在任何servlet之前初始化。如果ServletContextListener
的init失败,则不会部署整个webapp。
然后,您的servlet可以在初始化时向单例float
询问已经初始化的资源。
答案 1 :(得分:0)
这是我的方法:
ServletContextListener
。true or false
)放在上下文context.setAttribute()
中。或者为不同的init操作结果添加几个T/F
属性。servlet
添加过滤器以处理所有请求。检查上下文属性,如果启动操作失败,此过滤器将正常响应请求,通过重定向或发送错误响应代码来进行负载均衡器查询。