Показать пользовательскую веб-страницу, когда приложение остановлено - PullRequest
1 голос
/ 17 ноября 2010

Я разработал веб-приложение, которое развернуто в Apache Tomcat. Необходимо остановить приложение, не останавливая Tomcat. Это можно сделать с помощью функций запуска / остановки, предоставляемых менеджером tomcat. Требуется отобразить Пользовательская веб-страница (которая говорит, что приложение закрыто для обслуживания), когда веб-приложение остановлено. Я хочу знать, что tomcat облегчает это, настраивая webxml в catalina / conf или любым другим механизмом. Может ли любое тело дать идею .....

Ответы [ 3 ]

1 голос
/ 28 мая 2014

Немного старый вопрос, но я добавлю свои 2 цента, так как это может помочь кому-то в будущем.

Насколько я понимаю, все, что подается от Tomcat, исходит из приложения. Всякий раз, когда вы создаете папку внутри веб-приложений, она становится доступной как приложение.

Тем не менее, довольно легко обеспечить функциональность, используя Apache http перед вашим сервером Tomcat.

Используя mod_proxy в apache http, когда приложение tomcat не работает, tomcat возвращает http 503. Вам нужно только добавить строку ниже в ваш httpd.conf (или раскомментировать, если она уже есть) и создать downtime.html в данном случае) внутри вашей папки apache www (или htdocs). :)

ErrorDocument 503 /downtime.html
0 голосов
/ 14 ноября 2011

Мне нужна пользовательская страница для моего остановленного или временно неиспользуемого веб-приложения.Сначала я создал пользовательскую страницу ошибок и поместил ее в /srv/www/html/maintenance/report.html.Затем я создал собственный клапан, скомпилировал, запустил jared и поместил его в папку lib tomcats (6).

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 показывает страницу недоступной пользовательской службы, когда мое веб-приложение / отчет остановлено или не развернуто.

0 голосов
/ 17 ноября 2010

Не могли бы вы предоставить пользовательскую страницу с ошибкой (статус 500 или что-то еще, что сервер обычно возвращает, когда приложение не отвечает), и оно просто использует это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...