{"id":4712,"date":"2013-05-16T21:31:17","date_gmt":"2013-05-16T19:31:17","guid":{"rendered":"http:\/\/www.palentino.es\/blog\/?p=4712"},"modified":"2013-05-16T21:31:17","modified_gmt":"2013-05-16T19:31:17","slug":"introduccion-a-jms-y-activemq-mis-apuntes","status":"publish","type":"post","link":"https:\/\/www.palentino.es\/blog\/introduccion-a-jms-y-activemq-mis-apuntes\/","title":{"rendered":"Introducci\u00f3n a JMS y ActiveMQ. Mis apuntes."},"content":{"rendered":"<p style=\"text-align: justify;\">JMS (Java Message Service) es un API que forma parte de la plataforma J2EE para acceder a Sistemas de mensajer\u00eda (MOM).<\/p>\n<p style=\"text-align: justify;\">Un <b>MOM<\/b>\u00a0 es un software \u00a0de infraestructura que da soporte de env\u00edo y recepci\u00f3n de mensajes entre sistemas distribuidos.\u00a0MOM permite a los m\u00f3dulos de aplicaciones \u00a0ser distribuidos a trav\u00e9s de plataformas heterog\u00e9neas y reduce la complejidad del desarrollo de aplicaciones que abarcan m\u00faltiples sistemas operativos y protocolos de red.\u00a0El middleware crea una capa distribuida de comunicaciones que a\u00edsla al desarrollador de aplicaciones de los detalles de los diversos sistemas operativos y las interfaces de red.\u00a0Las API se extiende por diversas plataformas.<sup id=\"cite_ref-1\"><\/sup><\/p>\n<p style=\"text-align: justify;\">MOM proporciona elementos de software que residen en todos los componentes de comunicaci\u00f3n de una arquitectura cliente \/ servidor y por lo general apoyan las llamadas as\u00edncronas entre las aplicaciones cliente y servidor.\u00a0MOM reduce la participaci\u00f3n de los desarrolladores de aplicaciones y la complejidad del mecanismo cliente \/ servidor.<\/p>\n<p style=\"text-align: justify;\">JMS permite a los componentes de aplicaciones crear, enviar, recibir y leer mensajes. JMS en ese sentido es an\u00e1logo a JDBC: JMS ofrece un interfaz de acceso com\u00fan a diferentes MOMs.<\/p>\n<p style=\"text-align: justify;\">JMS es pues un API para mensajer\u00eda empresarial. Aunque incluido en Java EE, tambi\u00e9n disponible como un producto Stand Alone o independiente. Como vemos poco acoplado.<\/p>\n<p style=\"text-align: justify;\">La idea general es que clientes y servidores env\u00edan mensajes. Estos no se conocen, puesto que JMS se encuentra en medio de ellos.<\/p>\n<p style=\"text-align: justify;\">JMS no es una implementaci\u00f3n de un gestor de mensajes (servidor de colas), es simplemente una API.<\/p>\n<p>Como aclaraci\u00f3n, por un lado tenemos el cliente que env\u00eda mensajes, y mediante la<strong> API JMS<\/strong> nos comunicamos con los <strong>diferentes productos o proveedores\u00a0 gestores de mensajes<\/strong>.<\/p>\n<p>Ejemplos <strong>WMQ provider, ActiveMQ provider, TIBCO provider, SonicMQ\u00a0 provider<\/strong>.<\/p>\n<p><!--more--><\/p>\n<p>JMS se abstrae a la hora de usar el gestor. Es independiente del provider.<\/p>\n<p>Los mensajes poseen un formato determinado.<\/p>\n<p>Las partes del mensaje son Headers, propiedades y un payload.<\/p>\n<p>Existen<strong> 2 tipos de mensajes en JMS<\/strong><\/p>\n<p><strong>Mensaje Punto a punto<\/strong>.<\/p>\n<p>Existe un sender y una cola, y multiples receptores. La cola determina el receptor.<\/p>\n<p><strong>Suscripci\u00f3n de mensajes de dominio<\/strong>.<\/p>\n<p style=\"text-align: justify;\">El Publisher env\u00eda un mensaje que es entregado a m\u00faltiples suscriptores. Este tipo de mensajes puede ser colectivo. Este tipo de mensajes es como estar suscrito a una lista de correo. Todos reciben una copia del mensaje.<\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2013\/04\/Barra-separadora-blog.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4154\" alt=\"Barra-separadora-blog\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2013\/04\/Barra-separadora-blog.jpg\" width=\"641\" height=\"3\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2013\/04\/Barra-separadora-blog.jpg 641w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2013\/04\/Barra-separadora-blog-300x1.jpg 300w\" sizes=\"auto, (max-width: 641px) 100vw, 641px\" \/><\/a><\/p>\n<p><strong>Comentemos algo sobre ActiveMQ una implementaci\u00f3n JMS.<\/strong><\/p>\n<p>ActiveMQ es un Middleware orientado a mensajes. Entre el cliente y servidor. Se sit\u00faa en medio.<\/p>\n<p>Es un producto de la fundaci\u00f3n Apache. Licencia Apache, con todas las ventajas que ello conlleva, modificaci\u00f3n, redistribuci\u00f3n, etc.\u00a0 Compatible con la API JMS 1.1<\/p>\n<p>La meta es, basado en est\u00e1ndares, integrar aplicaciones orientadas a mensajes a trav\u00e9s de multiples lenguajes y plataformas.<\/p>\n<p style=\"text-align: justify;\">Es muy f\u00e1cil enviar y recibir mensajes<\/p>\n<p style=\"text-align: justify;\">Desde consola de comandos o Shell bash en Linux, arrancamos activemq<\/p>\n<p style=\"text-align: justify;\">.\/bin\/activemq<\/p>\n<p style=\"text-align: justify;\">ant consumer -&gt; ejecutando un script ant. Esperando mensajes<\/p>\n<p style=\"text-align: justify;\">ant \u00a0producer-&gt; Enviamos mensajes.<\/p>\n<p style=\"text-align: justify;\">No se necesita nada especial, descargar el producto, ejecutamos el producto, el receptor y el emisor. Ejecutamos ejemplos. No requiere una instalaci\u00f3n grande ni costosa. Una de las cosas que \u00a0diferencia a ActiveMQ respecto a otros middeware es la r\u00e1pida puesta a punto.<\/p>\n<p style=\"text-align: justify;\">Otro de los rasgos que lo diferencian respecto a otras soluciones propietarias del mercado, es la configuraci\u00f3n. Esta se realiza en XML en el archivo<strong> conf\/activemq.xml<\/strong><\/p>\n<p style=\"text-align: justify;\">El archivo xml de configuraci\u00f3n, poseen beans para configurar el framework spring.<\/p>\n<p style=\"text-align: justify;\">Podemos configurar las pol\u00edticas,el contexto, conexiones de red, adaptadores, persistencia de mensajes,la memoria, los conectores de transporte.<\/p>\n<p style=\"text-align: justify;\">Los conectores de transporte pueden ser via ssl, stomp,xmpp, openwire,etc, bajo determinados puertos.<\/p>\n<p style=\"text-align: justify;\">En pocas l\u00edneas de c\u00f3digo podemos embeber dentro de nuestra aplicaci\u00f3n JAVA, ActiveMQ, f\u00e1cilmente se puede integrar el broker.<\/p>\n<p>ActiveMQ usa URIs del estilo o sintaxis:<\/p>\n<p>&lt;protocol&gt;:\/\/&lt;host&gt;:&lt;port&gt;?&lt;transport-options&gt;<\/p>\n<p>La interrogaci\u00f3n nos permite configurar m\u00faltiples opciones en el transporte.<\/p>\n<p>Cuando configuramos un cliente para hablar con ActiveMQ, \u00a0podemos establecer los diferentes transportes establecidos en el fichero xml de configuraci\u00f3n.<\/p>\n<p>Ejemplos:<\/p>\n<p>vm:\/\/localhost?broker.persistent=false<\/p>\n<p>tcp:\/\/localhost:61616?jms.useAsyncSend=true<\/p>\n<p>Stomp:\/\/localhost:61613<\/p>\n<p>Failover:(tcp:\/\/host1:61616,tcp:\/\/host2:61616)?initialReconnectDelay=100<\/p>\n<p>El TCP suele ser muy com\u00fan en ActiveMQ. Las cadenas superiores son las que se pasan desde el cliente hacia el broker.<\/p>\n<p>El failover permite reconectar con diferentes host en caso de fallo.<\/p>\n<p>ActiveMQ soporta diferentes formatos Wire:<\/p>\n<p>Los formatos Wire \u00a0o\u00a0Wire Format se refieren a los diferentes formatos de los mensajes enviados usados como norma empleados por el adaptador<\/p>\n<p>OpenWire: Por defecto en ActiveMQ, protocolo binario, para clientes C++, Java y .NET<\/p>\n<p>STOMP, Simple Text Oriented Messaging Protocol, basado en texto, para clientes C, Javascript,Perl, PHP, Python, Ruby y alguno m\u00e1s<\/p>\n<p>XMPP (Jabber XML protocol).<\/p>\n<p>REST (HTTP Post y GET)<\/p>\n<p>AMQP.<\/p>\n<p>Si quieres indagar sobre estos formatos, a wikipedia \ud83d\ude42<\/p>\n<p>Por otro lado existen dos tipos de transportes en el protocolo:<\/p>\n<p>Del cliente , hacia el broker (mediante conector de transporte)<\/p>\n<p>Del broker al broker (mediante conector de red). Puedes hacer que los brokers se comuniquen. Y que los mensajes pasen entre ellos.<\/p>\n<p>Respecto a los conectores de transporte:<\/p>\n<p>Se encuentran los client to broker conections, similar en el uso a JDBC con las bases de datos. Los protocolos soportados son: TCP,UDP,NIO, SSL, HTTP\/S, SSL, VM, XMPP<\/p>\n<p>Cuando ejecutamos el cliente, podemos conectarnos con el broker con cualquiera de estos protocolos.<\/p>\n<p>Respecto a los protocolos soportados por las conexiones \u00a0broker to broker:<\/p>\n<p>Static (IP), Failover, multicast, Zeroconf, peer,fanout, discovery<\/p>\n<p>Podemos crear diferentes topolog\u00edas entre brokers. Estrella, Estrella-Estrella,punto a punto, etc &#8230;<\/p>\n<p>Cuando hablamos de JMS una de las cosas que se emplean es la persistencia de mensajes. Existen 3 tipos de persistencias en AMQ.<\/p>\n<p>Transaction message storage solution (por defecto).<\/p>\n<p>Non-Journaled JDBC (no muy rapida)<\/p>\n<p>Journaled JDBC<\/p>\n<p>Los brokers pueden ser configurados como maestros y esclavos.<\/p>\n<p>Existen 3 tipos de Master\/slave<\/p>\n<p>&#8211; Puros, Pure master\/slave.(investigar).<\/p>\n<p>&#8211; Shared filesystem master\/slave<\/p>\n<p>-JDBC master\/slave<\/p>\n<p><strong>Monitorizaci\u00f3n<\/strong><\/p>\n<p>Con JMX, ActiveMQ web console, Camel routes, SpringSource AMS, IONA FuseHQ<\/p>\n<p>&nbsp;<\/p>\n<p>Esto es una recopilaci\u00f3n de una charla que he escuchado sobre ActiveMQ, espero que sirva de resumen.<\/p>\n<p>Saludos.<\/p>\n<p>Enlace del producto:<\/p>\n<p><a href=\"http:\/\/activemq.apache.org\/\" target=\"_blank\">http:\/\/activemq.apache.org\/<\/a><\/p>\n<p>Libro recomendado sobre EIP (Enterprise Integration Patterns)<\/p>\n<p><a href=\"http:\/\/www.amazon.com\/Enterprise-Integration-Patterns-Designing-Deploying\/dp\/0321200683\" target=\"_blank\">http:\/\/www.amazon.com\/Enterprise-Integration-Patterns-Designing-Deploying\/dp\/0321200683<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>JMS (Java Message Service) es un API que forma parte de la plataforma J2EE para acceder a Sistemas de mensajer\u00eda (MOM). Un MOM\u00a0 es un software \u00a0de infraestructura que da soporte de env\u00edo y recepci\u00f3n de mensajes entre sistemas distribuidos.\u00a0MOM permite a los m\u00f3dulos de aplicaciones \u00a0ser distribuidos a trav\u00e9s de plataformas heterog\u00e9neas y reduce la complejidad del desarrollo de aplicaciones que abarcan m\u00faltiples sistemas operativos y protocolos de red.\u00a0El middleware crea una capa distribuida de comunicaciones que a\u00edsla al desarrollador de aplicaciones de los detalles de los diversos sistemas operativos y las interfaces de red.\u00a0Las API se extiende por diversas plataformas. MOM proporciona elementos de software que residen en todos los componentes de comunicaci\u00f3n de una arquitectura cliente \/ servidor y por lo general apoyan las llamadas as\u00edncronas entre las aplicaciones cliente y servidor.\u00a0MOM reduce la participaci\u00f3n de los desarrolladores de aplicaciones y la complejidad del mecanismo cliente \/ servidor. JMS permite a los componentes de aplicaciones crear, enviar, recibir y leer mensajes. JMS en ese sentido es an\u00e1logo a JDBC: JMS ofrece un interfaz de acceso com\u00fan a diferentes MOMs. JMS es pues un API para mensajer\u00eda empresarial. Aunque incluido en Java EE, tambi\u00e9n disponible como un producto Stand Alone o independiente. Como vemos poco acoplado. La idea general es que clientes y servidores env\u00edan mensajes. Estos no se conocen, puesto que JMS se encuentra en medio de ellos. JMS no es una implementaci\u00f3n de un gestor de mensajes (servidor de colas), es simplemente una API. Como aclaraci\u00f3n, por un lado tenemos el cliente que env\u00eda mensajes, y mediante la API JMS nos comunicamos con los diferentes productos o proveedores\u00a0 gestores de mensajes. Ejemplos WMQ provider, ActiveMQ provider, TIBCO provider, SonicMQ\u00a0 provider.<\/p>\n","protected":false},"author":1,"featured_media":4720,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":["post-4712","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-varios"],"_links":{"self":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/4712","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/comments?post=4712"}],"version-history":[{"count":9,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/4712\/revisions"}],"predecessor-version":[{"id":4722,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/4712\/revisions\/4722"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media\/4720"}],"wp:attachment":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media?parent=4712"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/categories?post=4712"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/tags?post=4712"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}