본 장에서는 JEUS6 Fix#4에서의 버그패치, 기능추가, 변경사항에 대해서 설명한다.
반납된 MDB 빈을 제거하는 과정에서 Session이 제대로 닫히지 않는 문제 수정
MDB을 사용할 때 반납된 빈의 갯수가 pool의 최대값을 넘을 때 pool에 넣지 않고 바로 제거하게 되는데, 이 과정에서 JMS Session을 Close해주지 않는 문제를 수정하였다.
동일한 context path를 가진 application을 deploy할 경우 기존 application 동작하지 않는 문제 수정
application을 deploy하고 동일한 context_path를 가진 war를 추가로 deploy할 경우 기존에 deploy된 application이 동작하지 않는 문제를 수정하였다.
reverse proxy 사용할 때 javascript의 empty string 부분이 "/"로 rewrite 되는 문제 수정
reverse proxy 사용할 때 javascript의 document.write('<img src="' + url + '"'); 과 같은 코드에서 ""(empty string) 부분이 "/"로 rewrite 되는 문제를 수정하였다.
reverse proxy 사용했을 경우 META Tag의 redirect 시에 url rewrite가 안되는 문제 수정
reverse proxy 사용했을 경우 META http-equiv=REFRESH content="num;URL= "를 이용한 redirect 시에 url rewrite되지 않는 문제를 수정하였다.
JSP cache가 정상동작 하지 않는 문제 수정
JEUS WebCache 기능이 정상적으로 동작하지 않는 문제를 수정하였다.
-Djeus.prepend.classpath로 등록한 classpath가 jsp compile할 때 추가되지 않는 문제 수정
-Djeus.prepend.classpath 옵션을 통해 jeus.jar보다 먼저 로드된 클래스들이 jsp compile할 때 classpath로 추가되지 않는 문제를 수정하였다.
HTTP|TCP Listener에서 max-idle-time만 설정했을 때 active thread가 idle time에 걸리는 문제 수정
HTTP 또는 TCP Listener에서 thread-pool 설정할 때 max-idle-time만 설정하고 max-thread-active-time을 설정하지 않으면 active thread 임에도 불구하고 idle time 체크에 걸리는 문제를 수정하였다.
context를 호출할 경우 context 뒤에 "/" 붙이지 않으면 NullPointerException이 발생하는 문제 수정
context를 호출 할 경우 context 뒤에 "/"이 없는 경우에 "/"을 붙여 send redirect 하게 되는데, 이때 reqeust 초기화 부분에 문제가 있어서 NullPointerException이 발생하던 문제를 수정하였다.
JMS 클라이언트가 connection failove를 시도할 때 새로운 entry가 생성되는 문제 수정
JMS 서버와 클라이언트 간에 네트워크가 단절되었을 경우, 초기 connection 시 entry 정보와 reconnection 후의 entry 정보가 서로 일치하지 않아서 connection failover 가 이루어지지 않던 문제를 수정하였다.
다른 context를 include한 경우 session이 변경되는 문제 수정
RequestDispatcher의 include를 통해 다른 context의 서블릿을 include한 후 원래 context에서 생성한 세션이 변경되는 문제를 수정하였다.
shared가 false이고 context-path가 "/" 일 경우 context 아래의 요청에 대해서 세션이 공유되지 않는 문제 수정
application의 context-path가 "/"이고 shared 값이 false일 때 context 루트("/")에서 생성된 session들과 context 하위의 디렉터리(예를 들어 "/test/")에서 생성된 session들이 공유되지 않는 문제를 수정하였다.
disposable connection을 생성할 때 행 현상이 발생하는 문제 수정
disposable connection 생성이 오래 걸리는 경우 pool에 대한 operation시 행이 걸리는 문제를 수정하였다.
max-use-count오류 수정
max-use-count 체크가 잘못되어 있어서 사용할 때 설정된 값보다 1만큼 더 사용하는 문제를 수정하였다.
Statement caching을 사용하는 경우 close이후에도 PreparedStatment가 사용 가능한 문제 수정
일반적으로는 logical connection이 close되면 관련 statement들도 같이 close되기 때문에 그 이후에는 PreparedStatement를 사용하면 에러가 발생하게 되어 있는데, statement caching을 사용할 경우에는 close이후에도 PreparedStatement를 사용할 수 있었던 문제를 수정하였다.
Statement.getConnection()수행할 때 driver logical connection을 넘겨주는 문제 수정
JeusConnection에서 생성한 Statement(PreparedStatement, CallableStatement)의 getConnection()을 호출하면 JeusConnection wrapper object가 아닌 JDBC driver logical connection을 얻을 수 있는 문제를 수정하였다.
Oracle XADataSource를 사용하는 경우 DDL generation을 사용할 때 에러가 발생하는 문제 수정
persistence.xml 파일에서 Oracle XADataSource를 사용할 경우 toplink.ddl-generation 프로퍼티를 지정하면 ORA-02089: COMMIT is not allowed in a subordinate session 에러가 발생하는 문제를 수정하였다.
manager process가 down되었을 경우 해당 manager로부터 creation된 engine container의 자동 down기능 제공
컨테이너에서 매니저의 상태를 체크하여 매니저가 불완전할 경우 engine container를 자동으로 down하는 기능을 추가하였다.
자세한 설명은 “JEUS Server 안내서”의 “제1장 소개” 부분을 참조한다.
Baseport에서 다양한 프로토콜을 받아들일 수 있는 기능을 추가
Baseport에서 여러 프로토콜을 받아들일 수 있는 기능을 추가하여 WebAdmin 접속 및 RMI 서비스 제공을 Baseport를 통하여 제공할 수 있도록 하였다.
이와 관련하여 Baseport 에서 각 프로토콜을 처리하기 위해서 대기하는 시간을 정의할 수 있다.
다음과 같이 JEUSMain.xml에 설정할 수 있으며 기본값은 30000이고 단위는 ms(milli-second)이다.
<jeus-system> <node> <listener> <read-timeout>30000</read-timeout> </listener> </node> </jeus-system>
Ajp13 Listener에 read-timeout 설정 기능 추가
Ajp13 Listener에 read-timeout을 설정할 수 있는 기능을 추가하였다.
<command-option> -Djeus.servlet.engine.ajp13readtimeout=10000 </command-option>
resource access의 경우 processSendFile 기능 추가
NIO의 경우 -Djeus.servlet.resource.processsendfile 옵션을 사용할 때 processSendFile 기능을 추가하였다.
processSendFile기능은 Resource file을 access할 때 file channel에서 socket channel로 file의 내용을 direct로 전달할 수 있게 하는 기능이다.
blocking I/O Http Listener에서 AsyncServlet을 사용할 수 있도록 기능 추가
기존에 NIO Http Listener(<use-nio> true</use-nio> 설정)에서만 AsyncServlet을 사용할 수 있었지만, blocking I/O Http Listener에서도 AsyncServlet을 사용할 수 있도록 기능을 추가하였다.
sql trace기능 추가
SQL 문장을 로그 또는 관리 툴을 통해서 볼 수 있도록 하는 기능을 추가하였다. 이 기능은 각각의 Statement 객체를 Wrapping해야 하기 때문에 애플리케이션에서 드라이버의 Statement 객체를 casting해서 사용할 경우에는 이 기능을 사용할 수 없다. jeus.jdbc.sql logger의 레벨을 FINE으로 설정해야 한다.
<connection-pool> <use-sql-trace>true</use-sql-trace> </connection-pool>
자세한 설명은 “JEUS Server 안내서”의 “8.3.4. Connection Pool 설정”의 "SQL Trace" 부분을 참조한다.
use-count정보 추가
물리적 커넥션이 사용된 횟수를 의미하는 use-count정보를 항상 기록하도록 하였다. 이는 jeusadmin의 dsconinfo명령을 사용하면 확인할 수 있다.
appcompiler 개선
appcompiler의 개선하고 옵션을 정리하였다. 개선 후의 usage는 다음과 같다.
usage: appcompiler [-h] [-verbose] [-keep] [-jspmap] [-batch] [-client clientview_filename] [-noaddfile] [-ejb-jar ejb-jar.xml_path] [-jeus-ejb-dd jeus-ejb-dd.xml_path] [-D<property=value>] [-properties=<filename>] [application_file_or_directory_name]
주요 변경사항
-batch 옵션이 추가되었다. 기존의 -Djeus.ejb.compiler.mode=batch와 기능은 동일하다. 옵션을 사용하지 않으면 생성된 java 파일을 각각 compile 한다.
-noaddfile 옵션이 추가되었다. -client 옵션이 존재할 경우에만 사용할 수 있으며, 함께 사용하면 generated class들을 application에 추가하지 않는다.
-client 옵션의 동작이 변경되었다. clientview filename은 jar 확장자를 가진 파일 이름이어야 한다. 이 파일에 client stub 파일이 생성되며 기존에는 EAR일 경우, EAR 파일 안에 생성되었지만 이제는 EAR 외부에 주어진 파일 이름으로 생성된다.
-D 옵션과 -properties 옵션을 이용하여 system property 값을 설정할 수 있다.
자세한 설명은 “JEUS Reference Book”의 “4.4. appcompiler” 부분을 참조한다.
jeus명령어에 system property를 추가할 수 있는 기능 추가
jeus명령어에 system property를 입력할 수 있도록 기능을 추가하였다. jeus명령어의 usage는 다음과 같다.
Usage: jeus [-h] [-protectkey] [-d] [-xml] [-U<username>] [-P<password>] [-f<filename>] [-D<property=value>] [-properties=<filename>] arguments: -h: show this help page -protectkey: use protected secret key -d: boot dynamic mode -xml: use XML (deprecated) -U<username>: set username -P<password>: set password -f<filename>: set filename of username and password -D<property=value>: set system property. This option can be used more than once. -properties=<filename>: set system properties from the specified system property file.
자세한 설명은 “JEUS Reference Book”의 “제3장 jeus” 부분을 참조한다.
Baseport로 WebAdmin을 접속하는 기능 추가
JEUS BASEPORT(9736)를 통해서 WebAdmin을 접속하는 기능을 추가하였다.
설정 방법은 다음과 같다.
JEUS 매니저 > 서비스의 WebAdmin 설정 페이지에서 Use Baseport를 체크하여 접속 여부를 설정할 수 있다.
JEUSMain.xml에서는 다음과 같이 Use Baseport를 true로 설정한다.
<webadmin-config> <use-baseport>true</use-baseport> </webadmin-config>
security.key 파일의 위치 지정 및 master password 지정 옵션 추가
password가 암호화된 DataSource의 decryption 시점이 lookup할 때로 변경됨에 따라 standalone application 이 lookup을 할 때는 실행 옵션에 -Djeus.security.keypath=<security.key 파일의 위치(디렉터리 혹은 파일명까지 포함 가능)> 를 지정할 수 있는 기능을 추가하였다.
security.key 파일이 암호화 된 경우, -Djeus.security.master=<master key password>를 함께 사용한다.
자세한 설명은 “JEUS Security 안내서”의 “2.4.2. Master Password를 통한 SecretKey 파일 관리” 부분을 참조한다.
WS-Trust 지원
WS-Trust를 보다 손쉽게 사용할 수 있는 환경을 지원한다.
자세한 설명은 “JEUS Web Service 안내서”의 “제16장 웹 서비스 보안” 부분을 참조한다.
EndPoint 양쪽이 idle time에 Ping을 보내는 기능 추가
Network Layer에서 구현된 서비스를 이용할 때 양쪽에서 서로 Ping 을 보낼 수 있는 기능을 추가하여 방화벽 등에 의해서 네트워크가 단절된 상황을 인식할 수 있도록 하였다. 이와 관련된 프로퍼티는 다음과 같다.
jeus.net.ping.enable = true/false, 기본값은 false jeus.net.ping.period ; 기본값은 10분, 단위는 ms
Baseport를 이용하여 RMI 서비스를 제공하는 기능 추가
Node와 Container에서 각각의 Baseport를 이용하여 RMI 서비스를 제공할 수 있는 기능을 추가하였다. 이 기능을 사용하기 위해서는 JVM attribute로 다음을 지정해야 한다.
jeus.rmi.usebaseport = true/false, 기본값은 false
로그 레벨이 FINEST일 때 EJB 모듈을 디플로이 하면 NameNotFount 메시지가 발생하는 현상 수정
이전 버전에서 로그 레벨이 FINEST일 때 EJB 모듈을 디플로이하는 과정에서 NameNotFound 메시지가 발생하는 현상이 있었다. 이는 디플로이 과정에서 발생하는 정상적인 상황이나, 오해의 소지가 있어 처리 방식을 변경하였다.
response.getOutputStream().print(String s) 사용할 때 인코딩 수정
현재 response.getOutputStream() 사용할 때 인코딩하지 않은 binary data만 보내도록 되어 있다. 이를 String을 보낼경우 response의 인코딩으로 인코딩해서 보내도록 수정하였다.
Dead Letter Queue의 이름을 JEUSMQ_DLQ 로 수정
Dead Letter Queue의 이름을 기존의 [broker-name]_JMS_DLQ에서 JEUSMQ_DLQ로 수정하였다.
FileMessage 송수신할 때, 클라이언트가 수신한 FileMessage의 임시 파일 이름 생성 규칙 수정
클라이언트가 수신한 FileMessage를 임시 파일로 저장할 때 standalone 클라이언트인 경우, null_[CURRENT_TIME_MILLIS]_[DESTINATION_NAME]_[MESSAGE_ID] 와 같은 형식으로 파일 이름이 생성되던 현상을 client[N]_[CURRENT_TIME_MILLIS]_[DESTINATION_NAME]_[MESSAGE_ID]와 같은 형식의 임시 파일 이름으로 생성되도록 수정하였다.
client[N]_[CURRENT_TIME_MILLIS]_[DESTINATION_NAME]_[MESSAGE_ID]
N : 0에서 시작하여 현재 VM에서 임시 파일을 생성할 때마다 증가하는 값
CURRENT_TIME_MILLIS : 파일 이름을 결정하는 시점의 시간
다수의 JMS 엔진이 같은 JNDI 이름으로 ConnectionFactory나 Destination을 등록할 수 있도록 수정
같은 JNDI 이름으로 ConnectionFactory나 Destination을 가진 다수의 JMS 엔진이 기동 가능하도록 수정하였다.
stmt-query-timeout의 기본값 수정
Statement query timeout의 기본값을 30초에서 0으로 수정하였다. 즉, driver에 아무런 세팅을 하지 않는다.
애플리케이션 디플로이 방식 화면 변경
기존에 2단계 디플로이와 영구적인 디플로이를 선택할 수 있는 화면에서 모듈 디플로이할 때 '런타임 디플로이'와 '영구 디플로이' 를 동시 선택하여 두 방법 모두 디플로이가 가능하며 선택적으로도 디플로이를 실행할 수 있도록 화면을 변경하였다.
자세한 설명은 WebAdmin 온라인 도움말의 "새 애플리케이션 모듈 배치의 디플로이" 부분을 참조한다.
JAX-RPC Engine 교체
JAX-RPC 성능 향상을 위해서 엔진을 교체 하였다.
* Standards Supported:
- JAX-RPC 1.1
- WS-I Basic Profile 1.1
- WS-I Attachments Profile 1.0
- WS-I Simple SOAP Binding Profile 1.0
이전(~ Fix#3) JAX-RPC 엔진은 System Property, jeus.webservices.jaxrpc.axis=true를 사용하여 선택적으로 사용할 수 있다. 기본 값은 false 이다.
예) -Djeus.webservices.jaxrpc.axis=true