![[z/OS]](../images/ngzos.gif)
RMI/IIOP 엔터프라이즈 Bean 요청 완료에 대한 시간 한계 설정
요청 제한시간 ORB 서비스 설정은 클라이언트가 아웃바운드 RMI/IIOP 엔터프라이즈 Bean 호출로부터의 응답에 얼마나 오래 대기할 것인지 결정합니다. 이 설정은 엔터프라이즈 Bean 호출의 결과로 전송되는 각 IIOP 찾기 및 요청 메시지에 대해 적용되는 서버 범위의 설정입니다. 지정된 시간 한계가 만기되면 아웃바운드 RMI/IIOP 엔터프라이즈 Bean을 호출한 애플리케이션이 org.omg.CORBA.COMM_FAILURE 시스템 예외를 수신합니다.
시작하기 전에
WebSphere® Application Server 버전 7 이상의 경우, 리스너 포트가 더 이상 사용되지 않습니다. 따라서 리스너 포트 사용에서 활성화 스펙 사용으로 WebSphere MQ 메시지 구동 Bean 배치 구성을 마이그레이션해야 합니다. 그러나 WebSphere Application Server 버전 7 이전의 애플리케이션 서버에서 애플리케이션을 실행할 필요가 없다는 것이 확신할 때까지는 이 마이그레이션을 시작하지 않아야 합니다. 경우에 따라 WebSphere MQ 메시지 구동 Bean 배치와 리스너 포트를 계속 사용하거나, WebSphere MQ 메시지 구동 Bean 배치와 활성화 스펙을 사용하게 됩니다.
- control_region_mdb_request_timeout
- control_region_mdb_queue_timeout_percent
- server_region_mdb_stalled_thread_dump_action
- control_region_wlm_dispatch_timeout
- control_region_iiop_queue_timeout_percent
- server_region_iiop_stalled_thread_dump_action
지시사항에 따라 이러한 특성을 구성하는 경우 리스너 포트 및 활성화 스펙에 적용되는 특성이 각각 무엇인지 기억해 두십시오.
- 모든 디스패치 타이머에 대해 설정을 결정하십시오. 메시지 구동 Bean(MDB), (control_region_mdb_request_timeout), HTTP 요청(protocol_http_timeout_output), HTTPS 요청(protocol_https_timeout_output), SIP 요청(protocol_sip_timeout_output), SIPS 요청(protocol_sips_timeout_output) 및 IIOP 요청(control_region_wlm_dispatch_timeout)에 대해 별도의 디스패치 타이머가 있습니다. 애플리케이션이 MDB, 서블릿 또는 또 다른 엔터프라이즈 Bean 아래에서 실행되는 종안 엔터프라이즈 Bean 호출이 발생할 수 있으므로 RMI/IIOP 아웃바운드 타이머에 대한 간격 설정이 모든 해당 디스패치 타이머에 대한 간격 설정보다 짧은지 확인해야 합니다.
- 호출자의 Perspective에서 원격 엔터프라이즈 Bean 호출이 동기화되도록 이해해야 합니다. 따라서 호출자가 엔터프라이즈 Bean으로부터의 응답을 수신 대기하는 동안 호출 스레드가 블록화됩니다. RMI/IIOP 타이머가 만기될 때 호출 스레드가 인터럽트되고 시스템 예외 응답과 함께 호출자에게 리턴됩니다. 호출된 EJB의 응답이 RMI/IIOP 타이머가 만기된 후에 도달되면 무시됩니다.
- RMI/IIOP 아웃바운드 타이머 및 트랜잭션 간의 관계를 이해해야 합니다. RMI/IIOP 아웃바운드 타이머가 만기되고 시스템 예외가 호출자에게 리턴되면 EJB 컨테이너가 즉시 모든 기존 글로벌 트랜잭션을 롤백 전용 상태로 놓습니다. 그러나 대상 엔터프라이즈 Bean의 트랜잭션이 롤백용으로 표시된 경우에도 호출자가 대상 엔터프라이즈 Bean으로부터의 모든 응답을 계속 리턴합니다.
이 태스크 정보
BBOO0325W An IIOP request for Class Name 'com.ejb.test.hello.second.EJSRemoteStatelessSayHelloSecond_686a0ff2'
and Method Name 'sayHelloTwo', to 'jobname=BBOS002 asid=0031', has timed out. SessionHandle=0000000026D9F0480000000A008004FF, Request ID=00000004
이 메시지는 대상 엔터프라이즈 Bean의 클래스 및 메소드를 표시합니다. 대상 엔터프라이즈 Bean이 TCP/IP를 통해 호출된 경우, 메시지의 "수신처" 섹션에 대상 서버의 호스트 이름 및 포트가 포함됩니다. 대상 엔터프라이즈 Bean이 최적화된 로컬 통신을 통해 호출된 경우, 앞의 예제에 표시된 것과 같이 메시지의 "수신처" 섹션에 대상 작업 이름 및 asid가 포함됩니다.
/bbooejsb.cpp+3395 ... BBOO0011W The function ORBEJSBridge::invoke_request(JNIEnv *, bboojorb *,
char *, CORBA::Boolean, CORBA::Request *&, void *)+3395 received CORBA system exception CORBA::COMM_FAILURE.
Error code is C9C26A48
이 추적 항목의 부 코드 C9C26A48은 RMI/IIOP 아웃바운드 타이머에 대한 대기 시간이 종료되었음을 나타냅니다.
BBOO0328I: No Request found for inbound GIOP Response,
SessionHandle=<hstring>, RequestID=<hstring>.
요청 또는 응답은 세션 핸들 및 요청 ID로 고유하게 식별되고 이 요청에 대해 이전에 BBOO0325W 메시지를 받았는지 여부를 판별하는 데 사용할 수 있습니다.
호출된 엔터프라이즈 Bean에서 클라이언트가 응답을 대기하는 시간을 변경하려면 다음을 수행하십시오.
프로시저
다음에 수행할 작업
org.omg.CORBA.COMM_FAILURE 예외가 시스템 예외이므로 만기된 엔터프라이즈 Bean 호출을 보정하거나 재시도하기 위해 엔터프라이즈 Bean을 호출하는 애플리케이션이 필요하지 않습니다. 그러나 자동 트랜잭션이 애플리케이션에 의해 사용되지 않는 상황을 포함한 특정 상황에서는 애플리케이션이 만기된 엔터프라이즈 Bean 호출을 보정하거나 재시도해야 하는 경우도 있습니다.
- 현재 글로벌 트랜잭션 외부에서 실행되어야 합니다.
- org.omg.CORBA.COMM_FAILURE 예외를 발견해야 합니다.
// This method runs outside a global transaction. public Data callingMethod() throws … {
try{
InitialContext con = new InitialContext();
EJBHome home con.lookup(...);
CalledBean cb = home.create();
} catch (org.omg.CORBA.COMM_FAILURE cf1){
// The home create could timeout, so put retry or
// compensation logic here.
} catch( CreateException cx){
throw new ...
} catch( NamingException nx){
throw new ...
} catch(RemoteException ex){
throw new ...
}
try{
cb.calledMethod(…);
} catch (org.omg.CORBA.COMM_FAILURE cf2){
// The calledMethod could timeout, so put retry or
// compensation logic here.
} catch( … ){
…
}
}
// This method can run in a global transaction. private void calledMethod(String strKey) throws … {
try{
// business logic here
}
catch ( … ){
throw new ...
}
}
자동 트랜잭션 범위 내에서 실행 중인 애플리케이션은 만기된 엔터프라이즈 Bean 호출을 보정하거나 재시도하려면 엔터프라이즈 Bean을 호출하기 전에 트랜잭션을 일시중단해야 합니다. 호출을 TX_NOTSUPPORTED 엔터프라이즈 Bean 메소드 내에 임베드하는 것이 현재 트랜잭션을 일시중단하는 가장 좋은 방법입니다.