![[z/OS]](../images/ngzos.gif)
Definición de un límite de tiempo para la realización de solicitudes de enterprise beans de RMI/IIOP
El valor Tiempo de espera de solicitud (Servicio ORB) determina cuánto tiempo espera un cliente recibir una respuesta de una invocación de enterprise bean de RMI/IIOP de salida. Este valor es un valor para todo el servidor que se aplica a cada mensaje de solicitud y solicitud IIOP que se envía como resultado de una invocación de enterprise bean. Cuando caduca el límite de tiempo especificado, la aplicación que ha invocado el enterprise bean de RMI/IIOP de salida recibe una excepción del sistema org.omg.CORBA.COMM_FAILURE.
Antes de empezar
Para WebSphere Application Server versión 7 y posteriores, los puertos de escucha han quedado en desuso. Por consiguiente, debe planificar la migración de sus configuraciones de despliegue de beans controlados por mensaje de WebSphere MQ para pasar de utilizar puertos de escucha a utilizar especificaciones de activación. Sin embargo, no debería comenzar esta migración hasta estar seguro de que la aplicación no tiene que trabajar con servidores de aplicaciones anteriores a WebSphere Application Server versión 7. En algunos casos podrá seguir utilizando el despliegue de beans controlados por mensajes y los puertos de escucha de WebSphere MQ y en otros casos utilizará el despliegue de beans controlados por mensajes y las especificaciones de activación de WebSphere MQ.
- 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
A medida que siga las instrucciones para configurar estas propiedades, recuerde las propiedades que se aplican a los puertos de escucha y las que se aplican a las especificaciones de activación.
- Determinar los valores para todos los temporizadores de asignación. Existen distintos temporizadores de asignación para beans controlados por mensaje (MDB), (control_region_mdb_request_timeout), solicitudes HTTP (protocol_http_timeout_output), solicitudes HTTPS (protocol_https_timeout_output), solicitudes SIP (protocol_sip_timeout_output), solicitudes SIPS (protocol_sips_timeout_output) y solicitudes IIOP (control_region_wlm_dispatch_timeout). Dado que las invocaciones de enterprise beans pueden darse mientras una aplicación se ejecuta bajo un MDB, un servlet u otro enterprise bean, debe asegurarse de que el valor de intervalo para el temporizador de salida de RMI/IIOP sea más corto que el valor de intervalo para cualquiera de estos temporizadores de asignación.
- Tener presente que, desde la perspectiva del invocador, las invocaciones de enterprise beans remotas son síncronas. Por lo tanto, mientras el invocador espera una respuesta del enterprise bean, la hebra que realiza la invocación está bloqueada. Cuando el temporizador de RMI/IIOP caduca, la hebra que realiza la invocación se interrumpe y vuelve al invocador con una respuesta de excepción del sistema. Si una respuesta del EJB invocado llega después de que caduque el temporizador de RMI/IIOP, ésta se ignora.
- Entender la relación entre las transacciones y el temporizador de salida de RMI/IIOP. Cuando el temporizador de salida de RMI/IIOP caduca y se devuelve una excepción del sistema al invocador, el contenedor de EJB pone inmediatamente todas las transacciones globales existentes en estado de sólo retrotracción. No obstante, el invocador sigue devolviendo todas las respuestas del enterprise bean de destino aún cuando la transacción del enterprise bean de destino esté marcada para retrotracción.
Acerca de esta tarea
BBOO0325W Se ha excedido el tiempo de espera para una solicitud IIOP para el nombre de clase 'com.ejb.test.hello.second.EJSRemoteStatelessSayHelloSecond_686a0ff2'
y el nombre de método 'sayHelloTwo', para 'jobname=BBOS002 asid=0031'.
SessionHandle=0000000026D9F0480000000A008004FF, ID de solicitud=00000004
Este mensaje indica la clase y el método del enterprise bean de destino. Si el enterprise bean de destino se ha invocado a través de TCP/IP, la sección "para" del mensaje contiene el nombre de host y el puerto del servidor de destino. Si el enterprise bean de destino se invoca a través de la comunicación local optimizada, la sección "para" del mensaje contiene el asid y el nombre de trabajo de destino, como se muestra en el ejemplo anterior.
/bbooejsb.cpp+3395 ... BBOO0011W La función ORBEJSBridge::invoke_request(JNIEnv *, bboojorb *,
char *, CORBA::Boolean, CORBA::Request *&, void *)+3395 ha recibido la excepción del sistema CORBA CORBA::COMM_FAILURE.
El código de error es C9C26A48
El código menor C9C26A48 de esta entrada de rastreo indica que el tiempo de espera para el temporizador de salida de RMI/IIOP ha finalizado.
BBOO0328I: No se ha encontrado la solicitud para la respuesta GIOP de entrada,
SessionHandle=<hstring>, RequestID=<hstring>.
Una solicitud o respuesta sólo es identificada por el manejo de sesiones y el ID de la solicitud, y se puede utilizar para determinar si se recibió un mensaje BBOO0325W anterior para esta solicitud.
Para cambiar el intervalo de tiempo que el cliente espera a recibir una respuesta de un enterprise bean invocado:
Procedimiento
Qué hacer a continuación
Puesto que la excepción org.omg.CORBA.COMM_FAILURE es una excepción del sistema, la aplicación que invoca el enterprise bean no debe compensar ni reintentar una invocación de enterprise bean caducada. Sin embargo, en determinadas situaciones, como cuando la aplicación no utiliza transacciones atómicas, podría hacer que la aplicación compensara o reintentara una invocación de enterprise bean caducada.
- Ejecutarse fuera de la transacción global actual y
- Detectar la excepción org.omg.CORBA.COMM_FAILURE.
// Este método se ejecuta fuera de una transacción global. public Data callingMethod() throws … {
try{
InitialContext con = new InitialContext();
EJBHome home con.lookup(...);
CalledBean cb = home.create();
} catch (org.omg.CORBA.COMM_FAILURE cf1){
// La creación inicial podría exceder el tiempo de espera, por tanto, poner aquí
// lógica de reintento o compensación.
} 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){
// El calledMethod podría exceder el tiempo de espera, por tanto, poner aquí
// lógica de reintento o compensación.
} catch( … ){
…
}
}
// Este método se puede ejecutar en una transacción global. private void calledMethod(String strKey) throws … {
try{
// lógica empresarial aquí
}
catch ( … ){
throw new ...
}
}
Las aplicaciones que se ejecutan dentro del ámbito de una transacción atómica deben suspenderse antes de invocar un enterprise bean si desea que la aplicación pueda compensar o reintentar una invocación de enterprise bean caducada. La mejor forma de suspender la transacción actual es incluir la invocación en un método de enterprise bean TX_NOTSUPPORTED.