최근 어떤 사이트에서 jvmRoute 설정 관련한 일이 있었습니다. 물론 jvmRoute 야 server.xml 의 <Engine> 에서 추가만 해주면 되는 것이 아닌가, 하시는 분들도 계시겠지요.
이 요청을 좀 더 구체적으로 말하자면 OS 에서 hostname 값을 받아 동적으로 jvmRoute 에 넣고 싶다는 것이었습니다.
# hostname appsroot.com
쉽게 해결되지 않을 줄로 알았지만,
<Engine name="Catalina" defaultHost="localhost" jvmRoute="`hostname`">
이렇게 해보니 역시, 그냥 `hostname` 이 통으로 string 으로 인식되어 문제는 해결되지 않았습니다.
그래서 Tomcat 기동 환경에,
export HOST_NAME=`hostname`
을 넣은 후에
<Engine name="Catalina" defaultHost="localhost" jvmRoute="${HOST_NAME}">
이렇게 해보니 역시, 그냥 ${HOST_NAME} 이 통으로 string 으로 인식되어 또 다시 문제는 해결되지 않았습니다.
그래서 아예 Tomcat 소스를 확인해 보았는데, org.apache.catalina.core.StandardEngine 에서,
public StandardEngine() { super(); pipeline.setBasic(new StandardEngineValve()); /* Set the jmvRoute using the system property jvmRoute */ try { setJvmRoute(System.getProperty("jvmRoute")); } catch(Exception ex) { log.warn(sm.getString("standardEngine.jvmRouteFail")); } // By default, the engine will hold the reloading thread backgroundProcessorDelay = 10; }
System.getProperty("jvmRoute") 값을 jvmRoute 로 설정하는 것을 확인할 수 있었습니다. 실제 소스 상에서는 setJvmRoute() 에 의하여 jvmRouteId 가 설정됩니다.
그래서 아예 외부에서 jvmRoute 값을 먹여보기로 하였습니다. Tomcat 기동 스크립트의 JAVA_OPTS 를 이용하여 system property 를 추가합니다.
JAVA_OPTS=" ${JAVA_OPTS} -DjvmRoute=`hostname`"
그리고 Tomcat 재기동. 성공합니다.
마지막으로 만일 server.xml 에도 jvmRoute 를 설정하고, system property 에도 jvmRoute 를 설정하면 어떻게 될까요?
정답은 server.xml 의 jvmRoute 가 적용된다 입니다.