본 장에서는 JEUS 6.0 Fix#6에서의 버그패치, 기능추가, 변경사항에 대해서 설명한다.
AIX에서 IBM JDK 1.5 사용할 경우, JEUS를 종료할 때 멈추는 문제 수정
AIX에서 IBM JDK 1.5를 사용하여 JEUS를 사용할 때, web listener에서 nio를 설정하면 종료 과정에서 JEUS가 멈추는 현상이 있어 이를 수정하였다.
EJB 디플로이 과정 중 생성된 Impl 클래스를 컴파일할 때, Shared로 디플로이된 다른 모듈을 참조하지 못하는 문제 수정
EJB의 Bean 클래스가 특정 클래스를 extend해서 사용할 경우, 디플로이 과정에서 EJB impl 클래스를 컴파일할 때 extend한 클래스가 필요하다. 그런데 사용하려는 클래스가 이미 Shared로 디플로이된 다른 모듈에 존재할 경우 이를 참조할 수 있어야 하는데, 기존에는 이것을 참조할 수가 없어서 EJB Impl 파일을 컴파일할 때 에러가 발생하는 문제를 수정하였다.
MDB 디플로이 과정에서 ArrayIndexOutofBoundsException이 발생하는 문제 수정
MDB의 jeus-ejb-dd.xml 파일에서 <bean-pool> 설정이 pool-max < pool-min*2 로 설정된 경우, MDB를 deploy할 때 bean pool을 초기화하면서 ArrayIndexOutofBoundsException이 발생하는 문제를 수정하였다.
MDB bean-pool의 pool-min 값만큼의 요청까지 NullPointerException이 발생하는 문제 수정
부하 상황에서 MDB 수행 중에 bean-pool 의 pool-min 값만큼의 요청에 대해서 NullPointerException이 발생하는 현상을 수정하였다.
BMT SF의 method가 completes되기 전에 commit이나 rollback이 되지 않으면 현재의 트랜잭션을 suspend 시키도록 수정
BMT SF의 method가 completes되기 전에 commit이나 rollback이 되지 않고 method request가 종료되면 기존에는 그 처리를 TransactionManager에 일임하였기 때문에 강제로 RollBack되는 경우가 있었다. 이것을 변경하여 method request가 종료된 후에 Transaction suspend 시키도록 하였다. 그리고 강제로 RollBack이 발생할 경우, 다음과 같은 형태의 로그가 발생하도록 하였다.
[EJB-4264] [SF/BMT] marks rollback only for current transaction context [Transaction(0:192.168.110.50:10941:119:0x2e753c78:0x0)] because exception has been occured
<export-iiop>태그를 사용한 Bean을 Fast deploy 하려고 할 때 NullPointerException이 발생하는 문제 수정
jeus-ejb-dd.xml에서 <export-iiiop> 설정을 사용한 모듈을 Fast Deploy 하려고 할 때 디플로이 과정에서 NullPointerException이 발생하는 문제를 수정하였다.
클러스터링이 설정된 EJB를 lookup할 때 무한 루프가 발생하는 문제 수정
클라이언트가 클러스터링 설정이 지정된 EJB3.x의 인터페이스를 가지고 있지 않은 상태에서 해당 EJB를 lookup할 때 무한 루프가 발생하는 문제를 수정하였다.
URL의 디렉터리 뒤에 ";"가 붙을 경우 sendRedirect가 반복적으로 호출되는 문제 수정
URL의 중간 디렉터리명 뒤에 ";" 가 붙게 되면 ";" 이후를 parameter로 인식하게 되어 parameter 맨 뒤에 "/" 붙여서 sendredirect 하게 된다. 그리고 sendredirect된 페이지에서도 다시 URL마지막에 "/"를 붙여 계속 sendredirect 하게 되어 이 과정을 무한 반복하게 된다. 이를 해결하기 위해서 ";"앞, 즉 디렉터리명 뒤에 "/"붙이도록 하여 문제를 수정하였다.
isErrorPage가 설정된 JSP page를 호출하는 경우 NullPointerException이 발생하는 문제 수정
isErrorPage가 true로 설정된 JSP page를 직접 호출할 경우 Exception이 발생한 page에서 받아야 할 error status가 설정되지 않고 null이 설정되어 NullPointerException이 발생하는 문제를 수정하였다.
Default Encoding 설정으로 인한 Resource servlet의 한글이 깨지는 문제 수정
인코딩이 설정되지 않는 경우 디폴트로 인코딩을 ISO-8859-1로 설정하게 되어있는데, Resource servlet인 경우에도 ISO-8859-1가 설정이 되어 한글이 깨지는 문제를 수정하였다. Resource servlet의 경우에는 따로 인코딩을 설정하지 않는 것이 대부분이며, 브라우저에 설정된 인코딩을 사용한다.
HTTP 1.0 사용할 경우 서비스가 지연되는 문제 수정
HTTP 1.0 일 때 content-length가 없을 경우 FullBufferedAdaptor로 응답을 보내던 것을 BufferedAdaptor로 보내도록 수정하여 서비스(특히 대용량 파일 다운로드)가 지연되는 문제를 수정하였다. 다음의 옵션을 true로 설정할 경우에는 기존과 같이 content-length가 없는 경우에 FullBufferedAdaptor가 사용된다.
-Djeus.servlet.ensure.contentlength=true/false (defalut : false)
IBM JDK에서 JSP 파일을 컴파일할 때 발생되는 문제 수정
일반 JDK의 경우에는 classpath에 null이 포함되는 경우에도 컴파일은 정상적으로 되지만 IBM JDK에서는 컴파일이 되지 않는다. 이를 해결하기 위해 classpath에 null을 추가하지 않도록 수정하였다.
welcome file 처리할 때 query string에 인코딩이 적용되지 않아 한글이 깨지는 문제 수정
welcome file을 forwarding 방식으로 처리할 때 query string에 대한 인코딩 처리가 되지 않아 한글이 깨지는 문제를 수정하였다.
web module deploy 과정 중에 exception이 발생해도 디플로이되는 문제 수정
web module deploy 과정 중에 web.xml에 설정되는 security 설정에 문제가 있어서 exception이 발생할 때에도 strack trace만 출력되고 디플로이가 되는 문제가 있었다. 이를 security에서 exception이 발생하면 디플로이가 실패하도록 수정하였다.
error response의 경우 connection이 keep-alive 하지 않는 문제 수정
error response의 경우 connection이 keep-alive 응답을 하지 않아서 서비스가 지연되는 현상을 해결하기 위해, 특정 error status에 대해서 keep-alive하도록 문제를 수정하였다.
이런 현상이 발생하던 status는 400, 408, 411, 413, 414, 500, 503, 501 이다.
locale에 의한 request의 encoding 문제 수정
request url은 content-type 이전에 결정되므로 content-type의 charset이 적용되지 않아야 함에도 불구하고, request url encoding의 charset를 설정할 때 content-type 및 accept-language charset이 적용되는 문제를 수정하였다.
NIOHttpListener를 사용할 경우 request line을 읽을 때 ArrayIndexOutOfBoundsException 문제 수정
NIOHttpListener를 사용할 경우 request line을 1byte씩 읽어 byte array에 넣을 때 byte array의 index가 1024를 넘어서 ArrayIndexOutOfBoundsException가 발생하였다. 이를 request를 모두 읽었을 경우 requestLineCount를 초기화 함으로써 ArrayIndexOutOfBoundsException이 발생하지 않도록 수정하였다.
JEUS에서 WebtoB에 연결할 때 잘못된 WebtoB reply로 인해 OutOfMemoryException이 발생하는 문제 수정
JEUS에서 WebtoB에 연결할 때 등록을 위해 WebtoB로부터 reply를 받게 된다. 이때 정상적이지 않은 reply를 받게 되는 경우 OutOfMemoryException이 발생할 수 있다. 이를 해결하기 위해 WebtoB로부터 잘못된 reply를 받으면 Exception 처리하여 문제를 수정하였다.
JSF 2.0 구현체를 사용할 때 리소스 version 체크 기능 문제 수정
JEUS에서 JSF 2.0 구현체를 사용할 때 리소스 version을 체크하는 중에 호출하는 Method의 리턴값이 틀리면 "jsf.application.resource.unable_to_determine_resource_version." 경고를 보내고 리소스 찾을수 없다고 출력되는 문제를 수정하였다.
WebtoB 에서 보낸 요청이 처리 중일 때 JEUS가 SUSPEND를 보내지 못하는 문제 수정
WebtoB에서 JEUS로 보낸 요청이 처리 중일 경우에는 JEUS가 SUSPEND요청을 WebtoB에 보내지 못하는데, 이 경우 WebtoB가 블록으로 처리되지 않아 요청을 추가로 보낼 수 있는 문제가 있다. 이를 해결하기 위해서 요청 처리 중인 상태에서도 SUSPEND요청을 보내고 이 상태를 체크해서 RESUME이 될 때까지 대기하도록 수정하였다.
web.xml에서 web-app version check 문제 수정
JSF library loading을 위해 web.xml의 web-app version을 check할 때, comment까지 체크하지 않아 library loading하지 못하는 문제를 수정하였다.
클라이언트에서 Connection Close를 보낸 경우에도 Keep-Alive로 response를 보내는 문제 수정
클라이언트에서 header에 Connection close로 요청을 보낼 경우에도 JEUS에서는 항상 Keep-Alive로 response를 보내는 문제를 수정하였다.
jeus.ejb.cluster.useip 옵션이 반대로 적용되는 문제 수정
EJB stub을 생성할 때, 그리고 DynamicLinkReference를 이용하는 jms나 ejb에서 DynamicLinkReference 이름을 만들 때 별도의 설정이 없다면 호스트명을 이용해서 생성한다. 이것을 IP로 변경하려면 JEUS Manager와 Container에 다음과 같이 설정한다. 기존에는 이 옵션이 반대로 적용되는 문제가 있어서 이를 수정하였다.
-Djeus.ejb.cluster.useip=true
jeusadmin의 jndilist 명령어를 실행할 때, DynamicLinkReference의 정보가 중복되어 출력되는 문제 수정
jeusadmin에서 jndilist 명령어로 JNDI 정보를 출력할 때, 클러스터링 기능과 관련된 정보들이 중복 출력되는 문제를 수정하였다.
클러스터링 설정된 EJB 모듈을 Deploy하고 Undeploy 한 후에, 클러스터링 설정을 삭제하고 deploy하면 NameAlreadyBoundException이 발생하는 현상 수정
클러스터링 설정된 EJB 모듈을 undeploy하는 과정에서 JNDI Tree에서 기존의 정보를 제대로 삭제하지 못하여, jeus-ejb-dd.xml에서 모듈의 클러스터링 설정을 삭제한 후 다시 디플로이할 때 NameAlreadyBoundException이 발생하는 문제를 수정하였다.
jeusadmin에서 jndilist -con [container name]을 실행할 때, container local binding된 object를 확인할 수 없는 문제 수정
Local EJB처럼 JNSLocal인 Container에만 binding되는 object는 jeusadmin에서 jndlist 명령만 입력한 경우에는 확인할 수 없다. 그러나 jndilist 뒤에 -con [container name] 옵션만을 사용하는 경우, 혹은 -con [container name] [objectName] 옵션을 사용하는 경우에는 해당 object를 확인할 수 있어야 한다. 이 2가지 방법 중 -con [container name] 옵션만 사용하는 경우에 object를 확인할 수 없는 문제를 수정하였다.
check-query-period가 풀에 있는 모든 커넥션을 검사하지 않는 문제 수정
주기적으로 connection validation check가 이루어질 때, 풀에 있는 모든 커넥션이 검사가 되는 것이 정상동작이다. 하지만 기존에는 검사한 커넥션이 invalid할 때 validation check가 종료되어 결과적으로 하나의 커넥션만 줄어들게 되는 문제가 있어서 이를 수정하였다.
Connection.close()시에 에러 이벤트가 발생하면 통계 정보가 잘못되는 문제 수정
주기적으로 check-query를 시도하는 과정에서 실제 query는 성공한 이후에, query를 수행한 커넥션을 close할 때 에러 이벤트가 발생할 경우에 내부적으로 물리적 커넥션을 2번 close하여 current size값이 2번 감소되는 문제를 수정하였다.
WebAdmin을 통한 커넥션 반환 기능이 제대로 동작하지 않는 문제 수정
10개 이상의 커넥션을 한번에 모두 반환할때, 내부적으로 ID 리스트의 sort문제로 모두 반환이 되지 않던 문제를 수정하였다.
Runtime failure된 XA resource들에 대해 background thread에서 commit을 시도할 때, 일부 resource에 대한 commit이 성공하면 무조건 indoubt tx를 지우는 문제 수정
하나의 Transaction에 묶인 여러 개의 XA Resource 들에 대한 commit이 실패한 경우 이후에 background thread에서 계속 commit을 시도한다. 이때 일부 resource에 대한 commit 이 성공한 경우 indoubt tx 정보가 무조건 삭제되는 문제가 있었다. 이렇게 되면 다른 resource에 대한 commit 처리가 제대로 이루어지지 않을 수 있기 때문에 이를 수정하였다.
중앙식 세션 서버를 사용할 때 Memory leak이 발생하는 문제 수정
중앙식 세션 서버를 사용할 때 크기가 큰 세션을 invalidation시킬 경우에도 일정 크기의 메모리가 free되지 않아 Memory leak이 발생하는 문제를 수정하였다.
중앙식 세션 서버를 사용할 때 백업 되는 세션이 누락되는 문제 수정
중앙식 세션 서버를 사용할 때 백업하는 주기가 짧을 경우 부하 상황에서 백업이 누락될 수 있는 문제를 수정하였다.
JDK1.6을 사용했을 경우 object array를 deserialize할 때 ClassNotFoundException이 발생하는 문제 수정
JDK1.6을 사용했을 경우 object array를 deserialize할 때 ClassLoader.loadClass() 에서 ClassNotFoundException이 발생하는 문제를 수정하였다.
세션을 백업할 때 ConcurrentModificationException 발생하면서 BackupThread 죽는 문제 수정
IBM JDK에서만 발생하는 문제로, BackupThread에서 백업 데이터를 가져올 때 ConcurrentModificationException이 발생하게 되면 BackupThread가 죽으면서 그 이후에 백업이 진행되지 않는 문제를 수정하였다.
분산식 세션 서버 설정에서 nodename에 '-'이 들어있을때 deploy할 때 에러가 발생하는 문제 수정
기존 분산식 세션 서버는 엔진 ID와 세션 매니저 구분자를 '-'로 구분했다. 이럴 경우 분산식 세션 서버 설정에서 node name에 '-' 이 포함된 경우 엔진 ID와 세션 매니저 구분자를 '-'로 구분하지 못하는 발생하기 때문에 각 정보를 가지고 오는 방식을 변경하여 문제를 수정하였다.
분산식 세션 서버를 사용할 때 passivated session이 session-timeout 이후에 제거되지 않는 문제 수정
분산식 세션 서버를 사용할 때 passivation된 세션의 경우 session timeout이 지난 후에도 passivated session의 갯수가 줄어 들지 않는 문제를 수정하였다.
세션 클러스터링 환경에서 webtob 리스너 reconnet의 경우 발생하는 문제 수정
세션 클러스터링을 사용할 때 webtob 리스너가 reconnet 되면 그 세션에 대해서 lock을 잡게 되어, 이 후 같은 세션에 대해서 모두 lock에 걸리는 문제를 수정하였다.
세션 클러스터링을 사용할 때 webtob 리스너가 reconnet 되면 그 세션에 대해서 maxInactiveInterval을 변경하여도 변경된 값이 적용이 되지 않는 문제를 수정하였다.
jeusadmin에서 -per로 2개의 컨테이너에 각각 디플로이를 하게 되면 첫 번째 영구 모듈에 대한 application tag가 없어지는 문제 수정
jeusadmin 에서 2개의 container에 각각 영구 디플로이를 하게 되면 첫 번째 application tag가 JEUSMain.xml 에서 없어지고 마지막으로 수행한 디플로이 작업의 application tag만 남는 문제를 수정하였다.
JEUS schema를 parsing 하는 과정에서 "Invalid byte 1 of 1-byte UTF-8 sequence" exception 발생하여 deploy 실패하는 문제 수정
jeus-web-dd.xsd를 parsing 하는 중에 Exception이 발생하는 문제를 해결하기 위해서 JEUS schema validation을 하지 않는 옵션을 제공한다. 해당 system property는 다음과 같이 설정한다.
-Djeus.descriptorfile.validate-with-schema=false
jeusadmin에서 absolute path를 이용하여 deploy할 때, 해당 application file을 APP_HOME 으로 복사하는 현상 수정
jeusadmin에서 -absolute-path옵션을 이용해서 APP_HOME에 존재하지 않는 application을 여러 container에 deploy를 시도하면, 해당 application file을 APP_HOME으로 복사하는 문제를 수정하였다.
deploy/undeploy의 -n 옵션이 특정한 경우에 비정상 동작하는 문제 수정
jeusadmin의 deploy/undeploy 명령의 -n 옵션을 사용하면 JEUSMain.xml에 등록된 application의 target이 여러 container인 것을 반영하지 못하는 문제를 수정하였다.
JEUSMain.xml에 등록된 application이 name정보가 없을 경우 undeploy -n 사용했을 때 적합한 application을 찾지 못하는 문제를 수정하였다.
노드 클러스터링 환경에서 applicaton Deploy할 때 경로가 잘못 입력되는 문제 수정
각기 다른 머신 간에 노드 클러스터링 환경에서 application Deploy를 수행하면 JEUSMain.xml에 applicaton 경로가 잘못 입력되는 문제를 수정하였다.
JNDI Tree 페이지의 바인딩 정보를 잘못 생성하는 문제 수정
기존에 바인딩 정보의 클래스 이름을 항상 class java.util.Hashtable로 표시했던 문제를 바인딩하는 객체의 클래스 이름으로 표시하도록 수정하였다.
WebtoB 모니터링에서 새로 고침이 정상적으로 동작하지 않는 문제 수정
WebtoB 모니터링 화면에서 연결된 상태에서 새로고침 버튼을 누르면 기존의 연결이 해제가 되는 문제를 새로고침할 때 기존 연결이 있는 경우 쿠키의 wsracd port를 사용해서 새로 연결을 만들도록 수정하였다.
Exploded Application의 wsdl이 redeploy할 때 갱신 되지 않는 문제 수정
Exploded Application의 wsdl이 redeploy할 때 갱신이 되지 않아서 _published_wsdl_dir_ Directory를 삭제해야 새로운 wsdl이 반영되던 문제를 수정하였다.
XmlDataContentHandler의 mime type에 "charset"이 포함 될 경우 Exception이 발생하는 문제 수정
XmlDataContentHandler의 mimeType에 "charset"이 포함 될 경우(text/xml;charset=UTF-8) java.lang.IOException이 발생하는 문제를 수정하였다.
jeusadmin에서 start/stop 명령을 호출할 때, failed 상태가 되는 문제 수정
이미 start나 stop된 상태에서 StateManageableMBean에 대해 jeusadmin에서 같은 상태의 명령어(start/stop)를 호출할 경우에 failed로 변경되는 현상을 기존 상태를 유지하도록 하여 문제를 수정하였다.
JEUSMP listene가 unregister되는 문제 수정
JMXConnectorServer에서 socket option을 세팅하다 IOException이 발생해서 JEUSMP listener가 unregister되는 문제가 있었다. 이로 인해, console tool이 접속이 되지 않는 문제가 발생하였는데, 이와 같은 현상이 발생했을 경우 JMXConnectorServer를 stop하지 않고 client에서 다시 connection을 맺을 때까지 wait하도록 수정하였다.
web.xml의 security-constraint에서 설정하는 http-method에 소문자가 포함 될 경우의 문제 수정
web.xml의 security-constraint에서 설정하는 http-method 항목에 "GeT", "pOST", "head"와 같이 소문자가 포함되어 작성될 경우 동작하지 않던 문제를 수정하였다.
web.xml의 security-constraint에서 설정하는 url-pattern에 ":"이 포함 될 경우의 문제 수정
web.xml의 security-constraint에서 설정하는 url-pattern에 ":"이 포함되거나 runtime에 ":"이 포함된 url이 권한 check의 대상이 될 경우 java.lang.IllegalArgumentException이 발생하던 문제를 수정하였다.
Multi Thread에서 JNDI InitialContext로 login을 시도할 경우 응답하지 못하는 문제 수정
한번에 많은 요청을 할 경우 대부분의 Thread가 jeus.security.impl.network.SecurityConnectionListener#getReply()에서 서버의 응답을 받지 못해 기다리는 문제가 있다. 이를 해결하기 위해 하나의 Thread가 reply를 받을 때까지 sync를 보장하는 방식으로 수정하였다. 아래의 System property를 이용해서 Wait Time을 설정할 수 있다.
-Djeus.security.net.read-timeout=20000 (default 20초, 단위 ms)
IBM JDK에 IBM Policy files를 설치하지 않았을 경우 JEUS booting이 실패하는 문제 수정
IBM JDK에 IBM Policy files을 설치하지 않았을 경우 "jurification policy files are not signed by trusted signers" 에러가 발생 하면서 booting이 실패하던 문제를 수정하였다.
JEUS Instance에서 JeusDeploymentManager.getTargets()를 호출할 경우 NoPermissionException이 발생 하는 문제 수정
JEUS Instance에서 JeusDeploymentManager.getTargets()를 호출할 경우에 내부적으로 JeusDeploymentManager를 생성할 때 사용했던 Subject를 사용하지 않아서 NoPermissionException이 발생하던 문제를 수정하였다.
JEUS Security Manager를 사용할 경우 RMI를 사용했을 때 readonly permission error가 발생하던 문제 수정
JEUS Security Manager를 사용하는 경우 JEUS 내부적으로 static하게 저장된 PermissionCollection을 사용하게 되는데, RMI 에서 Class를 loading하는 경우 Permission 문제가 발생하는 현상을 수정하기 위해, PermissionCollection을 매번 호출될 때마다 새로 생성하도록 수정하였다.
Thread interrupt 지원
진행중인 request thread를 중단할 수 있는 기능을 제공한다. 사용자가 jeusadmin tool이나 WebAdmin을 통해 진행중인 request thread를 모니터링하고, 수동으로 interrupt 할 수 있도록 한다. JEUS내부적으로는 thread interrupt가 발생할 경우 thread에 interrupted status flag를 설정하고, 이것의 설정 여부에 따라 이후 operation이 일어날 경우 exception을 발생시켜서 작업을 중단할 수 있도록 동작한다.
다음과 같은 JDBC관련 operation할 때 interrupt로 인해 interrupted status가 set되어 있다면, SQLException("the current thread is interrupted")을 발생시킨다.
DataSource#getConnection() Connection operations (예: createCreatement) Statement operations (예: executeQuery)
다음과 같은 EJB 호출의 경우에도 interrupted status가 set되어 있다면 EJBException("the current thread is interrupted")을 발생시킨다.
EJBHome method를 호출할 때 EJB component business method를 호출할 때 remote, local 호출 모두에 해당
interrupted status는 exception이 발생한 이후에 unset되어 에러는 한번만 발생하며, 그 이후에 에러 처리와 같은 로직에서는 JDBC, EJB 호출이 정상적으로 처리된다. 부가적으로 JNDI를 호출할 때도 interrupted 되었다면 NamingException이 발생할 수 있다. 만약 thread interrupt가 발생했음에도 위와 같은 exception 처리를 하지 않기 원한다면 아래 System property를 false로 설정하여 사용한다.
-Djeus.server.check-interrupted-status=true/false (defalut : true)
자세한 설명은 “JEUS Server 안내서”의 “3.2.2. Thread 제어” 부분을 참조하기 바라며, jeusadmin과 WebAdmin을 통해 thread를 모니터링하고 interrupt하는 방법은 각각의 추가기능 설명서와 매뉴얼을 참고한다.
이 기능은 시그널을 받은 스레드의 일관성을 보장하지 못하므로, 시험적인 용도로만 사용하기를 권장한다.
primary/backup clustering 구성 중 primary node에서 backup node의 정보를 알 수 있도록 개선
primary/backup clustering 환경에서 primary node의 jeusadmin을 이용해 nodelist 명령어를 입력했을 때 backup node의 정보를 보여줄 수 있도록 하였다.
primary node를 종료하면서 backup node를 boot시킬 수 있는 기능 추가
primary/backup clustering 환경에서 기존에는 primary node가 정상 종료 되었을때에는 backup node가 boot 되지 않았으나, primary node를 종료할 때 jeusadmin의 down/jeusexit 명령어에 '-start-backup' 옵션을 추가하면 backup node를 boot 할 수 있는 기능이 추가되었다.
johan>jeusexit -start-backup backup node boot successfully johan jeusexit successful
log file rotation 기능 추가
log file이 특정 시간이나 특정 사이즈가 되면 기록중이던 file은 보관하고 새로운 파일에 계속 기록하는 log rotation 기능이 추가되었다. JEUSMain.xml에 <file-hanlder>에 설정하며, 작성 예제는 다음과 같다.
<system-logging> <level>FINE</level> <handler> <file-handler> <name>fileHandler</name> <enable-rotation>true</enable-rotation> <rotation-count>50</rotation-count> <valid-size>1024</valid-size> <append>false</append> </file-handler> </handler> </system-logging>
자세한 설명은 “JEUS Server 안내서”의 “제11장 Logging” 부분을 참조한다.
특정 IP를 통해서 들어오는 요청만 처리하는 기능 추가
JEUS를 운영하는 시스템에 여러 개의 IP가 존재할 때, 그 중 특정 IP를 통해서 들어오는 요청만을 JEUS가 받아들일 수 있는 기능을 추가하였다. 이 기능을 사용할 경우 JEUS Manager, Engine Container의 baseport, Web admin port, RMI port, JMS port, HTTP listener port 등은 모두 지정된 서비스 IP로만 listen한다.
전제 조건은 다음과 같다.
1. OS의 호스트 파일에서, 하나의 호스트네임에 한 개의 IP만 지정한다. |
2. real host name은 OS의 포스트 파일에 반드시 등록되어 있어야 합니다. 단, 이 경우 loopback address가 아닌 real ip를 지정해 준다. |
3. Windows의 경우, host 파일 수정 후 의도한 대로 동작하지 않는다면 시스템을 재부팅한다. |
이 기능을 사용하기 위해서는 우선 -Djeus.net.localip에 설정하려고 하는 IP를 지정해야 한다. 이후 JEUSMain.xml 파일에 다음과 같이 <listen-service-ip-only>태그를 true로 설정한 후 JEUS를 시작하면 해당 IP를 통해서 들어오는 요청만 JEUS가 받아들인다. 사용 방법은 다음과 같다.
<jeus-system> <node> <listener> <listen-service-ip-only>true</listen-service-ip-only> </listener> </node> </jeus-system>
System.out, System.err를 log format에 맞게 출력해 주는 기능 추가
JEUSMain.xml에 <log-stdout-to-raw-format> 설정을 추가하여 System.out, System.err으로 사용자가 출력한 내용을 JEUS의 log format에 맞게 출력할 수 있도록 하였다. <log-stdout-to-raw-format>의 기본값은 true이며, 이 기능을 사용하기 위해서는 해당 설정 값을 false로 설정해야 한다. 이 경우 다음과 같은 형태의 로그가 출력된다.
[2009.04.30 16:05:19][0][b214] [johan-10] [STDOUT] system out
JEUS 매니저와 컨테이너에 모두 설정할 수 있으며, 컨테이너에 독립된 설정이 없을 경우 매니저의 설정을 따른다.
같은 JVM에 디플로이된 EJB를 Local Call하는 기능 추가
JEUS에서 사용하는 EJB 모듈은 기본적으로 ISOLATED 클래스로딩 모드를 사용하는데, 이 경우 기본적으로 Remote call을 하도록 되어 있다. 이를 개선하여 동일한 컨테이너에 있는 EJB를 디플로이하는 경우에, EJB의 클래스로딩 모드에 상관없이 Local call을 사용할 수 있게 하였다.
이와 관련된 설정은 jeus-ejb-dd.xml에 설정하는 <local-invoke-optimize>, <local-invoke-only>, <call-by-value>의 3가지이다. 이 설정들을 이용하여 Local call을 가능하게 하는 방법은 다음의 3가지와 같다.
동일한 컨테이너에 ISOLATED 모드로 디플로이된 EJB를 호출하는 경우
동일한 컨테이너에 ISOLATED 모드로 디플로이된 EJB에 대하여 Local call를 호출하려는 경우 jeus-ejb-dd.xml 파일에 다음과 같이 <local-invoke-optimize>, <local-invoke-only>, <call-by-value>를 모두 true로 설정해주면 된다. ISOLATED로 디플로된 모듈에 대해서는 <call-by-value>를 false 로 지정하여도 설정이 적용되지는 않지만, 명시성을 위해서 <call-by-value>를 같이 true로 설정하는 것이 좋다.
<jeus-ejb-dd> <beanlist> <jeus-bean> .... <local-invoke-optimize>true</local-invoke-optimize> <local-invoke-only>true</local-invoke-only> <call-by-value>true</call-by-value> .... </jeus-bean> </beanlist> </jeus-ejb-dd>
동일한 컨테이너에 SHARED 모드로 디플로이된 EJB를 호출하는 경우
동일한 컨테이너에 SHARED로 디플로이된 EJB를 Locall call로 호출하려는 경우에는 call-by-value, call-by-rerefence 중 하나를 선택하여 사용할 수 있다. <call-by-value>를 true로 설정하면 EJB를 call-by-value로 호출하며, false로 설정하면 call-by-reference로 호출한다.
Call-by-value로 호출하려고 할 경우에는 <local-invoke-optimize>, <local-invoke-only>는 true로 설정해야 한다
[ Call-by-value로 호출하려는 경우]
<jeus-ejb-dd> <beanlist> <jeus-bean> .... <local-invoke-optimize>true</local-invoke-optimize> <local-invoke-only>true</local-invoke-only> <call-by-value>true</call-by-value> .... </jeus-bean> </beanlist> </jeus-ejb-dd>
Call-by-reference로 호출하려는 경우에는 <local-invoke-optimize>만 true로 설정하는 방법, 혹은 <local-invoke-optimize>, <local-invoke-only>는 true로 설정하고 <call-by-value>를 false로 설정하는 방법이 있다.
[ Call-by-reference로 호출하려는 경우 - <local-invoke-optimize>만 사용하는 방법]
<jeus-ejb-dd> <beanlist> <jeus-bean> .... <local-invoke-optimize>true</local-invoke-optimize> .... </jeus-bean> </beanlist> </jeus-ejb-dd>
[ Call-by-reference로 호출하려는 경우 - <local-invoke-optimize>, <local-invoke-only>, <call-by-value> 모두 사용하는 방법]
<jeus-ejb-dd> <beanlist> <jeus-bean> .... <local-invoke-optimize>true</local-invoke-optimize> <local-invoke-only>true</local-invoke-only> <call-by-value>false</call-by-value> .... </jeus-bean> </beanlist> </jeus-ejb-dd>
같은 EAR 파일에 존재하는 EJB를 호출하는 경우
같은 EAR 파일에 존재하는 EJB를 Local call로 호출하려는 경우의 사용법은 SHARED로 디플로이된 EJB 를 Local call로 호출하려는 경우의 사용법과 동일하다.
ajp13, TCP listener에도 IP 설정 기능 추가
한 대의 서버에 두 개의 IP가 할당되어 있는 특수한 경우, <ip> 태크에 설정된 IP가 우선적으로 적용되도록 기능이 추가되었다.
[ WEBMain.xml 설정 예 ]
<ajp-listener> ... <ip>112.223.334.445</ip> ... </ajp-listener> <tcp-listener> ... <ip>112.223.334.445</ip> ... </tcp-listener>
Tibero persistence store 지원
JEUS MQ에서 지원하는 persistence store는 journal store와 jdbc store가 있다. 이 중에서 oracle만 지원하던 jdbc store에 Tibero(Tibero 3.0 SP2 이상 버전)도 지원하도록 하였다. 설정 방법은 기존 방식과 동일하게 JEUSMain.xml에 설정한 Tibero data source의 이름을 다음 같이 JMSMain.xml에 설정한다.
[ JMSMain.xml 설정 예 ]
<persistence-store> <jdbc> <data-source>tibero_cpds1</data-source> </jdbc> </persistence-store>
자세한 설명은 “JEUS MQ 안내서”의 “5.3. 기본 설정(JMSMain.xml)” 부분을 참조한다.
커넥션 풀의 속성 동적 변경 지원
WebAdmin의 JEUS 매니저 리소스의 JDBC 관리 메뉴를 통해서 커넥션 풀 속성을 동적으로 변경할 수 있다. 다음의 속성에 대해서만 동적 변경이 가능하다.
기본 설정 : Auto Commit, Stmt Query Timeout, Action On Connection Leak
연결 풀 설정 : Delegation Dba, Dba Timeout, Check Query Class를 제외한 모든 속성
init-sql 기능 추가
커넥션을 생성한 뒤 가장 처음으로 sql을 수행할 수 있는 init-sql기능을 제공한다. 이 sql이 실패하면 생성된 커넥션을 close한다.
물리적 커넥션을 강제로 끊어주는 기능 추가
WebAdmin을 통해 관리자가 애플리케이션이 사용중인 커넥션들을 강제로 끊어 버릴 수 있다. 이 기능을 사용하는 datasource의 설정에 delegation-dba 설정이 되어 있다면 물리적 커넥션을 닫기 전에 먼저 session-kill 명령을 내린다. 이 기능은 주로 로컬 트랜잭션, 클로벌 트랜잭션, SQL 작업이 오래 걸릴 경우에 사용할 때 유용하다.
JEUS deploy ant task에 부가기능을 위한 attribute추가
JEUS deploy/undeploy ant task에 registeredAppName attribute를 추가하여 JEUSMain.xml에 등록된 application의 이름을 지정하여 deploy/undeploy할 수 있도록 하였다. registeredAppName attribute는 다른 attribute들과 함께 사용할 수 없다.
<target name="deploy" depends="init"> <deploy deployURI="deployer:Jeus:johan" registeredAppName="appName" user="administrator" password="jeusadmin"/> </target> <target name="undeploy" depends="init"> <modulecommand command="undeploy" registeredAppName="appName" deployURI="deployer:Jeus:johan" user="administrator" password="jeusadmin"/> </target>
JEUS deploy ant task에 permanentDeploy attribute를 추가하고, undeploy ant task에는 permanentUndeploy attribute를 추가하여, 각 attribute값이 true일 경우 영구 배포 및 영구 제거 기능이 동작하도록 하였다.
<target name="deploy" depends="init"> <deploy targetNames="${target.name}" deployURI="deployer:Jeus:johan" modulePath="C:\jeus6\webhome\app_home\appName" permanentDeploy="false" user="administrator" password="jeusadmin"/> </target> <target name="undeploy" depends="init"> <modulecommand command="undeploy" moduleName="appName" deployURI="deployer:Jeus:johan" targetNames="johan_container1" permanentUndeploy="true" user="administrator" password="jeusadmin"/> </target>
자세한 설명은 “JEUS Reference Book”의 “5.4. Deployment Ant Task” 부분을 참조한다.
jeusadmin deploy에서 context-root 설정 옵션 추가
jeusadmin에서 deploy할 때 application의 context-root를 지정하여 deploy할 수 있도록 context-root 설정 옵션이 추가 되었다. 사용법은 다음과 같다.
deploy [-context-root context-root_name] [application]
jeusadmin에서의 thread 모니터링 및 interrupt 지원(ti, interrupt-thread 명령어 추가)
ti(thread info) 명령어 개선
기존 servlet thread만 볼 수 있었던 ti 명령어를 개선하여 servlet과 EJB RMI thread 정보를 함께 보여주도록 하였다.
interrupt-thread 명령어 추가
특정 servlet/EJB RMI thread에 대한 interrupt를 수행할 수 있는 기능을 제공한다. 특히 interrupt-thread 명령을 사용할 때 시그널을 받은 thread의 일관성을 보장하지 못하므로, 시험적인 용도로만 사용하기를 권장한다. 이 명령어를 사용하면 다음과 같은 주의 메시지를 볼 수 있다.
WARNING: This function is EXPERIMENTAL yet. The target thread may throw an exception depending on conditions, and this might cause unconsidered complications if it's not handled well.
자세한 설명은 “JEUS Reference Book”의 “4.2.3.29. interrupt-thread” 부분을 참조한다.
jeusadmin에 strace 명령어 추가
jeusadmin에 servlet/EJB RMI thread의 stack trace를 보여주는 strace명령어를 추가하였다. 사용법은 다음과 같다.
strace [-con container_name] tid
자세한 설명은 “JEUS Reference Book”의 “4.2.3.28. strace” 부분을 참조한다.
jeusadmin에 status 명령어 추가
jeusadmin에 JEUSManager, EngineContaier, 그리고 <start-on-boot>가 true인 전체 EngineContainer들의 정상 부팅 여부를 확인할 수 있는 status 명령어가 추가되었다.
자세한 설명은 “JEUS Reference Book”의 “4.2.3. 공통 명령어” 부분을 참조한다.
jeusadmin에서 여러 개의 container를 옵션으로 지정할 수 있도록 개선
jeusadmin에서 deploy와 undeploy명령을 수행할 때 여러 개의 container를 옵션으로 지정할 수 있도록 개선하였다, container 구분자로 콤마(",")를 이용한다.
johan>deploy -con johan_container1,johan_container2 myApp.jar johan>undeploy -con johan_container1,johan_container2 myApp
jeusadmin의 applist, start, stop 명령도 위 기능을 사용할 수 있도록 개선되었다.
jeusadmin offline help 개선
jeusadmin의 offline help가 다음과 같이 개선되었다.
jeusadmin의 command help는 "jeusadmin -h help [help-options]" 일 때 보여준다.
jeusadmin의 console usage는 "jeusadmin" 또는 "jeusadmin -h" 일 때 보여준다.
옵션 없이 "jeusadmin -h help" 는 help명령어의 usage와 command 목록을 보여준다.
기존에 제공하던 "jeusadmin -h all", "jeusadmin -h <command>" 기능을 유지한다.
다음과 같이 입력한 경우 offline help를 확인할 수 있다.
jeusadmin <nodename> help [-l] [-a] [-g group_name] [command] jeusadmin <nodename> -U<id> -P<passwd> help [-l] [-a] [-g group_name] [command] jeusadmin <nodename> -U<id> help [-l] [-a] [-g group_name] [command] jeusadmin <nodename> -P<passwd> help [-l] [-a] [-g group_name] [command]
WebAdmin에서의 thread interrupt 지원
Servlet/EJB RMI Request thread에 대한 monitoring, interrupt를 할 수 있는 기능이 추가 되었다. 이 기능을 사용할 수 있는 페이지는 다음과 같다.
JEUS 모니터링 > 요청 스레드 모니터링 페이지에서 Servlet 과 EJB의 탭으로 구분되어 있으며, 각 엔진의 스레드를 모니터링 하거나 interrupt 시킬 수 있다.
서블릿 엔진 - Listener - 통계 탭 - 스레드 풀에서 서블릿 엔진의 스레드를 모니터링 하거나 interrupt 시킬수 있다.
EJB 엔진 - 통계 탭 - 스레드 탭에서 요청이 처리중인 경우에 EJB 엔진의 스레드를 모니터링 하거나 Interrupt 시킬 수 있다.
WebAdmin에서 JMS Resource 모니터링 기능 강화
WebAdmin에서 JMS Destination Resource 페이지와 JMS Client Resource 페이지의 모니터링 기능이 강화되었다.
JMS Destination Resource
엔진 컨테이너 > 엔진 > 리소스 > JMS > 데스티네이션의 JMS 데스티네이션 리소스 페이지에 전달된 메시지 수, 만료된 메시지 수, consumer 수, 사용 중인 메모리 항목이 추가되었다.
전달된 메시지 수 : 해당 데스티네이션에 도착한 메시지 중 메시지 수신자에게 전달을 완료한 메시지의 개수를 확인할 수 있다
만료된 메시지 수 : 해당 데스티네이션에 도착한 메시지 중 메시지 수신자에게 전달되기 전에 만료된 메시지의 개수를 확인할 수 있다.
consumer 수 : 해당 데스티네이션에 접속한 메시지 수신자의 개수를 확인할 수 있다(High는 과거 동시에 접속했던 최대치이며, Current는 현재 개수이다).
사용 중인 메모리 : 해당 데스티네이션이 메시지를 저장하기 위해 사용 중인 메모리 양을 확인할 수 있다. 단위는 KB이다(High는 과거 사용했던 최대치이며, Current는 현재 사용량이다).
JMS Client Resource
JMS 성능 개선 중 Facility MBean 제거와 관련하여 엔진 컨테이너 > 엔진 > 리소스 > JMS > 클라이언트의 JMS 클라이언트 리소스 페이지에서 클라이언트가 JMS 엔진에 맺은 connection 수를 보여주는 '연결' 항목은 제거되고 클라이언트가 연결된 시간을 보여주는 '연결 시간' 항목이 추가되었다. 기존의 연결 항목은 JMS Facility MBean 제거에 따라, 기존의 '연결' 항목은 해당 entry 이름을 선택하여 상세 정보에 보여지게 된다.
기능 추가에 따른 schema 추가
Active Timout Notification, thread-interupt-execution, restart-engine-execution schema 추가 : 서블릿 엔진 > ContextGroup > 웹 리스너 > 스레드 풀 페이지
JMS SSL schema 추가 : JMS 엔진 > 서비스 채널 > SSL 페이지
Listen port를 특정 IP address에만 binding 할 수 있는 설정 schema 추가 : JEUS 매니저 > 리스너 > 기본 설정 페이지
Init Sql schema 추가 : JEUS 매니저 리소스 > JDBC > 새 JDBC 데이터 소스 생성 > 3. 연결 풀 > 고급 선택사항 페이지
log-stdout-to-raw-format schema 추가 : 엔진 컨테이너 > 기본 설정 > 고급 선택사항 페이지
기능 추가에 따른 UI 추가
물리적 커넥션을 강제로 끊어주는 UI 추가 : 엔진 컨테이너 > 리소스 > JDBC > 연결 페이지
선택된 container , 현재 노드의 모든 container 에 대해 JDBC Connection Pool 을 생성하거나 재구성할 수 있는 UI가 추가되었다.
엔진 컨테이너 > 리소스 > JDBC 재구성 버튼 : 선택된 container의 connection pool을 재구성 한다
매니저 리소스 > JDBC 생성 버튼 , 재구성 버튼 : 현재 노드의 모든 container 에 대해 선택된 JDBC Connection Pool을 생성 또는 재구성한다.
WebtoB Block 기능 추가
WebtoBListener를 suspend/resume 할 수 있는 WebtoB Block 기능이 추가되었다. 다음의 페이지에서 해당 기능을 확인할 수 있다.
노드 트리 > 애플리케이션 모듈 디플로이 > 버전 관리를 통한 디플로이 > 고급 선택사항
container > 애플리케이션 모듈 > 리디플로이 > 고급 선택사항
application을 redeploy 할 수 있는 페이지 추가
기존에 jeusadmin에서만 가능하였던 application redeploy 기능이 WebAdmin에서도 가능하도록 redeploy 페이지가 추가되었다.
엔진 컨테이너 > 애플리케이션 모듈에서 모듈 선택 > 제어 > 리디플로이 페이지에서 해당 기능을 확인할 수 있다.
WS-Security에서 DSA 키를 통해서 전자 서명 및 전자 서명 검증을 할 수 있는 기능 추가
기존에는 WS-SecurityPolicy에 따라서 RSA 키를 사용해서 서명 및 검증을 하도록 되어있었으나, DSA 키를 가지고도 동일한 기능을 할 수 있도록 향상되었다.
DOM/SAX Parser 구현체 교체
JAXP 구현체를 SUN JAXP 1.4 에서 Apache Xerces Xalan 2.7.1 교체
추가된 libraries:
JEUS_HOME\lib\endorsed\xercesImpl.jar JEUS_HOME\lib\endorsed\xalan.jar JEUS_HOME\lib\endorsed\serializer.jar JEUS_HOME\lib\endorsed\resolver.jar JEUS_HOME\lib\endorsed\xsltc.jar
SUN JDK 1.5와 IBM JDK에서의 호환성을 위하여 JEUS_HOME\lib\endorsed\jaxp-api.jar, JEUS_HOME\lib\endorsed\jaxp-ri.jar는 계속 유지된다.
BCEL library Version 변경
BCEL library의 Version 이 5.0 rc1에서 5.2로 변경되었다.
Container base port가 BindException이 났을 때 발생하는 exception message 변경
Container를 시작하는 과정에서 base-port가 충돌할 경우 다음과 같은 형태의 메시지를 출력하도록 하였다.
Could not bind the baseport {0} which might be in use by another process. Please check this. If you want to change the port number, set <base-port> for this container
<node>에 설정한 로그 레벨을 <engine-container>에도 적용하도록 변경
<node>에서 설정한 로거의 로그 레벨이 하위 엔진 컨테이너에도 기본으로 적용되도록 변경하였다. 그러나 <engine-container>에 동일한 로거에 대한 레벨 설정이 존재할 경우에는 해당 설정이 우선 적용된다.
JEUS Manager와 Container가 시작할 때 생성하는 로그 변경
JEUS Manager와 Container가 시작할 때 생성하는 로그를 좀 더 직관적으로 표현하여 JEUS가 정의하고 있는 State를 알기 쉽게 표현하도록 로그를 수정하였다.
JEUS의 version.properties를 jeusversion.properties로 변경
IBM JDK 1.5 SR9의 jre\lib\ext\healthcenter.jar에 version.properties가 존재하는데, 이 파일이 JEUS의 version.properties 파일과 중복되어 부팅되지 않는 문제가 있었다. 이 문제를 해결하기 위해 JEUS에서 이 파일 이름을 jeusversion.properties로 변경하였다.
엔진 로거를 컨테이너에 설정하면 로그가 두 번씩 찍히는 현상 수정
JEUSMain.xml 에서 엔진 로거를 다음과 같이 컨테이너에 설정하면 로그가 두 번 찍히는 현상이 있었다.
<engine-container> <system-logging> <name>jeus.ejb</name> <level>FINE</level> </system-logging> </engine-container>
이와 관련하여 다음과 같이 관련 설정과 동작 방식을 변경하였다.
xml schema에서 <useParentHandler>의 기본값을 true로 변경한다.
지정된 로거에 대해서 handler 설정이 없을 경우에는, 독립된 handler를 생성하지 않는다.
useParentHandler=true는 상위의 handler를 사용할지 여부만 결정한다. 자신의 handler를 사용하는 것과는 별개로 동작한다.
useParentHandler를 false로 하고 자신의 handler설정이 없을 경우, JEUS가 useParentHandler를 true로 설정한다.
WebtoBListener에서 serverside-queueing을 사용하지 않도록 디폴트값 변경
WebtoBListener에서 serverside-queueing를 사용할 때 request 유실 문제가 발생할 수 있기 때문에, serverside-queueing을 사용하지 않도록 디폴트 값을 false로 변경하였다.
WebtoB가 기동되지 않은 상태에서 JEUS를 기동할 때 지연되는 현상 개선
WebtoB listener를 사용할 때 WebtoB가 boot되어 있지 않으면 JEUS에서 WebtoB 연결을 요청할 때 timeout이 발생할 때까지 JEUS의 booting 시간이 지연된다. 이 지연 현상을 해결하기 위해 WebtoB와의 연결 요청을 기존의 WebtoB request processor에서 WebtoB worker thread가 실행될 때 연결을 요청하는 것으로 변경하였다.
EL Library 버전 변경
JEUS에 포함되어 있는 EL 구현체는 binding한 객체의 타입 변환에 문제가 있어서, EL Library 버전을 1.0에서 1.1로 변경하였다.
Response 헤더의 Server정보를 표시하지 않도록 변경
보안상의 이유로 Response 헤더의 Server 정보를 표시하지 않도록 jeus.servlet.response.header.serverInfo 옵션 디폴트값이 ture에서 false로 변경하였다. 서버 정보가 필요한 경우 JEUSMain.xml의 command-option에 -Djeus.servlet.response.header.serverInfo=true 로 설정하면 기존과 같이 서버 정보가 Response 헤더에 표시된다.
JMS 성능 개선
물리적 connection을 공유할 수 있도록 개선
일반적으로(connection 생성 - session 생성 - producer 생성 - message 전송 - connection 종료) 패턴으로 메시지를 보내는데, 이는 매번 새로운 물리적 connection을 맺어야 하는 경우에는 성능 저하 뿐만 아니라 안정성도 저하되기 때문에, 물리적 connection을 공유할 수 있도록 개선하였다.
Client Facility pooling 기능 지원
위의 물리적 connection과 관련하여 client facility들(connection, session, porducer)을 반복적으로 생성하는 경우 성능에 영향을 미칠 수 있다. producer를 사용하는 경우에 Client Facility pooling 기능을 지원하도록 하였다. consumer나 transaction 등이 사용될 경우에는 pooling을 하지 않고 사용되었던 client facility들은 closed할 때 바로 제거하도록 하여 성능을 개선하였다.
Facility MBean제거
client facility (connection, session, porducer)들의 MBean을 생성하는 시간이 오래 걸리므로 생성하지 않도록 한다. 이에 따라, jmsadmin과 WebAdmin을 통해 entryall과 entry 정보가 보여지는 방식이 변경되었다.
기본값 변경
JMSMain.xml의 destination의 max-pending-limit 기본값을 8192로 변경(변경 전 : 2147483647)
JMSMain.xml의 journal persistence store의 initial-log-file-count 기본값을 5로 변경(변경 전 : 2)
JMS 클라이언트에서 NIO 사용하도록 변경
-Djeus.jms.client.use-blocking-socket=true (default : true)
자세한 설명은 “JEUS MQ 안내서”의 “2.3. 커넥션과 세션” 부분을 참조한다.
SSL 지원
JMS에서는 통신 레벨에서의 보안을 위해 서비스 채널에 Secure Socket Layer를 사용할 수 있도록 지원하고 있다. 이전 버전에서는 network layer 측에 nio SSL에 버그들이 있어서 JMS SSL 기능을 제한해두었었는데 이번 버전부터 해당 기능을 지원하도록 변경되었다. blocking, non-blocking에서 모두 SSL을 지원한다. SSL을 사용하기 위한 필요한 파일들과 설정하는 방법은 다음과 같다.
keystore, truststore file 생성
SSL을 사용하기 위해 서버와 클라이언트를 설정할 때, keystore, truststore 정보가 필요하기 때문에 해당 파일을 생성해 주어야 한다.
서버 설정
SSL을 사용하기 위해서는 <use-ssl>을 true로 설정해야 한다. 또한 SSL 통신에 필요한 ssl-configuration에 대해 설정한다. blocking, non-blocking에서 모두 SSL을 지원하기 때문에 blocking-socket 설정은 원하는 설정을 사용하면 된다.
< JMSMain.xml 설정 예 >
<service-config> <name>SSL_SERVICE</name> <server-address>127.0.0.1</server-address> <port>19741</port> <blocking-socket>true</blocking-socket> <use-ssl>true</use-ssl> <ssl-configuration> <protocol>TLS</protocol> <key-store-type>JKS</key-store-type> <key-store-file>C:\JEUS_HOME\config\keystore</key-store-file> <key-store-pass>changeit</key-store-pass> <key-management-algorithm>SunX509</key-management-algorithm> </ssl-configuration> <connection-timeout>1000</connection-timeout> <client-keepalive-timeout>10</client-keepalive-timeout> </service-config>
클라이언트 설정
클라이언트에서는 JVM 옵션으로 SSL 설정할 수 있다.
-Djeus.jms.ssl.protocol=TLS -Djeus.jms.ssl.keystore.type=JKS -Djeus.jms.ssl.keystore.passphrase=changeit -Djeus.jms.ssl.keystore.file=C:\JEUS_HOME\config\keystore -Djeus.jms.ssl.keymanagement.algorithm=SunX509 -Djeus.jms.ssl.truststore.type=JKS -Djeus.jms.ssl.truststore.passphrase=changeit -Djeus.jms.ssl.truststore.file=C:\JEUS_HOME\config\truststore -Djeus.jms.ssl.trustmanagement.algorithm=SunX509 ...
자세한 설명은 “JEUS MQ 안내서”의 “5.4. 고급 설정” 부분을 참조한다.
Service Channel의 port 설정을 하지 않거나 0으로 설정한 경우, JEUS 엔진 컨테이너의 Base Port를 사용하도록 변경
JMS service channel의 service config 절에서 다음과 같이 port를 설정하지 않거나 0으로 설정한 경우 JEUS 엔진 컨테이너의 base port를 사용하도록 변경되었다. 이전 버전에서는 port를 설정하지 않거나 0으로 설정한 경우 any port를 사용하였다.
< JMSMain.xml 설정 예 > port를 설정하지 않을 경우
<service-config> <name>jmstest</name> <blocking-socket>false</blocking-socket> <client-keepalive-timeout>10</client-keepalive-timeout> </service-config>
< JMSMain.xml 설정 예 > port를 0으로 설정할 경우
<service-config>
<name>jmstest</name>
<port>0</port>
<blocking-socket>false</blocking-socket>
<client-keepalive-timeout>10</client-keepalive-timeout>
</service-config>
자세한 설명은 “JEUS MQ 안내서”의 “5.3. 기본 설정(JMSMain.xml)” 부분을 참조한다.
jeus-ejb-dd.xml의 trans-attribute가 Required일 경우에만 max-messages가 적용되도록 변경
mdb의 max-messages값은 consumer에 메시지가 max-message만큼 쌓이게 되면 mdb를 호출하여 성능을 향상 시킬수 있는 설정이다. 그런데 trans-attribute가 Required가 아닌 경우 적용되면 acknowledge처리가 느려져서 OutOfMemoryError를 발생시킬 수 있기 때문에, trans-attribute 가 Required 일 경우만 max-messages가 적용되도록 변경하였다.
XAResource.end()에서 에러가 발생할 경우, TM이 선택적으로 rollback처리하도록 변경
XAResource.end()를 호출할 때 에러가 난 경우에 XAException을 받은 트랜젝션 매니저(TM)는 rollback을 수행하도록 변경하였다.
JDBC 커넥션 풀에서는 XAResource.end()가 실패할 경우 항상 XAException을 던지도록 변경하였으며, 기존 동작으로 동작하기 원한다면 엔진 컨테이너의 command-option에 다음과 같이 System Property를 설정한다.
-Djeus.jdbc.ignore-xa-end-error=true (default : false)
JDBC관련 모든 MBean을 internal한 위치로 변경
JDBC관련 MBean들 중 stats정보를 제공하는 method 이외에는 모두 internal한 위치로 옮겼다. 애플리케이션에서 커넥션 풀의 통계 정보를 얻어오고 싶다면 다음의 예제를 참고하여 작성한다.
import javax.management.j2ee.statistics.*; .... JDBCStats jdbcStats = (JDBCStats) jdbcResourceMBean.getstats(); for (JDBCConnectionPoolStats cpStats : jdbcStats.getConnectionPools()) { if (connectionPoolName.equals(cpStats.getJdbcDataSource())) { long idleCount = cpStats.getFreePoolSize(); long poolCount = cpStats.getPoolSize(); long activeCount = poolCount - idleCount; ...... } }
Transaction 로그를 독립된 디렉터리에 남길 수 있도록 변경
<tm-config><tx-log-dir>을 지정하여 Tx로그를 독립된 디렉터리에 남길 수 있도록 하였다. 시스템 옵션으로 jeus.log.home이 같이 지정된 경우, xml 로 설정한 내용이 우선 적용된다
세션 deserialization 때 Error가 발생한 경우 로그를 남기도록 변경
세션을 deserialization을 할 때, ClassNotFoundException과 같은 Exception이 발생 할 경우 로그에 Stack trace와 함께 출력되도록 변경하였다.
Application에서 invalidate가 사용되는 코드 위치 추적 가능하도록 로그 변경
JEUS log level이 FINEST일 경우 Application에서 session을 invalidate 시킬때 에러를 발생시켜 그 위치를 추적할 수 있게 하는 로그가 남도록 변경하였다.
세션의 시간 정보만 변경된 경우에도 backup session server로 시간 정보를 업데이트 하도록 변경
check level을 set으로 한 상태에서, 반복적으로 getSession()이나 setMaxInactiveTime() 만을 호출하는 경우에는 시간 정보가 업데이트되지 않아서 backup session server로 remove-to에 의해 세션이 지워지는 문제가 발생할 수 있다. 이 문제를 해결하기 위해 세션 서버에서 백업 서버로 시간 정보만 업데이트 하도록 변경하였다.
세션 클러스터링 환경에서 WebSession을 사용할 때 readlock를 잡지 않도록 변경
세션 클러스터링 환경에서 WebSession을 사용할 때 readlock을 잡고 사용하게 된다. 이때 같은 세션에 대해서 RequestProcessor를 사용하고 있으면 readlock을 잡게 되는데 해당 프로세싱이 길어지게 되면 같은 세션에 대해서 요청처리가 끝날때까지 다른 스레드들이 기다리게 되기 때문에 Websession을 사용할 때 readlock를 잡지 않도록 변경하였다.
jclient.jar에 jeusmp.jar, jmxremote.jar를 포함하도록 변경
JEUS_HOME\lib\client\jclient.jar에 jeusmp.jar와 jmxremote.jar를 포함시켰다.
auto-deploy directory 체크를 directory의 시간이 변경되었을 경우에만 하도록 변경
기존에는 파일의 추가,삭제에 따른 리스트를 비교하여 디플로이 또는 언디플로이를 수행하던 방식에서 디렉터리의 last modified time의 갱신여부를 확인하여 Task를 수행하는 것으로 변경되었다.
jeus-main.xsd에서 <application> 하위의 <absolute-ejb-jar>, <absolute-jeus-ejb-dd> 제거
JEUS4.X에는 ejb-jar.xml , jeus-ejb-dd.xml이 EJB Engine 안에 있었는데, JEUS5.X, 6.X에는 APP 에 해당 xml 파일이 들어가므로 jeus-main.xsd에서 불필요한 스키마이기 때문에 deprecated 되었다.
jeusadmin의 deploy/undeploy -n 옵션을 사용할 경우 다른 옵션은 사용하지 못하도록 변경
jeusadmin의 deploy/undeploy명령어에서 -n옵션이 설정되면 다른 옵션은 넣을 수 없도록 수정하였다. -n옵션은 JEUSMain.xml에 등록된 application의 정보를 가지고 동작하기 때문에 다른 옵션과 함께 사용되어야 할 이유가 없다.
jeusadmin의 resyncds 명령 deprecation
jeusadmin의 resyncds명령과 tmresync 명령이 중복되므로, resyncds명령은 deprecated하고, tmresync명령의 recover동작을 현재 XAResource에 대해 recover하도록 하였다.
jeusadmin의 reconfigds 명령의 동작 변경
jeusadmin의 reconfigds 명령을 통해 user/password 를 세팅할 수 있는 기능을 없애고, 커넥션 풀의 min/max를 임시적으로 조정할 수 있는 기능만 제공하도록 변경하였다.
WebAdmin 성능 향상
초기화 수행 및 리소스 최적화를 통해 좀 더 빠르게 로그인이 되도록 성능이 향상되었다.
JEUS 모니터링에서 스레드 풀 모니터링 페이지 변경
기존에는 매니저의 스레드 정보만 보여주던 방식에서 각 컨테이너의 스레드를 모니터링 할 수 있도록 변경되었다.
애플리케이션 디플로이의 버전관리 기능방식 변경
기존에는 Deploy된 모듈만 버전관리 대상이었지만, 모듈이 Deploy 되지 않은 상태에서도 버전관리 대상으로 등록되도록 변경되었다.
서블릿 컨테이너 및 ContextGroup의 access log level 설정 제거
서블릿 엔진의 컨텍스트 그룹의 access log 레벨 설정 항목 삭제 Servlet Engine - Context Group의 access-log 설정에서 Level 항목이 삭제되었다. access-log는 기본적으로 INFO를 기준으로 log 여부만을 설정함으로, 상세한 Level 설정은 의미가 없다. 따라서 xml schema 및 WebAdmin의 access log 레벨 설정 항목이 삭제되었다.
JEUS 매니저 제어의 Boot / Down에 대상이 되는 Container 표시 변경
매니저 제어의 Boot / Down에 대상이 되는 Container만 표시하고 대상 Container가 없는 경우에는 선택항목에 표시하지 않도록 변경되었다.
페이지를 호출할 때 에러가 발생한 경우 Loading 이미지를 종료하도록 변경
JEUS가 종료되었음에도 WebAdmin에서는 Loading 이미지가 뜨기 때문에 서비스 종료를 알 수 없는 문제가 있어서 에러가 발생했을 때 Loading 이미지를 띄우지 않도록 변경되었다.
MBean 모니터링 기능 변경
MBean 모니터링의 Operation을 호출했을 때 반환값 표현기능 변경
Operation의 처리 결과 값이 parameter가 있는 경우에만 호출됐으나, 현재는 parameter 가 없는 함수도 호출이 가능하다. 그리고, MBean operation 의 함수가 호출된 후 결과 값이 '반환값' 형태로 표시된다.
MBean Tree의 Node를 클릭하면 해당 Node의 Focus를 잃지 않도록 하여, 현재 보여지는 MBean 정보 Page의 경로를 보여준다.
MBean 모니터링 페이지에 웹 브라우저의 뒤로가기 기능이 지원된다.
매니저의 JMX 설정이 어댑터와 커넥터 탭으로 구분
JMX Remote API에서는 Connector와 Adaptor를 구분하고 있으나, WebAdmin에서는 모두 '어댑터'라는 탭으로 관리하고 있어서 UI 및 도움말 등에서 기능 구분이 명확하지 않기 때문에 어댑터와 커넥터 탭으로 구분되어 보여지도록 변경되었다.
명령 실행 후 팝업창 형태의 변경
명령 실행 후 기존 브라우저별 alert 방식을 사용하던 방식에서 일정한 디자인의 팝업창으로 보여지도록 변경되었다.
콘솔툴에서 System.exit() 코드 삭제
Ant에서 Task로 호출할 때 전체 Ant Script가 종료될 가능성이 있기 때문에 WebService관련 콘솔 툴에서 System.exit() 코드를 삭제하였다.
StAX Parser 교체
StAX Parser를 SUN JSXPS에서 CodeHaus WoodStox(3.2.8)로 교체하였다.
추가된 libraries : JEUS_HOME\lib\system\woodstox.jar
공개되는 public MBean interface와 internal MBean 분리
MBean은 외부에 노출이 될 경우 기존에 있던 것을 쉽게 수정할 수 없고, 내부적으로만 사용되어야 하는 것을 수정하는데에도 어려움이 생기기 때문에, public MBean과 internal MBean을 분리하여 public MBean에 관해서만 javadoc형태로 외부에 노출하도록 한다. 따라서 internal MBean을 사용할 경우 하위 호환성을 보장하지 않는다.
파일 변경 내역
JEUS_HOME\bin
- 추가 : upgradetool4to6 (.cmd), upgradetool5to6 (.cmd)
- 삭제 : upgradetool (.cmd)
JEUS_HOME\lib\schemas
- 삭제 : security.xsd, subjects.xsd, ws-config.xsd, ws-main.xsd
JEUS_HOME\lib\licenses
- 추가 : resourceaccelerate.txt, custom_rhino.txt, woodstox.txt
- 삭제 : jcommon.txt, jfreechart.txt
JEUS_HOME\lib\system
- 추가 : woodstox.jar, SharedLibrary 파일 (windows x64, sunos x64)
- 삭제 : jeus-services.dll, COMProvider.dll
JEUS_HOME\endorsed
- 추가 : jaxp-api.jar, resolver.jar, serializer.jar, xercesImpl.jar, xsltc.jar, xalan.jar