Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache...

38
Message Oriented Middleware: Java JMS LSUB GSYC 27 de abril de 2016

Transcript of Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache...

Page 1: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Message Oriented Middleware: Java JMS

LSUB

GSYC

27 de abril de 2016

Page 2: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

(cc) 2016 Laboratorio de Sistemas,Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento -

NoComercial - SinObraDerivada (by-nc-nd). Para obtener la licencia completa, veasehttp://creativecommons.org/licenses/. Tambien puede solicitarse a Creative Commons, 559 Nathan Abbott Way,

Stanford, California 94305, USA.

Las imagenes de terceros conservan su licencia original.

Page 3: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

MOM

I MOM: Message Oriented Middleware. JMS (Java MessageService) es el MOM de Java.

I Permite la comunicacion debilmente acoplada, fiable, sıncronay asıncrona entre clientes mediante el paso de mensajes.

I Es una especificacion de API que forma parte de Java EE, haymultiples implementaciones.

I El MOM depende de un servicio central o broker paragestionar los mensajes.

I Usaremos GlassFish como servidor de aplicaciones Java EE.

I Existen muchos otros sistemas de MQ (message queue):RabbitMQ, ZeroMQ, Apache ActiveMQ, etc,

Page 4: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

OOM/RPC vs MOM

OOM/RPC vs MOM

I RPC: el objetivo es ejecutar un procedimiento: ”haz esto”.

I MOM: el objetivo es notificar un evento: ”ha pasado esto”.

Page 5: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

JMS

¿Cuando se usa una comunicacion debilmente acoplada?

I Si el emisor quiere no saber nada del receptor y viceversa.Solo se debe saber el formato de los mensajes.

I No se quiere depender de las interfaces del resto decomponentes, como en RCP/RMI.

I No se quiere depender de la ejecucion de los otroscomponentes: los mensajes pueden quedar almacenados en elsistema y ser atendidos mas tarde.

Page 6: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

JMS

Una aplicacion JMS se compone de:

I Clientes: componentes que envıan y reciben mensajes. Segarantiza que el mensaje se entrega justo una vez.

I Mensajes: objetos de comunicacion entre componentes.

I Proveedor JMS: el sistema que implementa el API de JMS. Laplataforma Java EE proporciona un proveedor de JMS. Haydistintas implementaciones.

I Los objetos administrados (administered objects) necesariospara interactuar con el proveedor. Se administran medianteuna herramienta, no programaticamente.

Page 7: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

JMS

Hay tipos de comunicacion en JMS:

I Point-to-point.

I Publish/subscribe.

Page 8: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Point-to-Point

I Un consumidor por mensaje.

I Colas de mensajes persistentes: emisor y receptor no tienendependencia temporal.

I Los mensajes se entregan ordenados.

I El receptor confirma el procesamiento de un mensaje.

Imagen: (c) Oracle

Page 9: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Publish/Subscribe

I Multiples consumidores por mensaje.

I Un consumidor se subscribe a un tema (topic).

I El receptor debe estar activo para recibir: emisor y receptortienen dependencia temporal.

Imagen: (c) Oracle

Page 10: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

JMS

Tipos de mensajes:

I Text: Strings.

I Object: Un objeto Serializable.

I Bytes: Un array de bytes.

I Map: Un diccionario.

I Stream: Un stream de valores primitivos.

Page 11: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Administered Objects

La herramienta de configuracion de Java EE nos permiteadministrar dos tipos de objetos administrados:

I ConnectionFactory: crea conexiones con el proveedor deJMS.

I Queue connection factory: para Point-To-Point.I Topic connection factory: para Publish/Subscribe.I Connection factory: para ambas.

I Destination: representa emisores y destinatarios.I Queue: para Point-To-Point.I Topic: para Publish/Subscribe.

Page 12: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Administracion: GlassFish

I Crear un dominio (una o mas instancias del servidor de apliaciones) que tieneasociados estos puertos TCP entre otros:

I Un puerto para el servidor de aplicaciones (8080 por omision).I Un puerto de administracion (4848 por omision).I Un puerto de JMS (7070 por omision).I Un puerto de IIOP para RMI/CORBA (3700 por omision).

asadmin create-domain mydomain

asadmin list-domains

I Arrancar el dominio y la base de datos con la herramienta asadmin:

asadmin start-domain mydomain

asadmin start-database

I Arrancar un navegador: http://localhost:4848

Page 13: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Administracion: GlassFish

I Configurar JMS Default Host con la direccion de la maquina que ejecuta elbroker de JMS (en este caso la maquina en la que ejecuta GlassFish).

Configurations → JavaMessageService → default JMS host

I Crear los objetos administrados de JMS (JMS Resources):

Resources → JMSResources → ConnectionFactories

Resources → JMSResources → DestinationResources

I Nombre (JNDI).I Tipo de recurso.

Page 14: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Administracion: GlassFish

Page 15: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Administracion: GlassFish

Page 16: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Administracion: GlassFish

Page 17: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

JNDI

I Los recursos se registran en un espacio de nombres de JNDI(Java Naming and Directory Interface).

I JNDI es una interfaz homogenea para distintos sistemas denombrado (LDAP, CORBA, NDS, etc.).

I En JMS se usa para localizar los objetos administrados.

I Por omision se conecta a localhost:3700. P. ej, pararesolver un nombre:

I n i t i a l C o n t e x t j n d i = new I n i t i a l C o n t e x t ( ) ;QueueConnect ionFactory q F a c t o r y =

( QueueConnect ionFactory ) j n d i . l o o k u p ( ” F a c t o r i a 1 ” ) ;// Lookup queueQueue queue = ( Queue ) j n d i . l o o k u p ( ” Cola1 ” ) ;

Page 18: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

JNDI

I Si el servidor JNDI esta en otra parte, hay que definirlo en laspropiedades. P. ej.:

Hashtab le<S t r i n g , S t r i n g > p = new Hashtab le<S t r i n g , S t r i n g >() ;p . put ( Context . INITIAL CONTEXT FACTORY ,

”com . sun . e n t e r p r i s e . naming . S e r i a l I n i t C o n t e x t F a c t o r y ” ) ;p . put ( Context . PROVIDER URL ,

” i i o p : / / m i s e r v i d o r . midominio . com : 3 7 0 0 ” ) ;I n i t i a l C o n t e x t j n d i = new I n i t i a l C o n t e x t ( p ) ;

Page 19: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Modelo

I Conexion: objeto que representa la conexion con el proveedorde JMS.

I Sesion: contexto para enviar y recibir mensajes desde un unicothread. La sesion crea mensajes, productores y consumidorespara su thread (no se deben usar desde otros threads).

Page 20: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Modelo

Imagen: (c) Oracle

Page 21: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Interfaces

Page 22: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Conexion Point-to-Point

I El metodo createQueueConnection de la factorıa crea unaconexion con el proveedor de JMS.

I Dentro de una conexion podemos crear una o mas sesionespara enviar, recibir, etc.

I El metodo close() cierra la conexion y todo lo que dependede ella (sesiones, etc.).

QueueConnect ion c o n n e c t i o n = f a c t o r y . c r e a t e Q u e u e C o n n e c t i o n ( ) ;QueueSess ion s e s s i o n =

c o n n e c t i o n . c r e a t e Q u e u e S e s s i o n ( f a l s e , QueueSess ion .AUTO ACKNOWLEDGE) ;

Page 23: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Sesion Point-to-Point

I El primer argumento de createQueueSession inica si lasesion es transaccional.

I Si no es transaccional, hay que indicar un modo deasentimiento de la recepcion del mensaje (si es transaccionalse ignora el segundo argumento):

I AUTO ACKNOWLEDGE: se hace automaticamente.I CLIENT ACKNOWLEDGE: el receptor debe invocar el metodo

acknowledge() manualmente. Si una sesion termina sinconfirmar la recepcion de un mensaje, el mensaje vuelve aestar disponible en la cola. La confirmacion de un mensajeconfirma todos los mensajes anteriores recibidos en la sesion.

Page 24: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Sesion

La sesion nos permite crear objetos de tipo:

I QueueReceiver para recibir mensajes. Aunque es posibletener dos sesiones distintas con QueueReceivers para lamisma cola, el estandar de JMS no define como se repartenlos mensajes. Solo un consumidor recibe el mensaje.

I QueueSender para enviar mensajes.

I QueueBrowser para inspeccionar mensajes en la cola sinsacarlos.

I TemporaryQueue para crear una cola temporal que solosobrevive a la conexion en la que se crea.

Page 25: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Sesion Transaccional

I La transaccion es entre un extremo y el proveedor de JMS, noentre los extremos.

I Semantica: los mensajes se ponen/quitan de la colas todos oninguno.

I Forman parte de la transaccion todos los mensajes enviados yrecibidos en la sesion entre dos invocaciones decommit()/rollback(), potencialmente de distintas colas.

I Transaction Commit: todos los mensajes producidos estanenviados y todos los mensajes consumidos entan asentidos.

I Transaction Rollback: todos los mensajes producidos se handestruido y todos los mensajes consumidos se han devuelto.

Page 26: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Sesion Transaccional

Envıo:

I Despues de enviar, los mensajes no estan disponibles en la colahasta que no se invoque el metodo commit() de la sesion.

I Si se invoca rollback() en su lugar, los mensajes de latransaccion no llegan nunca a estar disponibles en la cola.

Page 27: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Sesion Transaccional

Recepcion:

I Los mensajes recibidos en la transaccion no se eliminan de lacola mientras se van recibiendo; se eliminan de la cola cuandoel receptor invoca commit(), despues de recibirlos.

I Si se invoca rollback() en su lugar, todos los mensajes de latransaccion vuelven a estar disponibles en la cola.

Page 28: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Cierre

I Cuando ya no se van a utilizar, hay que cerrar losreceptores/emisores, sesiones y conexiones, llamando aclose().

I El cierre de una sesion cierra los receptores/emisores que lapertenecen.

I El cierre de una conexion cierra las sesiones correspondientes.

Page 29: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Ejemplo Point-To-Point: Sender

// e x c e p t i o n s a r e i g no r e d i n t h i s exampleI n i t i a l C o n t e x t j n d i = new I n i t i a l C o n t e x t ( ) ;QueueConnect ionFactory f a c t o r y =

( QueueConnect ionFactory ) j n d i . l o o k u p ( ” F a c t o r i a 1 ” ) ;Queue queue = ( Queue ) j n d i . l o o k u p ( ” Cola1 ” ) ;

QueueConnect ion c o n n e c t i o n = f a c t o r y . c r e a t e Q u e u e C o n n e c t i o n ( ) ;QueueSess ion s e s s i o n =

c o n n e c t i o n . c r e a t e Q u e u e S e s s i o n ( f a l s e , QueueSess ion .AUTO ACKNOWLEDGE) ;QueueSender s e n d e r = s e s s i o n . c r e a t e S e n d e r ( queue ) ;

f o r ( i n t i = 0 ; i < 1 0 ; i ++){TextMessage msg = s e s s i o n . c r e a t e T e x t M e s s a g e ( ) ;msg . s e t T e x t ( ” Message ” + i + ” to Cola1 ! ” ) ;s e n d e r . send ( msg ) ;System . e r r . p r i n t ( ” . ” ) ;Thread . s l e e p ( 1 0 0 0 ) ;

}c o n n e c t i o n . c l o s e ( ) ; // c l o s e s the connec t i on , the s e s s i o n and the r e c e i v e r

Page 30: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Ejemplo Point-To-Point: Synchronous Receiver

// e x c e p t i o n s a r e i g no r e d i n t h i s exampleI n i t i a l C o n t e x t j n d i = new I n i t i a l C o n t e x t ( ) ;QueueConnect ionFactory f a c t o r y =

( QueueConnect ionFactory ) j n d i . l o o k u p ( ” F a c t o r i a 1 ” ) ;Queue queue = ( Queue ) j n d i . l o o k u p ( ” Cola1 ” ) ;

QueueConnect ion c o n n e c t i o n = f a c t o r y . c r e a t e Q u e u e C o n n e c t i o n ( ) ;QueueSess ion s e s s i o n =

c o n n e c t i o n . c r e a t e Q u e u e S e s s i o n ( f a l s e , QueueSess ion .AUTO ACKNOWLEDGE) ;Q u e u e R e c e i v e r r e c e i v e r = s e s s i o n . c r e a t e R e c e i v e r ( queue ) ;

c o n n e c t i o n . s t a r t ( ) ;System . e r r . p r i n t l n ( ” L i s t e n i n g . . . ” ) ;f o r ( ; ; ) {

Message msg = r e c e i v e r . r e c e i v e ( ) ;i f ( msg == n u l l ){

System . out . p r i n t l n ( ”no more messages ! ” ) ;break ;

}i f ( msg i n s t a n c e o f TextMessage ){

TextMessage m = ( TextMessage ) msg ;System . out . p r i n t l n ( ” Message r e c e i v e d : ” + m. getText ( ) ) ;

}}c o n n e c t i o n . c l o s e ( ) ; // c l o s e s the connec t i on , the s e s s i o n and the r e c e i v e r

Page 31: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Ejemplo Point-To-Point: Asynchronous Receiver

// e x c e p t i o n s and c l o s e ( ) c a l l s a r e i g no r e d i n t h i s examplep r i v a t e c l a s s A s y n c R e c e i v e r implements Runnable , M e s s a g e L i s t e n e r{

p r i v a t e QueueConnect ion c o n n e c t i o n ;p r i v a t e Queue queue ;p u b l i c A s y n c R e c e i v e r ( QueueConnect ion con , Queue queue ){

t h i s . c o n n e c t i o n = con ;t h i s . queue = queue ;

}@ O v e r r i d ep u b l i c v o i d run (){

t r y {QueueSess ion s e s s i o n =

c o n n e c t i o n . c r e a t e Q u e u e S e s s i o n ( f a l s e , QueueSess ion .AUTO ACKNOWLEDGE) ;Q u e u e R e c e i v e r r e c e i v e r = s e s s i o n . c r e a t e R e c e i v e r ( queue ) ;r e c e i v e r . s e t M e s s a g e L i s t e n e r ( t h i s ) ;System . out . p r i n t l n ( Thread . c u r r e n t T h r e a d ( ) . g e t I d ( ) + ” l i s t e n i n g ! ” ) ;// The th r ead w i l l be do ing i t s j obdoJob ( ) ;

}catch ( E x c e p t i o n e ){ . . . } f i n a l l y { . . . }}@ O v e r r i d ep u b l i c v o i d onMessage ( Message msg ) {

t r y {TextMessage m = ( TextMessage ) msg ;System . out . p r i n t l n ( ” L i s t e n e r , Thread ” +

Thread . c u r r e n t T h r e a d ( ) . g e t I d ( ) + ” message r e c e i v e d : ” + m. getText ( ) ) ;} catch ( JMSException e ) { . . . } f i n a l l y { . . . }

}}

Page 32: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Publish/Subscribe

I La conexion y la sesion se crea de forma similar, pero usandolas interfaces de Topic en lugar de las de Queue.

I El emisor se crea con el metodo createPublisher() de lasesion. Recibe como parametro el Topic al que se quiereenviar.

I Para recepcion sıncrona, debemos instanciar un objetoMessageConsumer invocando createConsumer().

I Para recepcion asıncrona, debemos instanciar un objetoTopicSubscriber invocando createSubscriber() einstalar un manejador: un objeto que implemente la interfazMessageListener.

Page 33: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Ejemplo Pub/Sub: Sender

t r y {

I n i t i a l C o n t e x t j n d i = new I n i t i a l C o n t e x t ( ) ;T o p i c C o n n e c t i o n F a c t o r y f a c t o r y =

( T o p i c C o n n e c t i o n F a c t o r y ) j n d i . l o o k u p ( ” F a c t o r i a 2 ” ) ;Topic t o p i c = ( Topic ) j n d i . l o o k u p ( ” Topic1 ” ) ;

T o p i c C o n n e c t i o n c o n n e c t i o n = f a c t o r y . c r e a t e T o p i c C o n n e c t i o n ( ) ;T o p i c S e s s i o n s e s s i o n =

c o n n e c t i o n . c r e a t e T o p i c S e s s i o n ( f a l s e , T o p i c S e s s i o n .AUTO ACKNOWLEDGE) ;T o p i c P u b l i s h e r p u b l i s h e r = s e s s i o n . c r e a t e P u b l i s h e r ( t o p i c ) ;

f o r ( i n t i = 0 ; i < 1 0 ; i ++){TextMessage msg = s e s s i o n . c r e a t e T e x t M e s s a g e ( ) ;msg . s e t T e x t ( ” Message ” + i + ” to Cola1 ! ” ) ;p u b l i s h e r . p u b l i s h ( msg ) ;System . e r r . p r i n t ( ” . ” ) ;Thread . s l e e p ( 1 0 0 0 ) ;

}c o n n e c t i o n . c l o s e ( ) ;

}catch ( E x c e p t i o n e ){e . p r i n t S t a c k T r a c e ( ) ;

}

Page 34: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Ejemplo Pub/Sub: Synchronous Receiver

t r y {I n i t i a l C o n t e x t j n d i = new I n i t i a l C o n t e x t ( ) ;T o p i c C o n n e c t i o n F a c t o r y f a c t o r y =

( T o p i c C o n n e c t i o n F a c t o r y ) j n d i . l o o k u p ( ” F a c t o r i a 2 ” ) ;Topic t o p i c = ( Topic ) j n d i . l o o k u p ( ” Topic1 ” ) ;

T o p i c S e s s i o n s e s s i o n =c o n n e c t i o n . c r e a t e T o p i c S e s s i o n ( f a l s e , T o p i c S e s s i o n .AUTO ACKNOWLEDGE) ;

MessageConsumer consumer = s e s s i o n . c reateConsumer ( t o p i c ) ;

System . out . p r i n t l n ( ” Thread ” + Thread . c u r r e n t T h r e a d ( ) . g e t I d ( ) + ” l i s t e n i n g ! ” ) ;f o r ( ; ; ) {

f o r ( ; ; ) {Message msg = consumer . r e c e i v e ( ) ;i f ( msg == n u l l ){

System . out . p r i n t l n ( ”no more messages ! ” ) ;break ;

}i f ( msg i n s t a n c e o f TextMessage ){

TextMessage m = ( TextMessage ) msg ;System . out . p r i n t l n ( ”Consumer , Thread ” +

Thread . c u r r e n t T h r e a d ( ) . g e t I d ( ) +” message r e c e i v e d : ” + m. getText ( ) ) ;

}}

}catch ( E x c e p t i o n e ){ . . .} f i n a l l y { . . .}

Page 35: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Ejemplo Pub/Sub: Asynchronous Receiver

// e x c e p t i o n s and c l o s e ( ) c a l l s a r e i g no r e d i n t h i s examplep r i v a t e s t a t i c c l a s s A s y n c R e c e i v e r implements Runnable , M e s s a g e L i s t e n e r{

p r i v a t e T o p i c C o n n e c t i o n c o n n e c t i o n ;p r i v a t e Topic t o p i c ;p u b l i c A s y n c R e c e i v e r ( T o p i c C o n n e c t i o n con , Topic t o p i c ){

t h i s . c o n n e c t i o n = con ;t h i s . t o p i c = t o p i c ;

}@ O v e r r i d ep u b l i c v o i d run (){

t r y {T o p i c S e s s i o n s e s s i o n =

c o n n e c t i o n . c r e a t e T o p i c S e s s i o n ( f a l s e , T o p i c S e s s i o n .AUTO ACKNOWLEDGE) ;T o p i c S u b s c r i b e r s u b s c r i b e r = s e s s i o n . c r e a t e S u b s c r i b e r ( t o p i c ) ;s u b s c r i b e r . s e t M e s s a g e L i s t e n e r ( t h i s ) ;System . out . p r i n t l n ( ” Thread ” + Thread . c u r r e n t T h r e a d ( ) . g e t I d ( ) + ” s u b s c r i b e d ! ” ) ;// The th r ead w i l l be do ing i t s j obdoJob ( ) ;

}catch ( E x c e p t i o n e ){ . . .} f i n a l l y { . . .}}@ O v e r r i d ep u b l i c v o i d onMessage ( Message msg ) {

t r y {TextMessage m = ( TextMessage ) msg ;System . out . p r i n t l n ( ” S u b s c r i b e r , Thread ” +

Thread . c u r r e n t T h r e a d ( ) . g e t I d ( ) + ” message r e c e i v e d : ” + m. getText ( ) ) ;} catch ( JMSException e ) { . . . } f i n a l l y { . . .}

}}

Page 36: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Ejecucion

En la maquina en la que ejecuta GlassFish:

# $GLASSFISH i s t h e path to t h e G l a s s F i s h d i r e c t o r y :j a v a −cp jmsexample . j a r : $GLASSFISH/ g l a s s f i s h / l i b / gf−c l i e n t . j a r

org . l s u b . jmsexample . P2PRece iver

Page 37: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

Ejecucion

En otras maquinas:

I No hace falta ejecutar GlassFish en ellas.

I Es necesario tener todas las clases en el classpath. Podemosinstalar GlassFish o copiar todos los JAR necesarios a mano.

I Hay que indicar la maquina en la que ejecuta el proveedor deJMS.

# $GLASSFISH i s t h e path to t h e G l a s s F i s h d i r e c t o r y :j a v a −Dorg . omg .CORBA. O R B I n i t i a l H o s t=omac . l s u b . org

−cp jmsexample . j a r : $GLASSFISH/ g l a s s f i s h / l i b / gf−c l i e n t . j a rorg . l s u b . jmsexample . P2PRece iver

Page 38: Message Oriented Middleware: Java JMS - lsub.orglsub.org/ast/15.mom.pdfRabbitMQ, ZeroMQ, Apache ActiveMQ, etc, OOM/RPC vs MOM ... I Arrancar el dominio y la base de datos con la herramienta

asadmin

Otros comandos utiles:

I flush-jmsdest --desttype queue cola : drena la colaindicada.

I flush-jmsdest --desttype topic topic : drena el topic.

I stop-domain domain : para la ejecucion del dominio.

I delete-domain domain : borra el dominio.

I ...