繁体   English   中英

在Jetty中对Servlet的正常降级

[英]Graceful degradation of servlets in Jetty

我正在运行嵌入式Jetty 8服务器,该服务器在启动时会加载一些* .war文件:

for (File aWebAppDirectory : aWebAppDirectories) {
      if (aWebAppDirectory.exists() && aWebAppDirectory.isDirectory()) {
        for (File warFile : aWebAppDirectory.listFiles(new WarFileFilter())) {            String basename = warFile.getName().replaceFirst("\\.war$", "");
         fHandlers.addHandler(new WebAppContext(warFile.getAbsolutePath(), "/" + basename));
       }
     }
   }

这些war-file对可能在类路径中存在或不存在的一些类具有一定的依赖性。

现在,如果我的一个servlet缺少依赖项,则整个嵌入式Jetty服务都会失败。 (由于NoClassDefFoundExceptions)

我需要一种方法,该方法允许我捕获失败的servlet的异常,并且根本不激活它们。 我正在寻找与servlet无法加载时TomCat所做的相同的事情:它仍然加载其余部分。

在Google上搜索一段时间后,我没有找到任何解决方案。

有谁知道我可以使用嵌入式Jetty 8解决这个问题?

如果有人对如何解决此问题感到好奇,我只需确保我的所有servlet都具有一个基本上没有依赖关系的包装servlet。 包装器尝试使用依赖项初始化委托,并显式检查NoClassDefFountException。 如果发生这种情况,则将委托设置为null,并且对包装器接口的所有调用都将导致异常。 因此,从高层次看:

public class ServletWrapper extends HttpServlet{
  private ServletDelegate fDelegate;
  //If this is false, the delegate does not work, and we should not forward anything to it.
  private boolean fAvailable = false;

  public ServletWrapper(){
    try{
      fDelegate = new ServletDelegate();
      fAvailable = true;
    } catch (NoClassDefFoundError e) {
      fAvailable = false;
    }
  }

  @Override
  protected void doPost( HttpServletRequest request, HttpServletResponse response )
      throws ServletException, IOException {
    if ( !fAvailable || fDelegate==null ) {
      response.sendError( HttpServletResponse.SC_SERVICE_UNAVAILABLE, LSP_MISSING_ERROR_MESSAGE );
      return;
    }

   fDelegate.doPost(request,response);
  }

}

它很简单,并且可以正常工作。

暂无
暂无

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

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