MessageQueue con Spring

Spring ActiveMQ

Hace unos meses salió aquí un ejemplo de ActiveMQ sin Spring ni nada, aunque lo relevante era mostrar la configuración y uso del servidor de mensajes. Vamos ahora a hacer exactamente lo mismo pero utilizando Spring. Cosa que tenía pendiente desde entonces.

Al igual que sucedía con JDBC, Spring trae unas plantillas para que nos podamos ahorrar toooodo ese código boilerplate tedioso, repetitivo que se precisa simplemente para hacer una operación sencilla. En este caso se trata de JmsTemplate.

Al contrario que otros ejemplos, aquí conviene empezar viendo el fichero xml con la definición de beans, en los que veremos cómo se declaran una serie de instancias precisas para interactuar con ActiveMQ.

El fichero de beans de Spring

Hay dos maneras de referise a la cola, puede ser de forma genérica como se ve en este ejemplo o haciendo uso de los prefijos de ActiveMQ (se ven comentados)






	







	








 

	

 
   
  
  
  
  	
  	
	
  
  
  
  
	
	
	
  
  

El emisor

Es un Thread que aleatoriamente manda una instancia de la clase Order, que no es más que un POJO que representa un pedido. Tanto en el emisor como en el receptor se aprecia que el código para interactuar con la cola de mensajes se reduce mucho.

package info.pello.spring.messagequeue;

import java.util.Random;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;


/**
 * Sends messages to apache MQ
 * @author Pello Altadill
 * @greetz to people I met in Andersen
 */
public class MessageSender extends Thread {

	private Random random;
	private JmsTemplate jmsTemplate;
	private String queueName;
	
	/**
	 * default constructor
	 */
	public MessageSender (String name) {
		super(name);
		random = new Random();
	}
	
	/**
	 * main thread loop
	 */
	public void run () {
		String [] products = {"BigMac","Chips","Coke"};
		Order order = null;
		int counter = 0;
		
		while (true) {
			try {
				sleep(random.nextInt(5));
				counter++;
				order = new Order(products[random.nextInt(3)], random.nextInt(5));
				System.out.println("["+counter+"] Sending order: " + order.toString());
				sendMessage(order);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}

	/**
	 * sends message to queue
	 * http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch23s03.html
	 * @param order
	 */
	private void sendMessage(final Order order) {

		jmsTemplate.send(queueName,
			new MessageCreator() {
				public Message createMessage(Session session) throws JMSException {
					return session.createObjectMessage(order);
				}
			}
		);

		
	}

	/**
	 * @return the jmsTemplate
	 */
	public JmsTemplate getJmsTemplate() {
		return jmsTemplate;
	}

	/**
	 * @param jmsTemplate the jmsTemplate to set
	 */
	public void setJmsTemplate(JmsTemplate jmsTemplate) {
		this.jmsTemplate = jmsTemplate;
	}

	/**
	 * @return the queueName
	 */
	public String getQueueName() {
		return queueName;
	}

	/**
	 * @param queueName the queueName to set
	 */
	public void setQueueName(String queueName) {
		this.queueName = queueName;
	}
}
El receptor

Otro thread que va leyendo de la cola los pedidos.

package info.pello.spring.messagequeue;

import java.util.Random;

import javax.jms.JMSException;
import javax.jms.ObjectMessage;


import org.springframework.jms.core.JmsTemplate;


/**
 * Receives messages to apache MQ
 * @author Pello Altadill
 * @greetz to people I met in Andersen
 */
public class MessageReceiver extends Thread {
	
	private Random random;
	private String queueName;
	private JmsTemplate jmsTemplate;
	
	/**
	 * default constructor
	 */
	public MessageReceiver (String name) {
		super(name);
		random = new Random();
	}
	
	/**
	 * main thread loop
	 */
	public void run () {
		Order order = null;
		int counter = 0;
		
		while (true) {
			try {
				sleep(random.nextInt(5));
				order = receiveMessage();
				
				if (null != order) {
					counter++;
					System.out.println("["+counter+"] Order rcv: " + order.toString());
				} else {
					System.out.println("Order is null ");					
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}

	/**
	 * reads message from queue
	 * @return Order
	 */
	private Order receiveMessage() {
		try {
			ObjectMessage receivedMessage = (ObjectMessage) jmsTemplate.receive(queueName);
			Order order = (Order) receivedMessage.getObject();
			
			return order;
			} catch (JMSException jmsException) {
				System.err.println("Error reading msg: " + jmsException.getMessage());
			}
		
		return null;
		
	}


	/**
	 * @return the jmsTemplate
	 */
	public JmsTemplate getJmsTemplate() {
		return jmsTemplate;
	}

	/**
	 * @param jmsTemplate the jmsTemplate to set
	 */
	public void setJmsTemplate(JmsTemplate jmsTemplate) {
		this.jmsTemplate = jmsTemplate;
	}

	/**
	 * @return the queueName
	 */
	public String getQueueName() {
		return queueName;
	}

	/**
	 * @param queueName the queueName to set
	 */
	public void setQueueName(String queueName) {
		this.queueName = queueName;
	}
}
La clase principal

Esta clase simplemente inicia el emisor y receptor.

package info.pello.spring.messagequeue;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * Main program, starting point of our project
 * @author Pello Altadill
 * @greetz for those who keep on working even on xmas
 */
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext context = new ClassPathXmlApplicationContext("messagequeue.xml");
		 
		MessageSender messageSender = (MessageSender) context.getBean("messageSender");
		MessageReceiver messageReceiver = (MessageReceiver) context.getBean("messageReceiver");

		messageSender.start();
		messageReceiver.start();
		
	}

}

Esto genera una serie de logs bastante verbosos, pero se va viendo como se pasan mensajes a través de activeMQ. Por cierto, en el servidor no hace falta hacer nada, más que ponerlo en marcha.

by Pello Altadill 01/06/2014 00:08:52 - 1985 hits

Acceder a web desde Android con java.net

Accceso a Web desde Android Las aplicaciones para móviles se podrían dividir en tres grandes grupos: las que se ejecutan totalmente de forma local, las que tienen toda la información en la web y las que combinan las dos cosas. Si tenemos que acceder a la web desde Android y teniendo en cuenta que lo hacemos con java tenemos dos opciones por defecto: Usar las librerías básicas de java.net Usar HttpClient HttpClient la librería de Apache ...

by Pello Altadill 11/23/2013 10:36:35 - 2118 hits

More »

Maneras de integrar Struts2 con Hibernate

Struts2 sigue siendo uno de los frameworks web para java más populares. Lo del número 2 no está de más ya que ciertamente Struts2 y Struts a secas no tienen mucho que ver en cuanto a código. Aunque sí, formalmente los dos son frameworks MVC. Pero con Struts2 no es suficiente, ¿qué pasa con el acceso a los datos? Para facilitar la gestión de datos y ante todo poder centrarnos en el negocio y no andar por ejemplo cargando listas de objetos a mano de un resultset de jdbc disponemos de Hibernate, u...

by Pello Altadill 11/17/2013 15:26:23 - 2167 hits

More »

Arreglar e Iniciar el Oracle Enterprise Manager

Hablar de Oracle trae gratos recuerdos como la saga de IronMan y en especial la tercera entrega donde me transportaron a la nube de Oracle. El Enterprise Manager es un interfaz web con el que podemos gestionar la BD de Oracle: inicio/parada/blackout, ficheros, memoria, tareas, backups, usuarios, roles, y en definitiva todos los objetos que forman parte de los...

by Pello Altadill 11/10/2013 01:01:04 - 2142 hits

More »

Errores frecuentes en aplicaciones Struts2 con Eclipse y Tomcat

Introducción ¿Tu aplicación struts2 falla? ¿Ni si quiera arranca el tomcat o te está vomitando toda la stacktrace, toda la pila de llamadas erróneas por la consola? Antes de echarse a llorar, desesperarse, increpar al proyecto apache, al profesor debes asegurarte de unos mínimos: Tu proyecto no tiene errores de compilación Tus clases y jsps no tienen ni u...

by Pello Altadill 11/01/2013 01:44:50 - 2215 hits

More »

Interfaz Metro y Shortcuts en Windows 2012

Métodos abreviados Algunas cabezas pensantes le han dado una vuelta al interfaz gráfico de las últimas versiones de Windows. Dida lo que diga el Vaticano el purgatorio y el infierno existen y debe ser el destino para los creadores de Metro, que es como se llama el interfaz que aparece ahora en al pulsar la tecla windows. Aquí dejaré unas pautas para poder sobrevivir. Pese a que existen herramientas para quitarlo, para tener un inicio normal, etc… creo que no queda más remedio que acostu...

by Pello Altadill 08/31/2013 21:56:26 - 1762 hits

More »

Montar un laboratorio con máquinas virtuales en un host

Supongamos que queremos montar un laboratorio de máquinas virtuales para jugar con servidores y clientes. Varias máquinas virtuales que queremos: que sean visibles desde el host o equipo físico, que sean visibles entre ellas yque además puedan salir al exterior a través del equipo físico. Y es más, queremos que esas máquinas virtuales tengan IP fija ya que al ser servidores no queremos que las IPs bailen Y Vamos a suponer que tenem...

by Pello Altadill 08/31/2013 00:50:13 - 4951 hits

More »

Monitorizando un servidor Windows 2012

Otra cosa no sé pero si queremos monitorizar un servidor windows por herramientas no será. En comparación revisar un linux puede parecer una tarea sencilla porque el sistema es tan simple (todo son procesos y ficheros), que con unos comandos y una revisión del log nos hacemos una idea rápido. En el caso de windows, el sistema dispone de una monitorización gráfica de serie con todo lujo de detalles, cosa que para linux te obligaría a meter cosas tipo RRDtool, mrtg, etc... aunque obviamente, de nad...

by Pello Altadill 08/30/2013 00:55:09 - 805 hits

More »

Windows 2012 Server

Con eso de escribir acerca de linux y de hacer bromas sobre lo horrible que es windows es muy común que de forma inmediata te encasillen como talibán linuxero. Más aún si eres fiel a Debian y despotricas de Ubuntu por estar hecho para ser fácil. Pero lo cierto es que ante la típica pregunta de un comercial de ¿Qué sistema es mejor? o ¿qué lenguaje es mejor? para mí la re...

by Pello Altadill 08/28/2013 23:22:53 - 614 hits

More »