|   |     | 
| Línea 1: | Línea 1: | 
| − | [[Spring Framework]] provee soporte para crear consumidores [[JMS]] usando [[POJO]]s. 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]].
 | + | Kudos to you! I hadn't touhght of that! | 
| − |   |  | 
| − | == 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: 
 |  | 
| − |   |  | 
| − | <code java>
 |  | 
| − | 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...
 |  | 
| − |     }
 |  | 
| − | }
 |  | 
| − | </code>
 |  | 
| − |   |  | 
| − | == 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. 
 |  | 
| − |   |  | 
| − | <code xml>
 |  | 
| − | <?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>
 |  | 
| − | </code>
 |  | 
| − |   |  | 
| − | == Propiedades de la clase DefaultMessageListenerContainer ==
 |  | 
| − |   |  | 
| − | Si el mensaje a consumir tiene un '''JMSType''' específico, es necesario definirlo, con la siguiente propiedad:
 |  | 
| − |   |  | 
| − | <code xml>
 |  | 
| − | <property name="messageSelector" value="JMSType = 'jms-type-de-ejemplo'"/>
 |  | 
| − | </code>
 |  | 
| − |   |  | 
| − | == Ver también ==
 |  | 
| − | * [http://www.dosideas.com/java/716-message-driven-pojo-con-spring.html Configuración y descarga de un proyecto de ejemplo de MDP]
 |  | 
| − | * [[JMS]]
 |  | 
| − | * [[Spring Framework]]
 |  | 
| − | * [http://java-x.blogspot.com/2006/12/implementing-jms-with-spring-message.html Message Driven POJO]
 |  | 
| − | * [http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/jms/listener/DefaultMessageListenerContainer.html Javadoc de DefaultMessageListenerContainer]
 |  | 
| − |   |  | 
| − | [[Category:Spring Framework]]
 |  | 
| − | [[Category:JMS]]
 |  |