style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Mensajería en las aplicaciones(Parte 2)

Primer entrega aquí
Modelos de envío en JMS

La diferencia entre un Topic y una Queue es que en el caso de de los Topic todos sus subscriptores reciben el mismo mensajes cuando el mensaje es publicado y en el caso de las Queue es que solo un receptor recibe el mensaje cuando este es depositado en la cola.

Diagramas

Topic:
Este término es utilizado para enviar mensajes de uno a varios destinatarios (sistemas) y utiliza el modelo publish-subscribe

Queue:
Este termino es utilizado cuando se planea que el mensaje sea enviado únicamente a un receptor cuando un “Sender” envía un mensaje a la cola.

Casos prácticos

Ahora definiré un par de casos prácticos donde se utilizan este tipo de modelos.

Topic:
Supongamos que tenemos una aplicación de administración de productos y debemos informar a todos nuestros clientes cuando un nuevo producto es agregado a nuestro catalogo.
Para esto nosotros brindamos a nuestros clientes su subscripción con un costo de 100 pesos con el fin de garantizarles que tendrán la primicia en saber de nuestros nuevos productos y no tener que comprar la revista mensual y así poder alimentar sus sistemas.

Así que, cuando nosotros agreguemos un producto. El sistema publica el mensaje y todos nuestros suscriptores sabrán en tiempo real acerca de los productos agregados.

Queue:
Tenemos una aplicación de compra con tarjeta de crédito dando al realizar una compra se le envíe un correo al usuario informándole que su transacción esta siendo procesada y pronto se le enviara una respuesta con su autorización. Para que hacemos esto? Para no dejar al cliente esperando en línea mientras su transacción es procesada, entonces. El sistema lo que hace es depositar un mensaje en la cola y listo! Se notifica al usuario que pronto se le notificara, mientras tanto el receptor que tome el mensaje hará la consulta con el banco correspondiente para saber que el usuario tiene fondos suficientes para su compra y así de esta forma informarle si su transacción es exitosa o no.

Ejemplo simple de envío de mensajes con ApacheMQ

NOTA: Para este ejemplo se requiere este software.

Descargamos los binarios de la aplicación y los descomprimimos en una carpeta, la cual llamare APACHEMQ_HOME

Entramos a APACHEMQ_HOME/bin y ejecutamos el siguiente comando:
Java –jar run.jar start
Con esto, nuestro servidor de mensajería esta listo, y si escribimos en el navegador la siguiente ruta http://localhost:8161/admin/
Veremos la siguiente pantalla

Ya teniendo el servidor ejecutando, podremos crear nuestras colas desde la pestaña de queues

Ahora, ya teniendo esto… pasemos al código. En el siguiente ejemplo mostrare como enviar un mensaje y mas adelante como recibirlo.

package mensajeria;

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;

/**
 *
 * @author Jali
 */

public class Mensajero {

    /**
     * @param args the command line arguments
     */

    private Connection connection;

    private ActiveMQConnectionFactory connectionFactory;
    public boolean enviaMensaje(String mensaje) {
        boolean retorno = false;
        try {
            connectionFactory = new ActiveMQConnectionFactory("system", "manager", "tcp://localhost:61616");
            connection = connectionFactory.createConnection();
            connection.start();

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            Destination destination = session.createQueue("FOO");

            MessageProducer producer = session.createProducer(destination);
            TextMessage message = session.createTextMessage(mensaje);
            producer.send(message);
            producer.close();
            session.close();
            connection.close();
            retorno = true;
        } catch (JMSException ex) {
            retorno = true;
            System.out.println(ex.getMessage());
        }
        return retorno;
    }

    public static void main(String[] args) {
        Mensajero mensajero = new Mensajero();
        mensajero.enviaMensaje("hola");
    }
}

Después de ejecutar el código anterior nos dirigimos a nuestro navegador web y en la pestaña de colas, debió aparecer la cola FOO y debe contener un mensaje.

Al dar click en la cola nos mostrara los mensajes que estan contenidos en esta.

Y al dar click en el mensaje podremos ver el mensaje enviado.

Y listo! Ya enviamos mensajes a una cola!!
Ahora… ¿Cómo lo consumimos?

Para esto debemos crear un receptor… el cual debe tener un MessageListener que apunte a la cola que deseamos monitorear.

package mensajeria;

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;

/**
 *
 * @author Jali
 */

public class QueueListener implements MessageListener {

    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("system", "manager", "tcp://localhost:61616");
    private final Connection connection;
    private final Session session;
    private final MessageConsumer consumer;

    QueueListener(String cola) throws JMSException {
        connection = connectionFactory.createConnection();

        connection.start();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue(cola);
        consumer = session.createConsumer(destination);
        consumer.setMessageListener(this);
    }

    public void onMessage(Message msg) {
        try {
            TextMessage txtMessage = (TextMessage) msg;
            System.out.println("El mensaje es: " + txtMessage);
            System.out.println("**************************\n");
            System.out.println("El texto del mensaje es: " + txtMessage.getText());

        } catch (JMSException ex) {
            System.out.println("La excepcion es: " + ex.getMessage()) ;
        }
    }
    public static void main(String[] args) throws JMSException {
        new QueueListener("FOO");
    }
}

Al ejecutar este codigo, nos daremos cuenta que esta clase se queda corriendo. Esto es debido al MessageListener que implementa y nos daremos cuenta que nos pintara en consola lo siguiente:

El mensaje es: ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId = ID:acasarru1-1806-1272064274636-0:0:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:acasarru1-1806-1272064274636-0:0:1:1, destination = queue://FOO, transactionId = null, expiration = 0, timestamp = 1272064274839, arrival = 0, brokerInTime = 1272064274839, brokerOutTime = 1272064274917, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, text = hola}
**************************

El texto del mensaje es: hola

Listo, ya podemos enviar y recibir mensajes

Saludos

PD Si alguien requiere el zip favor de solicitarmelo ya que no lo puedo adjuntar aqui.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

GRACIAS

Gracias hermano, llevo unos días estudiando y tratando de comprender esto, lo pusiste en bandeja de plata, salu2

Imagen de jali

No hay de que

Espero que te sirva y ps cualquier cosa pues por aca ando.

Jali Consulta

Buenas y muchas gracias por la info =D .. .pero estoy ejecutando la clase Mensajero y me arroja el siguiente error:

java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder

cuando quiere ejecutar la siguiente linea connectionFactory = new ActiveMQConnectionFactory("system", "manager", "tcp://localhost:61616");

Yo agregue las librerias que me incluia el ActiveMQ 5.5.1. Me podras dar una mano ??

Muchas Gracias.

Imagen de ezamudio

RTFS

RTFS.

Es obvio el error si le dedicas dos segundos, menos de lo que te tardaste en copiar/pegar:

java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder

NoClassDefFoundError es un error en tiempo de ejecución que ocurre cuando se necesita cargar una clase que no se encuentra en el classpath. Y te indica la clase que no encontró. Simplemente sustituye las diagonales por puntos y obtendras org.slf4j.impl.StaticLoggerBinder. Y entonces buscas eso en Google.

Tu problema seguramente es que metiste sólo slf4j-api.jar pero no tienes ninguna implementación para tiempo de ejecución. Necesitas SLF4J para log4j o JUL o logback, o aunque sea el slf4j-simple, dependiedo del sistema de logging que use el ambiente donde ocurrió este problema.

RTFS

Muchas Gracias por la respuesta!! ahora voy a buscarlo..

Consulta

Me anduvo de maravilla... Ahora les queria hacer una consulta. Asi tal cual tengo el codigo, si lo quiero deployar en el WAS de ibm tendria que modificar algo ?? o solo tendria que configurar una cola con el nombre que tiene seteado el proyecto....

Muchas Gracias

Consulta

Que tipos de mensajes puede mandar Santa y cuando se entera que los niños estan disfrutando de los juguetes

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">