최근 어떤 사이트에서 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 가 적용된다 입니다.