viernes, 21 de junio de 2013

Envio de mensajes MQ con Spring

MQ es un software perteneciente a la suit de Websphere de IBM que permite el envío de mensajes a través de la red. Al ser software propietario no hay mucha información sobre como hacer un cliente, así que voy ha realizar un ejemplo completo de como hacer el envío y recepción de mensajes MQ con Spring.

Empecemos por las dependencias, para hacer un cliente solo necesitaremos las librerías propias de MQ y las de Spring-JMS que se encargarán de realizar la mayor parte del trabajo por nosotros.


 javax.jms
 jms
 1.1


 com.ibm.mq
 jmqi
 7.0.1.7


 com.ibm.disthub2
 dhbcore
 7.0.1.7


 com.ibm
 mqjms
 7.0.1.7


 org.springframework
 spring-jms
 3.0.3.RELEASE


Ahora vamos a la configuración de Spring, donde crearemos el pool de conexión a la cola MQ indicandole los datos necesarios para realizar dicha conexión. En el 'connectionFactory' indicamos los datos de conexión a la cola MQ. 'singleConnectionFactory', 'destinationResolver' y 'jmsTemplate' es la configuración que hay que hacer para que Spring nos haga la mayor parte del trabajo y maneje las conexiones y el envío de datos. Por último solo queda indicar en que objeto incluiremos el servicio JMS que nos permitirá el envío (el código se puede eliminar y usar dentro de la clase el @autowired, esto ya, al gusto).



 
 
 
 
 
  
  
  
  
  
 
 
 
   
 
 
 
 
 
  
  
        
        
 
 
 
  
 

Ahora nos queda crear la clase que realizará el envío y la recepción, todo muy muy sencillo. En la clase hay añadido un cadena que indicará la cola destino desde la cual se leen y se escriben los mensajes. El valor de la cadena se almacena a igual que los datos de configuración de la cola en un fichero llamado mqexample.properties y el cual se haya configurado para poder leer los valores de el.
public class MessageService {
    private JmsTemplate jmsTemplate;
    @Value("${cola.mq}")
    private String destination;

    public String readMessage() throws JMSException {
        String message = null;

        final Message msg = jmsTemplate.receive(destination);
        if (msg instanceof TextMessage) {
            message = ((TextMessage) msg).getText();
        }

        return message;
    }
 
    public void sendMessage(final String text) {
        jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(final Session session) throws JMSException {
                return session.createTextMessage(text);
            }
        });
    }

 //getters and setters ...
}
Ya solo queda un test del funcionamiento:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:**/conf/context.xml")
public class MqServiceTest {
    private final static Logger LOGGER = Logger.getLogger(MqServiceTest.class);
    @Qualifier("mqService")
    private MessageService mqService;

    @Test
    public void testReadMessage() throws JMSException {
        try {
            LOGGER.info("Inicio");
            final String readMessage = mqService.readMessage();
            LOGGER.info("readMessage: " + readMessage);
            LOGGER.info("Fin");
        } catch (final Exception except) {
            LOGGER.error("Error", except);
        }
    }
    @Test
    public void testSendMessage() {
        try {
            LOGGER.info("Inicio");
            final String message = "Test Message";
            mqService.sendMessage(message);
            LOGGER.info("Fin");
        } catch (final Exception except) {
            LOGGER.error("Error", except);
        }
    }
}

3 comentarios:

  1. Hola!!

    muchísimas gracias por tu manual... es justo lo que buscaba.
    En el tester haces referencia al método senderService... pero no encuentro dónde se define.

    Por favor, ¿podrías ayudarme?

    Un saludo!

    ResponderEliminar
  2. Hola buenas.
    El código estaba incorrecto, era 'mqService.sendMessage' en vez de 'senderSrvice.mqService'.
    Un saludo

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar