Thursday, July 02, 2009

JEUS서버에서 가우스 Filter관련 문제

예전 필립스 엘시디쪽 이슈 처리 내용...
 
증상은 소스 수정후, context가 reload된 이후 가우스 Filter가 정상동작하지 않고(Filter초기화 에러메시지가 출력됨), ClassCastException을 발생하는
 
경우의 해결 방법, Jeus서버 5를 사용하는 경우 아래와 같이 설정해주는게 좋다.
 
일단 JEUS에서 변경된 class를 auto reload하는 방법에는 두가지가 있습니다.
첫번째는    시간주기로 container에서 변경된 class를 체크하여 auto reload하는 방식이고
첫번째는    변경된 class에 요청이 왔을 때 auto reload하는 방식입니다
 
이러한 설정은
$JEUS_HOME/config/[nodename]/[nodename]_servlet_engine1/jeus-web-dd_[contextname].xml에서 할수 있으며
jeus-web-dd_[contextname].xml 파일을 열어보시면
 
….
<auto-reload>
            <enable-reload>true</enable-reload>                       --- 첫번째 방식 default 시간간격 : 300초
            <check-on-demand>true</check-on-demand>       --- 두번째 방식
</auto-reload>
….
위와 같이 auto-reload에 관한 설정을 보실 수 있습니다.
테스트시에도 변경된 class를 적용하신후, 바로 호출하였기 때문에 두번째 방법이 먼저 적용되었습니다.
 
두번째 방식(check-on-demand)은 다른 WAS에서는 사용하지 않는 방식으로, 개발자의 편의를 위해서
JEUS에 도입된 기술입니다. 그런데 이 방식의 알고리즘(원문 메시지 참고)상 servlet filter를 사용할 경우,
처음 호출시에는 호출한 servlet만 auto-reload되고 servlet filter는 auto reload되지 않기 때문에, 위와
같은 문제가 발생한 것 같습니다. (두번째 호출시에는 servlet filter 또한 auto reload되기 때문에 정상적으로
Hash code값이 바뀌어 나옵니다)
 
다른 WAS에서는 위와 같은 문제가 발생하지 않은 이유는 다른 WAS의 경우 첫번째방식만을 지원하고 있고
check하는 시간 간격이 짧기 때문에 위와 같은 문제가 발생하지 않는 것으로 추정됩니다.
 
=== 해결 방법 ===
jeus-web-dd_[contextname].xml의 <check-on-demand>를 false로 설정하시고
….
<auto-reload>
            <enable-reload>true</enable-reload>               
            <check-on-demand>false</check-on-demand>
</auto-reload>
….
 
$JEUS_HOME/config/[nodename]/[nodename]_servlet_engine1/WEBMain.xml에서
<web-container>태그 바로 하단에 <monitoring>/<check-class-reload>를 아래와 같이 설정하시면 됩니다.
(설정후 재부팅하셔야 적용됩니다.)
 
<web-container>
<monitoring>
                 <check-class-reload>2000</check-class-reload>
</monitoring>
……..
 
위와 같이 설정하였을 경우 2초(2000ms)간격으로 container에서 class reload된 것을 체크하겠다는 의미입니다.
시간 간격은 편하실 되로 적용하시면 됩니다.(최소값은 1초(1000ms)입니다)
 
위의 내용은 실제로 테스트를 한 내용으로 위와 같이 하고 동일한 테스트를 실행하면 hash code값이 class reload된후
재호출시에도 변경되어 나옵니다.

No comments: