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