Utilice esta tarea para configurar los métodos de bean de sesión EJB (Enterprise JavaBeans)
3.1 para que se ejecuten de forma asíncrona. Puede hacer que sólo algunos de
los métodos de bean, o todos, se ejecuten de manera asíncrona.
Antes de empezar
Atención: En los módulos EJB 3.1, puede establecer uno o varios métodos de bean de sesión para que sean asíncronos, lo que amplía el proceso en paralelo en la aplicación.
- Si no está familiarizado con los métodos asíncronos de EJB 3.1, consulte la información sobre los métodos asíncronos de EJB 3.1, el modelo de programación de cliente para métodos asíncronos de EJB, el modelo de programación de implementación de beans para métodos asíncronos de EJB y el gestor de trabajo de contenedores EJB para métodos asíncronos. En estos temas se ofrece una visión general de los métodos asíncronos de EJB
3.1, se describen los modelos de programación de implementación de beans y
clientes, y se trata del gestor de trabajo que utiliza el contenedor EJB para
enviar métodos asíncronos.
- Desarrolle un nuevo bean de sesión EJB 3.1 para la aplicación o cambie un bean de sesión existente de modo que cumpla los requisitos del modelo de programación EJB 3.1 para métodos asíncronos. Para obtener información general, consulte la información sobre el desarrollo de enterprise beans.
Acerca de esta tarea
Después de haber desarrollado un bean de sesión, realice los pasos siguientes para hacer que uno o más de los métodos de bean sean asíncronos.
Procedimiento
- Especifique uno o más métodos de la clase de implementación de bean como asíncrono. Esto puede hacerse añadiendo anotaciones @Asynchronous en el código fuente del bean, añadiendo stanzas <async-method> en el descriptor de despliegue del módulo, o añadiendo una combinación de
anotaciones y stanzas de descriptor de despliegue. Sólo se puede aplicar la anotación @Asynchronous o sus superclases a la clase de implementación del bean. No se puede aplicar a clases de interfaz. Además, si la anotación se aplica a nivel de clase, todos los métodos de dicha clase son asíncronos. Del mismo modo, todos los métodos de un bean se pueden configurar como asíncronos aplicando "*" como el <method-name> en el descriptor de despliegue.
Consulte los siguientes ejemplos de aplicación de la anotación @Asynchronous:
- Aplicar la anotación @Asynchronous a un método de un bean con una vista sin interfaz. En este ejemplo, el método m1 es síncrono y el método m2 es
asíncrono.
@Stateless @LocalBean
public class MyLocalBean {
public void m1() {
// código del método
}
@Asynchronous
public Future<String> m2() {
// código del método
return new javax.ejb.AsyncResult("Hello, Async World!");
}
}
Importante: El objeto
javax.ejb.AsyncResult<V> es una implementación de la interfaz de Future<V>. Consulte la documentación
de la API para obtener información detallada.
- Aplicar la anotación @Asynchronous al nivel de clase de una clase de bean. En este ejemplo, tanto el método m1 como el método m2 son asíncronos en este bean de vista sin interfaz.
@Stateless @LocalBean @Asynchronouspublic class MyLocalBean {
public void m1() {
// código del método
}
public Future<String> m2() {
// código del método
return new javax.ejb.AsyncResult("Hello, Async World!");
}
}
- Aplicar la anotación @Asynchronous a un método de una clase de implementación del bean. En este ejemplo, el método m1 es síncrono y el método m2 es
asíncrono. Este ejemplo también muestra cómo los tipos de retorno pueden diferir entre la interfaz empresarial y la clase de implementación.
public interface MyIntf {
public void m1();
public Future<Integer> m2();
}
@Stateless @Local(MyIntf.class)
public class MyBean {
public void m1() {
// código del método
}
@Asynchronous
public Integer m2() {
// código del método
return new Integer(3);
}
}
- Aplicar la anotación @Asynchronous al nivel de clase de una clase de implementación de bean. En este ejemplo, el método m1 y el método m2 son asíncronos.
@Stateless @Local(MyIntf.class) @Asynchronous
public class MyBean {
public void m1() {
// código del método
}
public Integer m2() {
// código del método
return new Integer(8);
}
}
Consulte los ejemplos siguientes de modificación del descriptor de despliegue del módulo EJB,
ejb-jar.xml:
- En este ejemplo todos los métodos empresariales de la clase de implementación de bean FullAyncBean y sus superclases
se configuran como asíncronos con el elemento method-name de carácter comodín (*).
<session> <display-name>FullAsyncEJB</display-name>
<ejb-name>FullAsyncBean</ejb-name>
<business-local>com.ibm.sample.async.ejb.FullAsyncIntf</business-local>
<ejb-class>com.ibm.sample.async.ejb.FullAsyncBean</ejb-class>
<session-type>Stateless</session-type> <async-method>
<method-name>*</method-name>
</async-method>
</session>
- En este ejemplo sólo los métodos y firmas especificados (todos los métodos denominados m1 y el método m2 con un único
parámetro de serie) se configuran como asíncronos en la clase de implementación de bean PartiallyAsyncBean.
<session> <display-name>PartiallyAsyncEJB</display-name>
<ejb-name>PartiallyAsyncEJB</ejb-name>
<business-local>com.ibm.sample.async.ejb.PartiallyAsyncIntf</business-local>
<ejb-class>com.ibm.sample.async.ejb.PartiallyAsyncBean</ejb-class>
<session-type>Stateless</session-type> <async-method>
<method-name>m1</method-name>
</async-method>
<async-method>
<method-name>m2</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</async-method>
</session>
Consulte los siguientes ejemplos sobre cómo aplicar una combinación de la anotación @Asynchronous en el código fuente del bean y cómo modificar el descriptor de despliegue del módulo EJB,
ejb-jar.xml:
- En este ejemplo, la anotación @Asynchronous configura el método m2 para que sea asíncrono, y el descriptor de despliegue
configura el método m1 para que sea también un método asíncrono.
@Stateless @LocalBean
public class MyLocalBean {
public void m1() {
// código del método
}
@Asynchronous
public Future<String> m2() {
// código del método
return new javax.ejb.AsyncResult("Hello, Async World!");
}
}
<session> <display-name>MyLocalEJB</display-name>
<ejb-name>MyLocalEJB</ejb-name>
<local-bean/>
<ejb-class>com.ibm.sample.async.ejb.MyLocalBean</ejb-class>
<session-type>Stateless</session-type> <async-method>
<method-name>m1</method-name>
</async-method>
</session>
- En este ejemplo, la anotación @Asynchronous para el método m2 se ignora porque la cabecera del descriptor de despliegue contiene el distintivo metadata-complete="true". Este distintivo hace que la información de configuración sólo se tome de los elementos del descriptor de despliegue. El resultado es que el método m1 de la implementación de MyLocalBean se
configura para que sea asíncrono.
@Stateless @LocalBean
public class MyLocalBean {
public void m1() {
// código del método
}
@Asynchronous
public Future<String> m2() {
// código del método
return new javax.ejb.AsyncResult("Hello, Async World!");
}
}
<ejb-jar id="ejb-jar_ID" ...
metadata-complete="true" version="3.1">
...
<session> <display-name>MyLocalEJB</display-name>
<ejb-name>MyLocalEJB</ejb-name>
<local-bean/>
<ejb-class>com.ibm.sample.async.ejb.MyLocalBean</ejb-class>
<session-type>Stateless</session-type> <async-method>
<method-name>m1</method-name>
</async-method>
</session>
...
</ejb-jar>
- Compruebe que el atributo de transacción aplicado a los métodos
asíncronos sea REQUIRED, REQUIRES_NEW o NOT_SUPPORTED. Estos tipos de atributos de transacción son los únicos tipos de atributo de transacción en métodos asíncronos. Puede realizar esta acción aplicando anotaciones @TransactionAttribute
en el código fuente del bean, añadiendo stanzas <container-transaction>
en el archivo ejb-jar.xml o añadiendo una combinación de anotaciones y stanzas
<container-transaction> en el descriptor de despliegue.
Consulte el ejemplo siguiente de establecimiento del atributo de transacción de un método asíncrono utilizando anotaciones:
@Singleton @LocalBean
public class FullAsyncBean {
@Asynchronous
@TransactionAttribute(REQUIRED) // valor predeterminado; se especifica como ejemplo
public void m1() {
// ...
}
@Asynchronous
@TransactionAttribute(NOT_SUPPORTED)
public void m2() {
// ...
}
@Asynchronous
@TransactionAttribute(REQUIRES_NEW)
public void m3() {
// ...
}
// ...
}
Vea el ejemplo siguiente sobre cómo establecer el atributo de transacción de un método asíncrono utilizando el descriptor de despliegue XML:
<assembly-descriptor>
<container-transaction>
<method> <ejb-name>FullAsyncBean</ejb-name>
<method-name>m1</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<method> <ejb-name>FullAsyncBean</ejb-name>
<method-name>m2</method-name>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
<container-transaction>
<method> <ejb-name>FullAsyncBean</ejb-name>
<method-name>m3</method-name>
</method>
<trans-attribute>RequiresNew</trans-attribute>
</container-transaction>
</assembly-descriptor>
Vea el ejemplo siguiente sobre cómo utilizar una combinación de anotaciones y el descriptor de despliegue XML para configurar los atributos de transacción de un bean. En este ejemplo, las stanzas del descriptor de despliegue para el método m3 sustituyen la anotación de nivel de clase. El resultado es que el método m3 se configura como REQUIRES_NEW, mientras que los métodos m1 y m2 se configuran como REQUIRED:
@Singleton @LocalBean
@Asynchronous
@TransactionAttribute(REQUIRED) // valor predeterminado; se especifica como ejemplo
public class FullAsyncBean {
public void m1() {
// ...
}
public void m2() {
// ...
}
public void m3() {
// ...
}
// ...
}
<assembly-descriptor>
<container-transaction>
<method> <ejb-name>FullAsyncBean</ejb-name>
<method-name>m3</method-name>
</method>
<trans-attribute>RequiresNew</trans-attribute>
</container-transaction>
</assembly-descriptor>
Qué hacer a continuación
Continúe desarrollando componentes adicionales de la aplicación, o si ha terminado todos los componentes que requiere su aplicación, ensamble y despliegue la aplicación. Consulte la información acerca de cómo ensamblar módulos EJB y desplegar módulos EJB.
Si, al ejecutar
la aplicación, se produce un error en el primer intento de utilización de un
bean de sesión que tiene un método asíncrono, puede que exista un error de
configuración. Compruebe el archivo de registros cronológicos del sistema
para ver los mensajes de error de configuración.
Analice los datos de rastreo o remítalos a la organización adecuada
para el análisis. La planificación e invocación
del método asíncrono EJB se rastrean en el rastreo de contenedores EJB. Para obtener instrucciones sobre cómo habilitar este rastreo, consulte la información sobre la habilitación del rastreo en un servidor en ejecución. Para analizar los datos de rastreo, consulte la información acerca de la salida de rastreo.