====== Tomcat Context Reloader ====== Tomcat의 컨텍스트를 reloadable="false"인 상태에서, Tomcat Manager를 설치하지 않은 상태에서 수동 Reload 할 수 있는 Valve를 만들어 보았다. Reload Tomcat Context manually(without manager or reloadable="true" option). ===== 설정 ===== * {{:java:tomcat:tomcatreloadvalve.7z|Tomcat Reload Valve 소스와 Jar}} 파일에서 tomcatreloadvalve.jar 파일을 $CATALINA_HOME/lib 로 복사한다. * server.xml 혹은 context.xml의 ** 항목**에 Valve를 추가한다. 항상 항목에만 추가해야 한다. * **reloadable="false"**로 둔다. 원래 이 Valve의 목적은 자동 Reloading을 끄고, 항상 수동으로 원하는 경우에만 Reloading하는 것이다. ===== 실행 ===== * 웹브라우저 혹은 wget 등으로 http://localhost:8080/**reloadContext** 를 호출한다. * 실제 URL의 도메인네임 부분은 자신의 톰캣 설정을 따른다. * "Context Reloaded!!" 메시지가 나오면서 Reloading이 완료된다. ===== 소스 ===== package kr.pe.kwonnam.tomcat.reloader; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.Container; import org.apache.catalina.Context; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.valves.ValveBase; /** * Reload Tomcat Context by requesting URL * * Context의 reloadable="false"인 상태에서도 /reloadContext URL을 호출하면 해당 컨텍스트가 Reloading 된다. * * @author 손권남 kwon37xi@gmail.com * */ public class TomcatReloadValve extends ValveBase { private static final String RELOAD_CONTEXT_URI = "/reloadContext"; @Override public void invoke(Request request, Response response) throws IOException, ServletException { Container container = getContainer(); String requestUri = request.getRequestURI(); String reloadUri = request.getContextPath() + RELOAD_CONTEXT_URI; if (requestUri.startsWith(reloadUri) && container instanceof Context) { reloadContext(response, container); return; } getNext().invoke(request, response); } private void reloadContext(Response response, Container container) throws IOException { ((Context) container).reload(); HttpServletResponse httpResponse = response.getResponse(); httpResponse.setContentType("text/plain;charset=utf-8"); httpResponse.getWriter().write("Context Reloaded!!"); httpResponse.getWriter().close(); return; } }