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 mensaje lo invoca una especificación de activación o un escucha JMS cuando llega un mensaje al destino de entrada que se está supervisando.
Acerca de esta tarea
Puede desarrollar aplicaciones empresariales para que utilicen beans controlados por mensaje, como cualquier otro enterprise bean, excepto que los beans controlados por mensaje no disponen de ninguna interfaz inicial o interfaz remota.
Se recomienda desarrollar el bean controlado por mensaje para delegar el proceso de empresa de los mensajes de entrada a otro enterprise bean, que proporciona una clara separación de la gestión de mensajes y del proceso de negocio. Esta separación también significa que el proceso empresarial se puede invocar mediante la llegada de mensajes de entrada o, por ejemplo, mediante un cliente J2EE de WebSphere® . Las respuestas las puede manejar otro enterprise bean que actúe como bean emisor o se pueden manejar en el bean controlado por mensaje.
Los beans controlados por mensajes EJB 2.0 sólo dan soporte a 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 sus propias interfaces de escucha de mensajes que se deben implementar.
Puede utilizar el asistente Nuevo Enterprise Bean de Rational® Application Developer para crear un enterprise bean con un tipo de bean Bean controlado por mensaje. El asistente creará los métodos adecuados para el tipo de bean.
public class MyJMSppMDBBean implements MessageDrivenBean, javax.jms.MessageListenerUn bean controlado por mensajes se puede registrar con el servicio de temporizador EJB para notificaciones de sucesos basadas en tiempo si también implementa la interfaz javax.ejb.TimedObject e invoca el método de devolución de llamada de temporizador mediante la siguiente llamada: 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
throwsno 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 colocar 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);
//
// store the message id to use as the Correlator value
//
messageID = msg.getJMSMessageID();
// Call a private method to put the message onto another queue
putMessage(messageID, text);
}
catch (Exception err)
{
err.printStackTrace();
}
return;
}