Peticion respuesta con AciveMQ

De ChuWiki

Con ActiveMQ podemos enviar un mensaje solicitando una respuesta, de forma que el que lo recibe nos envía la respuesta y la recibimos sólo nosotros. Veamos un ejemplo sencillo de cómo hacerlo. Damos por supuesto que sabes lo básico de ActiveMQ, si no, mejor leer primero ActiveMQ embebido en Java, no por la parte de ActiveMQ embebido en Java, sino por cómo enviar los mensajes


La petición[editar]

Una vez tenemos la conexión con ActiveMQ, creamos la cola en la que vamos a hacer la petición. Evidentemente, alguien tiene que estar escuchando en esa misma cola para enviar la respuesta. La creación de la cola y del "productor" para enviar mensajes por ella sería

      Destination destination = session.createQueue("THE.QUEUE");
      MessageProducer producerForRequest = session.createProducer(destination);
      producerForRequest.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

Para recibir la respuesta, hay que crear una cola temporal usando el método createTemporaryQuery(). También, por supuesto, un consumidor para esta cola temporal y enterarnos de la llegada del mensaje de respuesta. Añadimos también un listener para hacer algo cuando llegue el mensaje de respuesta.

      Destination queueForResponse = session.createTemporaryQueue();
      MessageConsumer consumerForResponse = session
            .createConsumer(queueForResponse);

      consumerForResponse.setMessageListener(new MessageListener() {

         public void onMessage(Message message) {
            System.out.println("Received response : " + message);
         }
      });

Al enviar el mensaje de petición, debemos indicar la cola temporal donde esperamos la respuesta y enviar el mensaje

      TextMessage request = session.createTextMessage();
      request.setText("request");
      request.setJMSReplyTo(queueForResponse);
      producerForRequest.send(request);

Como se ve, el "truco" aquí es llamar al método setJMSReplyTo() del mensaje indicando la cola temporal donde esperaremos la respuesta.


El receptor[editar]

En otro sitio, donde se quiera tratar el mensaje, creamos un consumidor para ese mensaje

      
Destination destination = session.createQueue("THE.QUEUE");
MessageConsumer consumerForRequest = session.createConsumer(destination);

Este consumidor se suscribe a la llegada de mensajes y envía la respuesta

      consumerForRequest.setMessageListener(new MessageListener() {

         public void onMessage(Message request) {
            try {
               System.out.println("Answering ... ");
               TextMessage response = session.createTextMessage();
               response.setText("Response");
               response.setJMSCorrelationID(request.getJMSCorrelationID());
               
               MessageProducer producerForResponse = session.createProducer(request.getJMSReplyTo());
               producerForResponse.send(response);
               producerForResponse.close();
            } catch (Exception e) {
               e.printStackTrace();
            }

         }
      });

Cuando ActiveMQ envía el mensaje de petición, le pone un "identificador" de quién ha enviado el mensaje. Este identificador se puede obtener con request.getJMSCorrelationID(), siendo request el mensaje de petición que se ha enviado. En nuestro mensaje de respuesta, debemos indicar quien es el destinatario, para ello, debemos meter este identificador en response.setJMSCorrelationID(), siendo response el mensaje de respuesta que estamos construyendo para enviar. De esta forma, sólo el que ha pedido la respuesta, la recibirá.

Por otro lado, debemos enviar la respuesta en la cola temporal que se creó en el paso anterior. Esta cola se obtiene nuevamente del mensaje de petición, con el método request.getJMSReplyTo(). Así que creamos un nuevo productor que envíe la respuesta por esta cola, y la enviamos.

Listo, si todo va bien, debemos recibir la respuesta en el que ha enviado la petición.


Código completo[editar]

Tienes el código completo de este ejemplo en [1]