应用程序停止时显示自定义网页

时间:2010-11-17 07:11:45

标签: tomcat

我开发了一个部署在Apache Tomcat中的Web应用程序。需要在不停止Tomcat的情况下停止应用程序。可以使用tomcat manger提供的启动/停止功能来完成。需要显示一个Web应用程序停止时自定义网页(说应用程序已关闭以进行维护)。我想通过在catalina / conf或任何其他机制中配置webxml来了解tomcat是否方便。可以任何机构给出一个想法.....

3 个答案:

答案 0 :(得分:1)

有点老问题,但我会加上我的2美分,因为它可能会帮助某人走上正轨。

我理解Tomcat提供的所有内容都来自应用程序。每当您在webapps中创建一个文件夹时,该文件夹将作为应用程序提供。

也就是说,使用tomcat服务器前面的apache http提供功能相当容易。

在apache http上使用mod_proxy,当tomcat应用程序关闭时,tomcat返回一个http 503.你只需要将下面的行添加到你的httpd.conf(或者如果它已经存在则取消注释)并创建一个在你的apache www文件夹(或htdocs)里面的downtime.html(在这种情况下)。 :)

ErrorDocument 503 /downtime.html

答案 1 :(得分:0)

您是否可以提供自定义错误页面(500状态,或者当应用程序没有响应时服务器通常返回的任何内容),并且只是使用它?

答案 2 :(得分:0)

我想为已停止或暂时取消部署的网络应用程序设置自定义页面。 首先,我创建了一个自定义错误页面并将其放在/srv/www/html/maintenance/report.html中。 然后,我创建了一个自定义阀门,编译,jared并将其放入tomcats(6)lib文件夹。

package my.package;

import org.apache.catalina.Container;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.valves.ValveBase;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
* Created by IntelliJ IDEA.
* User: przemyslaw
* Date: 13.11.11
*/
public class AppErrorReportValve extends ValveBase {
  String errorPagePath = null;
  String appContextName = null;
  String appContextPath = null;

  public void invoke(Request request, Response response)
    throws IOException, ServletException {

    StandardContext appContext = (StandardContext)container.findChild(appContextName);

    if((appContext==null || appContext.getState()!=1 || !appContext.getAvailable()) && request.getRequestURI().startsWith(appContextPath)){
         if (response.isCommitted()) {
            return;
         }

        // The response is an error
        response.setError();

        // Reset the response (if possible)
        try {
            response.reset();
        } catch (IllegalStateException e) {

        }

        response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
        response.setSuspended(false);

        try {
            //containerLog.info("render Error");
            response.setContentType("text/html");
            response.setCharacterEncoding("utf-8");
            renderError(response);
            return;
        } catch (Throwable tt) {

        }


    }
    // Perform the request
    getNext().invoke(request, response);

}

void renderError(Response response){
       BufferedInputStream bis = null;
       OutputStream os = null;

       try
       {
         FileInputStream fis = new FileInputStream (errorPagePath);
         bis = new BufferedInputStream (fis);
         os = response.getOutputStream();

         int byte_;
         while ((byte_ = bis.read ()) != -1)
           os.write (byte_);
       }
       catch (FileNotFoundException e)
       {
         containerLog.error("File not found " + errorPagePath, e);
         // Do other stuff related to that exception (if necessary).
       }
       catch (IOException e)
       {
         containerLog.error("I/O Problem: ",e);
         // Do other stuff related to that exception (if necessary).
       }
       finally
       {
         if (bis != null)
           try
           {
             bis.close ();
           }
           catch (IOException e)
           {
           }

         if (os != null)
           try
           {
             os.flush();
             os.close ();
           }
           catch (IOException e)
           {
           }
       }

  }

  public String getErrorPagePath() {
    return errorPagePath;
  }

  public void setErrorPagePath(String errorPagePath) {
    this.errorPagePath = errorPagePath;
  }

  public String getAppContextName() {
    return appContextName;
  }

  public void setAppContextName(String appContextName) {
    this.appContextName = appContextName;
    this.appContextPath = appContextName+"/";
  }
}

至少我配置了tomcats conf / server.xml

<Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">

    <Valve className="my.package.AppErrorReportValve" appContextName="/report" errorPagePath="/srv/www/html/maintenance/report.html" resolveHosts="false"/>
     ...
  </Host>

现在,当我的网络应用/报告停止或取消部署时,tomcat会显示自定义服务不可用的页面。