![[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 V7 及更高版本,不推荐使用侦听器端口。因此,应该进行规划,以便将 WebSphere MQ 消息驱动的 bean 部署配置由使用侦听器端口迁移为使用激活规范。但是,不应该开始此迁移,除非您确定应用程序不必在低于 WebSphere Application Server V7 的应用程序服务器上工作。在一些情况下,您将继续使用 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、Servlet 或另一企业 Bean 下运行时,会发生企业 Bean 调用,所以您必须确保 RMI/IIOP 出站计时器的时间间隔设置值要短于 MDB、HTTP 请求或 HTTPS 请求的分派计时器时间间隔设置值中的任何一个。
- 应明白远程企业 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>.
请求或应答由会话句柄和请求标识唯一标识,可用于确定先前是否接收到此请求的 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 方法中是暂挂当前事务的最佳途径。