2014. 5. 9. 11:34
Tomcat Context Reloader
2014. 5. 9. 11:34 in 개발/자바
Tomcat의 컨텍스트를 reloadable=“false”인 상태에서, Tomcat Manager를 설치하지 않은 상태에서 수동 Reload 할 수 있는 Valve를 만들어 보았다. Reload Tomcat Context manually(without manager or reloadable=“true” option).
설정
- Tomcat Reload Valve 소스와 Jar 파일에서 tomcatreloadvalve.jar 파일을 $CATALINA_HOME/lib 로 복사한다.
- server.xml 혹은 context.xml의 <Context> 항목에 Valve를 추가한다. 항상 <Context> 항목에만 추가해야 한다.
<Context docBase="some" path="/some" reloadable="false" > <Valve className="kr.pe.kwonnam.tomcat.reloader.TomcatReloadValve"/> </Context>
- 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; } }