繁体   English   中英

强制部署 web 应用程序在 Tomcat 上失败

[英]Force deploy of web application to fail on Tomcat

我们正在研究将一些 web JSF 应用程序从 Payara 5 迁移到 Tomcat 9 (TomEE 8) 的可能性。 我们正在使用 Java 11 和 Java EE 7/8。 我们的应用程序使用 RMI 连接到后端服务器。 目前,使用 Payara 5,当将我们连接到后端服务器的代码失败时(由于服务器不可用或 web.xml 中定义的凭据无效而引发异常),部署失败。

看这段代码:

public class MainServlet extends HttpServlet {
  //constructor, variables etc.
  @Override
  public void init(ServletConfig config) throws ServletException {
    super.init(config);
    //read configurations from web.xml
    try {
      connectToBackendServer();
    catch (Exception e) {
      throw new UnavailableException("Cannot connect to Backend Server");
    }
  }
  //other methods
}

上面的代码使 Payara 5 上的部署失败,但 Tomcat 9 允许部署。 对于 Tomcat,我们通过检查日志或尝试前端并获取错误来注意到后端不正常。 请参见下图,其中我们的connectToBackendServer()方法引发了 NullPointerException。

在此处输入图像描述

我们完全意识到这不是最好的方法,因为在成功部署之后后端可能会失败,但至少我们涵盖了web.xml的配置错误的情况。

我们可以用 Tomcat 9(TomEE 8) 实现类似的功能吗?

谢谢大家!

..

将您的逻辑移动到ServletContextListener并从contextInitialized()引发运行时异常。 在许多服务器上,这将导致部署失败,并且对应用程序的任何请求都将返回error 500 不过,规范并不要求这种确切的行为,因此服务器之间的结果略有不同。

这是使用部署失败的ServletContextListener的示例实现:

package com.example;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;

@WebListener
public class ExampleServletContextListener implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent e) {
        try {
            callThatFailsAndThrowsAnException();

            catch (Exception e) {
                throw new UnavailableException("Something went very wrong - I'm bailing out.");
            }
    }

    @Override
    public void contextDestroyed(ServletContextEvent e) {
        /* Application shutdown */
    }
}

@WebListener向容器注册上下文侦听器。 如果您使用的是旧版本的 JakartaEE/JavaEE 并且注解不可用,则可以在web.xml中注册上下文侦听器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM