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.

Por convención, la clase bean controlada por mensaje se llama nombreBean, donde nombre es el nombre que asigna al bean controlado por mensaje; por ejemplo:
public class MyJMSppMDBBean implements MessageDrivenBean, javax.jms.MessageListener

Un 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.

La clase bean controlado por mensajes debe definir e implementar los métodos siguientes:
  • 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

  1. Cree el proyecto de aplicación de empresa.
  2. Cree la clase de beans controlados por mensajes.
    Puede utilizar el asistente Nuevo Enterprise Bean de Rational (r) Application Developer para crear el enterprise bean con un tipo de bean Bean controlado por mensaje.

    Para obtener un ejemplo de cómo crear la clase de bean controlado por mensajes, consulte la sección de ejemplos de este tema. Para obtener más información, consulte Creación de beans controlados por mensajes en la documentación de Rational Application Developer .

    El resultado de este paso es un bean controlado por mensajes que se puede ensamblar en archivos EAR para despliegue.
  3. Opcional: Utilice el editor de descriptor de despliegue EJB para revisar y, si es necesario, cambiar los atributos de despliegue.
    Puede utilizar el editor de descriptor de despliegue EJB para revisar los atributos de despliegue que ha especificado en el asistente de creación de EJB (por ejemplo, Transaction type y Message selector) y otros atributos de despliegue predeterminados.
    1. En el panel de propiedades, seleccione el separador Bean .
    2. En el panel principal, configure el atributo Transaction type .
      Transaction type
      Este atributo determina si el bean controlado por mensajes gestiona sus propias transacciones o si el contenedor gestiona las transacciones en nombre del bean.
      Bean
      El bean controlado por mensajes gestiona sus propias transacciones.
      Container
      El contenedor gestiona transacciones en nombre del bean.
    3. En Configuración de activación, revise los atributos siguientes:
      acknowledgeMode
      Este atributo determina la forma en que la sesión reconoce los mensajes que recibe.
      Reconocimiento automático
      La sesión reconoce automáticamente la entrega de cada mensaje.
      Reconocimiento correcto de duplicados
      La sesión reconoce vagamente la entrega de mensajes. Es probable que este valor produzca como resultado la entrega de algunos mensajes duplicados si JMS falla, por lo que sólo deben utilizarlo las aplicaciones de consumidor que toleren mensajes duplicados.

      Tal como se define en la especificación de EJB, los clientes no pueden utilizar el método Message.acknowledge() para reconocer mensajes. Si se pasa un valor de CLIENT_ACKNOWLEDGED en la llamada a createxxxSession, el servidor de aplicaciones reconoce automáticamente los mensajes y no se utiliza el método Message.acknowledge() .

      Nota:

      El reconocimiento se envía cuando se suprime el mensaje.

      Si tiene un bean controlado por mensaje no transaccional, el sistema puede suprimir el mensaje cuando el bean controlado por mensajes se inicia, o cuando el bean controlado por mensajes finaliza. Si el bean controlado por mensaje genera una excepción y, por consiguiente, no se completa, el sistema realiza una de las acciones siguientes:
      • Si el sistema se ha configurado para que se suprima el mensaje cuando se complete el bean controlado por mensaje, entonces el mensaje se envía a una instancia nueva del bean controlado por mensaje, de modo que el bean tiene otra oportunidad de ser procesado.
      • Si el sistema se configura para suprimir el mensaje cuando se inicia el bean controlado por mensaje, se pierde el mensaje.

      El mensaje se suprime cuando el bean controlado por mensaje se inicia si la calidad de servicio se establece en Mejor esfuerzo no persistente. Para todas las otras calidades de servicio, se suprime el mensaje cuando se completa el bean controlado por mensaje.

      destinationType
      Este atributo determina si el bean de mensaje utiliza un destino de cola o de tema.
      Cola
      El bean controlado por mensajes utiliza un destino de cola.
      Tema
      El bean controlado por mensajes utiliza un destino de tema.
      subscriptionDurability
      Este atributo determina si una suscripción de tema JMS es duradera o no.
      Duradera
      Un suscriptor registra una suscripción duradera con una identidad exclusiva que JMS conserva. Los objetos de suscriptor posteriores con la misma identidad reanudan la suscripción en el estado en el que estaba para el suscriptor anterior. Si no hay un suscriptor activo para una suscripción duradera, JMS conserva los mensajes de la suscripción hasta que la suscripción los recibe o hasta que caducan.
      Nondurable
      Las suscripciones no duraderas duran el tiempo que dure el objeto del suscriptor. Esto significa que un cliente ve mensajes publicados sobre un tema sólo cuando su suscriptor esté activo. Si el suscriptor no está activo, el cliente no verá los mensajes publicados sobre ese tema.

      Sólo se puede utilizar el suscriptor no duradero en el mismo contexto transaccional (por ejemplo, una transacción global o un contexto de transacción no especificado) que existía cuando se ha creado el suscriptor.

      messageSelector
      Este atributo determina el selector de mensajes JMS que se utiliza para seleccionar qué mensajes recibe el bean de mensaje. Por ejemplo:
      JMSType='car' AND color='blue' AND weight>2500

      La serie del selector puede hacer referencia a campos de la cabecera del mensaje JMS y a campos de las propiedades del mensaje. Los selectores de mensajes no pueden hacer referencia a valores del cuerpo del mensaje.

    4. Especificar atributos de despliegue de enlaces.

      En WebSphere Enlaces, seleccione la opción Adaptador JCA y, a continuación, especifique los atributos de despliegue de enlaces:

      ActivationSpec JNDI name
      Este atributo especifica el nombre JNDI de la especificación de activación que se utilice para desplegar este bean controlado por mensajes. Este nombre debe coincidir con el nombre de una especificación de activación que defina en WebSphere Application Server.
      ActivationSpec Authorization Alias
      Este atributo especifica el nombre de un alias de autenticación utilizado para la autenticación de conexiones con el adaptador de recursos JCA. Un alias de autenticación especifica el ID de usuario y la contraseña que se utiliza para autenticar la creación de una nueva conexión con el adaptador de recursos de JCA.
      Destination JNDI name
      Este atributo especifica el nombre JNDI que utiliza el bean controlado por mensajes para buscar el destino JMS en el espacio de nombres JNDI.
    5. Opcional: Especifique Destination Link para habilitar el enlace de mensajes.

      El enlace de mensajes permite el direccionamiento de mensajes a un bean controlado por mensaje específico de un despliegue. El enlace de mensajes permite orquestar el flujo de mensajes entre componentes en la misma aplicación.

      Para que un bean controlado por mensaje consuma y procese un mensaje, el elemento <message-destination-link> debe definirse en el descriptor de despliegue asociado con el bean controlado por mensaje. El destino identificado mediante el elemento <message-destination-link> se corresponde con el destino lógico.

      Cuando <message-destination-ref> incluye un elemento <message-destination-link>, los mensajes se consumen en ese destino.

      Para obtener el bean controlado por mensaje a fin de consumir mensajes que se envían a un destino, puede declarar un elemento <message-destination-link> en el descriptor de despliegue o, como alternativa, establézcalo en la especificación de activación.

  4. Ensamble y empaquete la aplicación para el despliegue.

Resultados

El resultado de esta tarea es un archivo EAR, que contiene el bean controlado por mensajes, para la aplicación empresarial que se puede desplegar en WebSphere Application Server.

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;
}

Qué hacer a continuación

Después de desarrollar una aplicación empresarial para utilizar beans controlados por mensajes, configure y despliegue la aplicación. Por ejemplo, defina las especificaciones de activación para los beans controlados por mensaje y, opcionalmente, cambie los atributos de descriptor de despliegue de la aplicación. Consulte la información sobre el despliegue de una aplicación empresarial para utilizar beans controlados por mensajes con recursos compatibles con JCA 1.5-compliant y puertos de escucha.