[z/OS]

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.

Las propiedades siguientes NO SE APLICAN al despliegue de beans controlado por mensajes y por especificaciones de activación. Es decir, las propiedades deben ser configuradas para utilizar el despliegue de beans controlado por mensajes de WebSphere MQ y los puertos de escucha:
  • control_region_mdb_request_timeout
  • control_region_mdb_queue_timeout_percent
  • server_region_mdb_stalled_thread_dump_action
Las propiedades siguientes SE APLICAN al despliegue de beans controlado por mensajes y por especificaciones de activación. Es decir, estas propiedades deben ser configuradas para utilizar el despliegue de beans controlado por mensajes de WebSphere MQ y las especificaciones de activación.
  • 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.

Antes de empezar, debe:
  • 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

Si el temporizador caduca, se emite un mensaje parecido al siguiente:
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.

Cuando se emite este mensaje, se genera un correspondiente rastreo de excepciones que incluye una entrada parecida a la siguiente:
/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.

Si se recibe una respuesta a la solicitud, después de que se haya agotado el tiempo de espera y ya no está en la cola, se emite el mensaje siguiente:
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

  1. En la consola administrativa, pulse Servidores > Tipos de servidor > Servidores de aplicaciones WebSphere > nombre_servidor > Servicio de contenedor > Servicio ORB.
  2. Especifique, en segundos, un valor de temporizador adecuado en el campo Tiempo de espera de solicitud. El valor predeterminado es 180 segundos. Ejemplo: si se especifica el valor 2 en el campo Tiempo de espera de solicitud, se establece el tiempo de espera para en temporizador en 2 segundos.

    Se recomienda especificar un valor considerablemente más corto que el tiempo especificado para los temporizadores de asignación. Este tipo de valor permite que la aplicación que realiza la invocación compense los enterprise beans que no responden antes de que finalice el tiempo de espera para los temporizadores de asignación. Si el tiempo de espera para los temporizadores de asignación finaliza, se puede producir una terminación anómala EC3.

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.

Para que una aplicación compense o reintente una invocación de enterprise bean caducada, la aplicación debe:
  • Ejecutarse fuera de la transacción global actual y
  • Detectar la excepción org.omg.CORBA.COMM_FAILURE.
En el siguiente ejemplo, que es un fragmento de código que se ejecuta fuera de una transacción atómica, se muestran los pasos que una aplicación debe llevar a cabo si desea que dicha aplicación compense o reintente una invocación de enterprise bean caducada:
// 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.


Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=trun_svr_rmi_timer
File name: trun_svr_rmi_timer.html