lunes, 14 de mayo de 2018

Escenario de integración asincrónico usando ActiveMQ y WSO2 (II)

En el post anterior habiamos planteado el esquema para el envio de mensajes asincronicamente entre dos aplicaciones usando ActiveMQ como message broker.



Ahora voy a mostar la implementacion de la App 1, o sea la aplicacion que actua como el componente que envia los mensajes a la cola (MessageProducer).
El componente está desarrollado con spring-boot porque simplifica los pasos de tener que seleccionar las denpendencias y el despliegue en el servidor.
Esta son las dependencias de mi archivo pom.xml
<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-activemq</artifactId>
   </dependency>
   <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.2</version>
   </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
   </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
</dependencies>

Este es el controlador que recibe una petición REST y envía un mensaje a la cola.
@RestController
@RequestMapping
("/inventario")
public class HelloController {

   
@Autowired
   
private Sender sender;

   
@RequestMapping("/hello")
   
public String sayHi(){
       
return "Hello World";
   
}

   
@RequestMapping("/helloToQueue")
   
public void helloToQueue(){
        Gson gson =
new Gson();
       
Map mapaResponse = new HashMap();
       
mapaResponse.put("mensaje","Hello World");
       
mapaResponse.put("idCliente","1");
       
String message = gson.toJson(mapaResponse);
       
sender.send("donaciones",message);
   
}
}

La configuracion para conectarme al Message Broker:

@Component

public class BrokerConfig {

    private static Logger LOGGER = LoggerFactory.getLogger(BrokerConfig.class);
    @Bean
    @Primary
    public ActiveMQConnectionFactory activeMQConnectionFactory() {
        LOGGER.info("open conection");
        ActiveMQConnectionFactory activeMQConnectionFactory = 
         new ActiveMQConnectionFactory();
        activeMQConnectionFactory.setBrokerURL("tcp://localhost:61616");
        activeMQConnectionFactory.setUserName("admin");
        activeMQConnectionFactory.setPassword("admin");
        return activeMQConnectionFactory;
    }

    @Bean
    public CachingConnectionFactory cachingConnectionFactory() {
        return new CachingConnectionFactory(activeMQConnectionFactory());
    }

    @Bean
    public JmsTemplate jmsTemplate() {
            JmsTemplate template = new JmsTemplate();
            template.setConnectionFactory(cachingConnectionFactory());
            return template;
    }

}

Y la clase que se encarga de enviar el mensaje a la cola:

@Component

public class Sender {

    private static final Logger LOGGER = LoggerFactory.getLogger(Sender.class);

    @Autowired

    private JmsTemplate jmsTemplate;

    public void send(final String destination, final String message) {

        LOGGER.info("sending message='{}' to destination='{}'", message);

        jmsTemplate.send("donaciones",new MessageCreator() {

            @Override

            public Message createMessage(Session session) throws JMSException {

                TextMessage textMessage = session.createTextMessage(message);

         Destination destinationQueue = session.createQueue("response.queue");

                textMessage.setJMSReplyTo(destinationQueue);

                textMessage.setStringProperty("app","1");

                return textMessage;

            }

        });

    }

}

Escenario de integración asincrónico usando ActiveMQ y WSO2 (II)

En el post anterior habiamos planteado el esquema para el envio de mensajes asincronicamente entre dos aplicaciones usando ActiveMQ como m...