Message Driven POJO

De Dos Ideas.
Saltar a: navegación, buscar

Spring Framework provee soporte para crear consumidores JMS usando POJOs. De esta manera, Spring brinda los llamados Message Driven POJO (MDP), que resulta ser una alternativa liviana a los Message Driven Bean que forman parte de la especificación Java EE. Con los MDP podemos obtener un comportamiento similar a los MDB, pero sin la necesidad de contar con un Servidor de Aplicaciones.

Creación del POJO

La clase que consumirá los mensajes que lleguen al destino JMS será un bean cualquier declarado en Spring, el cual deberá implementar la interfaz javax.jms.MessageListener. Por lo tanto, un MDB es un MDP; es decir, un MDP implementa la misma interfaz que implementan los MDB. Por lo tanto, podemos usar a un MDB existente como si fuera un MDP.

Un ejemplo de este bean podría ser:

package com.dosideas.mdp;

import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage;

public class HolaMundoMdp implements MessageListener {

   public void onMessage(Message message) {
       TextMessage textMessage = (TextMessage) message;
       //procesar mensaje...
   }

}

Configuración básica de Spring

Lo siguiente es realizar la configuración correspondiente en los archivos de configuración de Spring. La clase clave de esta configuración es org.springframework.jms.listener.DefaultMessageListenerContainer, el cual declara al bean que se encargará de conectarse al destino JMS para consumir los mensajes y delegar su procesamiento a nuestro MDP. Esta clase permite configurar la cantidad de consumidores concurrentes, transaccionalidad, selectores y mucho más.

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

   <bean id="mdp.HolaMundoMdbp" class="com.dosideas.mdp.HolaMundoMdp"/>
   <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate" />
   <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
       <property name="jndiTemplate">
           <ref bean="jndiTemplate" />
       </property>
       <property name="jndiName">
           <value>jms/ConnectionFactory</value>
       </property>
   </bean>
   <bean id="queue" class="org.springframework.jndi.JndiObjectFactoryBean">
       <property name="jndiTemplate">
           <ref bean="jndiTemplate" />
       </property>
       <property name="jndiName">
           <value>jms/EjemploQueue</value>
       </property>
   </bean>
   <bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
       <property name="concurrentConsumers" value="5" />
       <property name="connectionFactory" ref="connectionFactory" />
       <property name="destination" ref="queue" />
       <property name="messageListener" ref="mdp.HolaMundoMdbp" />        
   </bean>

</beans>

Propiedades de la clase DefaultMessageListenerContainer

Si se utiliza el mensaje a consumir tiene un JMSType específico, es necesario definirlo. Entonces, a la configuración anterior se agrega:

<property name="messageSelector" value="JMSType = 'jmsTypeSaludoA'"/>

Ver también