2010-11-17 5 views
1

J'ai développé une application Web qui est déployée dans Apache Tomcat.Il est nécessaire d'arrêter l'application sans arrêter Tomcat.Il peut être fait en utilisant la fonctionnalité de démarrage/arrêt fournie par le Tomcat manger. L'exigence est d'afficher une page web personnalisée (qui dit que l'application est en panne pour la maintenance) lorsque l'application web est arrêtée.Je veux savoir que tomcat faciliter pour faire cela en configurant le webxml dans catalina/conf ou par tout autre mécanisme.Can tout corps donner une idée .....Afficher une page Web personnalisée lorsque applicatino est arrêté

Répondre

1

Une question un peu ancienne mais je vais ajouter mes 2 cents car cela pourrait aider quelqu'un en bas de la piste. Je comprends que tout ce qui provient de Tomcat provient d'une application. Chaque fois que vous créez un dossier dans webapps, cela deviendra disponible en tant qu'application. Cela dit, il est assez facile de fournir la fonctionnalité en utilisant un http apache en face de votre serveur Tomcat. En utilisant mod_proxy sur apache http, lorsque l'application tomcat est arrêtée, tomcat renvoie un http 503. Il vous suffit d'ajouter la ligne ci-dessous à votre httpd.conf (ou de la décommenter si elle est déjà présente) et de créer un downtime.html (dans ce cas) dans votre dossier www apache (ou htdocs). :)

ErrorDocument 503 /downtime.html 
0

Pourriez-vous peut-être fournir une page d'erreur personnalisée (500 statut, ou tout ce que le serveur retournerait normalement lorsque l'application ne répond pas), et l'utiliser juste cette?

+0

mmmmm.Once Je configuré Tomcat pour afficher la page d'erreur personnalisée, il sera utilisé pour toutes les applications Web déployées dans le Tomcat, suis-je raison? Dans ce cas la page d'erreur devrait être plus générique. De toute façon pouvez-vous expliquer comment Tomcat est configuré pour afficher une page d'erreur personnalisée? –

0

Je voulais une page personnalisée pour ma webapp arrêtée ou temporairement non-déployée. J'ai d'abord créé une page d'erreur personnalisée et l'ai placée dans /srv/www/html/maintenance/report.html. Ensuite, j'ai créé une valve personnalisée, compilée, jared et l'ai mise dans le dossier lib de 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+"/"; 
    } 
} 

Au moins, je configuré matous 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> 

Maintenant montre tomcat un service personnalisé page non disponible, quand mon application web/rapport est arrêté ou non déployé.

Questions connexes