Diferencia entre revisiones de «JMS con Spring Roo»

De Dos Ideas.
Saltar a: navegación, buscar
(Alternativa 2: Utilizar una anotacion)
Línea 180: Línea 180:
 
     @PostPersist
 
     @PostPersist
 
     public void crear() {
 
     public void crear() {
        System.out.println("Estoy en PedidoController - crear");
 
 
         senderBoImpl.sendMessage("Pedido Enviado:" + this);     
 
         senderBoImpl.sendMessage("Pedido Enviado:" + this);     
 
     }
 
     }

Revisión del 18:27 28 jul 2010

Con el uso de JMS podemos hacer asincrónica la ocurrencia de un determinado evento.

Entonces, tomamos el Ejemplo de proyecto web ABM con Spring Roo y hacemos que una vez creado un nuevo pedido de pizza, se envíe un mensaje a la consola del servidor. Esto último de manera asincrónica.

Alternativa 1: Modificar el aspecto de la entidad "Pedido"

  • Comentamos la anotacion en el aspecto de la entidad:

privileged aspect PedidoController_Roo_Controller {

//@RequestMapping(value = "/pedido", method = RequestMethod.POST)

   public String PedidoController.create

  • Agregamos un método "crear" en el Controller para crear el pedido y donde vamos a inyectar el uso de mensajeria para mandar el aviso:

public class PedidoController {

   @RequestMapping(value = "/pedido", method = RequestMethod.POST)
   public String crear(@Valid Pedido pedido, BindingResult result, ModelMap modelMap) {
   	System.out.println("Estoy en PedidoController - crear");
       String resultado = create(pedido, result, modelMap);
       return resultado;
   }	

}

  • Ejecutamos el comando JMS de Spring Roo para crear una cola en memoria:

jms setup --provider ACTIVEMQ_IN_MEMORY --destinationType QUEUE --destinationName dosIdeasQueue Created SRC_MAIN_RESOURCES\META-INF\spring\applicationContext-jms.xml Managed SRC_MAIN_RESOURCES\META-INF\spring\applicationContext-jms.xml Managed ROOT\pom.xml Managed ROOT\pom.xml Managed ROOT\pom.xml Managed ROOT\pom.xml Managed ROOT\pom.xml Managed ROOT\pom.xml

  • Ejecutamos el comando de Spring Roo para crear el template:

field jms template --class com.dosideas.roo.oracle.web.PedidoController --fieldName jmsTemplate Managed SRC_MAIN_JAVA\com\dosideas\roo\oracle\web\PedidoController.java Managed SRC_MAIN_JAVA\com\dosideas\roo\oracle\web\PedidoController.java Managed SRC_MAIN_JAVA\com\dosideas\roo\oracle\web\PedidoController_Roo_Controller.aj

Cada vez que se ejecuta un comando, Spring Roo re-escribe la anotación en el aspecto:

@RequestMapping(value = "/pedido", method = RequestMethod.POST)

Entonces, queda anotado en el aspecto y el controller de la entidad y al crear un pedido en runtime, da error.

  • Ejecutamos el comando de Spring Roo para crear el listener:

jms listener class --class com.dosideas.roo.oracle.jms.JmsQueueListener --destinationName dosIdeasQueue --destinationType QUEUE Created SRC_MAIN_JAVA\com\dosideas\roo\oracle\jms Created SRC_MAIN_JAVA\com\dosideas\roo\oracle\jms\JmsQueueListener.java Managed SRC_MAIN_RESOURCES\META-INF\spring\applicationContext-jms.xml

  • En el onMessage, escribimos el mensaje que queremos enviar:

public class JmsQueueListener {

   public void onMessage(Object message) {
       System.out.println("Pedido recibido por JMS: " + message);
   }

}

  • En el controller, agregamos el uso de la mensajería -sendMessage-:

public class PedidoController {

   @RequestMapping(value = "/pedido", method = RequestMethod.POST)
   public String crear(@Valid Pedido pedido, BindingResult result, ModelMap modelMap) {
   	System.out.println("Estoy en PedidoController - crear");
       String resultado = create(pedido, result, modelMap);
       sendMessage("Pedido Enviado:" + pedido); 
       return resultado;
   }
   public void sendMessage(Object messageObject) {
       jmsTemplate.convertAndSend(messageObject);
   }

}


  • Ejecutamos la aplicación, creamos un pedido y vemos el siguiente mensaje en consola:

Pedido Enviado:Id: 1, Version: 0, Nombre: aa, Direccion: aa, Importe: 11.0, FechaEntrega: Tue Jul 27 00:00:00 VET 2010, Pizzas: 0

Alternativa 2: Utilizar una anotacion

  • Ejecutamos el comando JMS de Spring Roo para crear una cola en memoria:

jms setup --provider ACTIVEMQ_IN_MEMORY --destinationType QUEUE --destinationName dosIdeasQueue Created SRC_MAIN_RESOURCES\META-INF\spring\applicationContext-jms.xml Managed SRC_MAIN_RESOURCES\META-INF\spring\applicationContext-jms.xml Managed ROOT\pom.xml Managed ROOT\pom.xml Managed ROOT\pom.xml Managed ROOT\pom.xml Managed ROOT\pom.xml Managed ROOT\pom.xml

  • Ejecutamos el comando de Spring Roo para crear el template:

field jms template --class com.dosideas.roo.oracle.web.PedidoController --fieldName jmsTemplate Managed SRC_MAIN_JAVA\com\dosideas\roo\oracle\web\PedidoController.java Managed SRC_MAIN_JAVA\com\dosideas\roo\oracle\web\PedidoController.java Managed SRC_MAIN_JAVA\com\dosideas\roo\oracle\web\PedidoController_Roo_Controller.aj

  • Ejecutamos el comando de Spring Roo para crear el listener:

jms listener class --class com.dosideas.roo.oracle.jms.JmsQueueListener --destinationName dosIdeasQueue --destinationType QUEUE Created SRC_MAIN_JAVA\com\dosideas\roo\oracle\jms Created SRC_MAIN_JAVA\com\dosideas\roo\oracle\jms\JmsQueueListener.java Managed SRC_MAIN_RESOURCES\META-INF\spring\applicationContext-jms.xml

  • En el onMessage, escribimos el mensaje que queremos enviar:

public class JmsQueueListener {

   public void onMessage(Object message) {
       System.out.println("Pedido recibido por JMS: " + message);
   }

}

  • Agregamos una capa de negocio para la funcionalidad que agregamos:

package com.dosideas.roo.oracle.business;

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

@Service public class JmsQueueSenderBoImpl {

   @Autowired
   private transient JmsTemplate jmsTemplate;
   public void sendMessage(Object messageObject) {
       jmsTemplate.convertAndSend(messageObject);
   }

}

  • En la entidad Pedido.java, agregamos el uso de un servicio anotado en la clase de negocio:

   @Autowired
   private transient JmsQueueSenderBoImpl senderBoImpl;
   
   @PostPersist
   public void crear() {
       senderBoImpl.sendMessage("Pedido Enviado:" + this);     
   }


  • Ejecutamos la aplicación, creamos un pedido y vemos el siguiente mensaje en consola:

Pedido Enviado:Id: 1, Version: 0, Nombre: aa, Direccion: aa, Importe: 11.0, FechaEntrega: Tue Jul 27 00:00:00 VET 2010, Pizzas: 0

Ver tambien