Desarrollo de una aplicación de empresa para utilizar beans controlados por mensajes
Las aplicaciones pueden utilizar beans controlados por mensajes como consumidores de mensajes asíncronos. Despliegue un bean controlado por mensajes como escucha de mensajes de un destino. El bean controlado por mensajes se invoca mediante una especificación de activación o un escucha JMS cuando llega un mensaje en el destino de entrada que se está supervisando.
Acerca de esta tarea
Puede desarrollar aplicaciones de empresa para que utilicen beans controlados por mensajes, como cualquier otro enterprise bean, excepto que los beans controlados por mensajes no disponen de interfaz de factoría ni remota.
Debe desarrollar el bean controlado por mensajes para delegar el proceso de empresa de los mensajes de entrada a otro enterprise bean, con lo que se separa con claridad el proceso de manejo de mensajes del proceso de empresa. Esta separación también significa que el proceso de empresa se puede invocar mediante la llegada de mensajes de entrada o, por ejemplo, mediante un cliente WebSphere J2EE. Otro enterprise bean, actuando como bean emisor, puede manejar las respuestas, o se pueden manejar en el bean controlado por mensajes.
Los beans controlados por mensajes de EJB 2.0 sólo soportan la mensajería JMS (Java™ Message Service). Los beans controlados por mensajes de EJB 2.1 y EJB 3 pueden dar soporte a otros tipos de mensajes además de JMS. Todos los beans controlados por mensajes deben implementar la interfaz MessageDrivenBean. Para la mensajería JMS, un bean controlado por mensajes debe implementar también la interfaz de escucha de mensajes javax.jms.MessageListener. Otros adaptadores de recursos compatibles con JCA (Java EE Connector Architecture) pueden proporcionar una interfaz propia de escucha de mensajes que tenga que implementarse.
Puede utilizar el asistente Nuevo Enterprise Bean de Rational Application Developer para crear un enterprise bean con un bean del tipo Bean controlado por mensajes. El asistente creará los métodos adecuados para el tipo de bean.
public class MyJMSppMDBBean implements MessageDrivenBean, javax.jms.MessageListener
Se puede registrar un bean controlado por mensajes con el servicio de temporizador de EJB para notificaciones de sucesos basados en el tiempo si también implementa la interfaz javax.ejb.TimedObject e invoca el método de retorno de llamada de temporizador con la llamada siguiente: void ejbTimeout(Timer). A una hora planificada el contenedor llama al método ejbTimeout del bean controlado por mensajes.
- onMessage(message), que debe cumplir los requisitos
siguientes:
- El método debe tener un solo argumento de tipo javax.jms.Message.
- La cláusula throws no debe definir ninguna excepción de aplicación.
- Si se ha configurado el bean controlado por mensajes para utilizar transacciones controladas por beans, debe llamar a la interfaz javax.transaction.UserTransaction del ámbito de las transacciones. Dado que estas llamadas se producen dentro del método onMessage(), el ámbito de la transacción no incluye la recepción del mensaje inicial. Si desea más información, consulte el tema sobre el soporte de transacción de beans controlados por mensaje.
Para gestionar el mensaje dentro del método onMessage() (por ejemplo, para transferir el mensaje a otro enterprise bean), puede utilizar JMS estándar. Esto se conoce como mensajería gestionada por bean.
Si va a utilizar un adaptador de recursos compatible con JCA con otra interfaz de escucha de mensajes, puede que necesite otro método además de onMessage(). Para obtener información sobre la interfaz de escucha de mensajes necesaria, consulte la documentación que se ha proporcionado con el adaptador de recursos compatible con JCA.
- ejbCreate()
Debe definir e implementar un método ejbCreate para cada modo en que desea crear una nueva instancia de enterprise bean.
- ejbRemove()
El contenedor invoca este método cuando el cliente invoca el método remove heredado por la interfaz de factoría del enterprise bean de la interfaz javax.ejb.EJBHome. Este método debe contener todo el código que desee ejecutar antes de que se elimine del contenedor una instancia de enterprise bean (y los datos asociados se eliminan del origen de datos).
- ejbTimeout(Timer)
Este método sólo es necesario para dar soporte a las notificaciones del servicio de temporizador y contiene la lógica empresarial que maneja los sucesos de tiempo recibidos.
Procedimiento
Resultados
Ejemplo
En el ejemplo siguiente se muestra cómo crear la clase de beans controlados por mensajes. El código de ejemplo muestra cómo acceder al texto y al MessageID JMS, desde un mensaje JMS de tipo TextMessage. En este ejemplo, en primer lugar, el método onMessage() de un bean controlado por mensajes se utiliza para desempaquete el mensaje de texto entrante y para extraer el texto y el identificador del mensaje; a continuación, se utiliza un método putMessage privado (definido dentro de la misma clase de bean de mensaje) para coloar el mensaje en otra cola.
public void onMessage(javax.jms.Message msg)
{
String text = null;
String messageID = null;
try
{
text = ((TextMessage)msg).getText();
System.out.println("senderBean.onMessage(), msg text2: "+text);
//
// Almacena el ID de mensaje para utilizarlo como valor de correlación
//
messageID = msg.getJMSMessageID();
// Llama a un método privado para transferir el mensaje a otra cola
putMessage(messageID, text);
}
catch (Exception err)
{
err.printStackTrace();
}
return;
}