java - how - JMS y AMQP-RabbitMQ
rabbitmq java consumer (7)
Estoy tratando de entender qué es JMS y cómo está conectado a la terminología de AMQP. Sé que JMS es una API y AMQP es un protocolo.
Aquí están mis suposiciones (y preguntas también)
- RabbitMQ usa el protocolo AMQP (más bien implementa el protocolo AMQP)
- Los clientes de Java necesitan utilizar las bibliotecas cliente de protocolo AMQP para conectarse / usar RabbitMQ
- ¿Dónde entra en juego la API JMS aquí? ¿La API JMS debe usar las bibliotecas cliente de AMQP para conectarse a RabbitMQ?
- Normalmente usamos JMS para conectar Message Brokers como RabbitMQ, ActiveMQ, etc. Entonces, ¿cuál es el protocolo predeterminado que se usa aquí en lugar de AMQP?
Algunos de los anteriores pueden ser tontos. :-) Pero tratando de ajustar mi cabeza alrededor.
Comencemos desde la base.
RabbitMQ es un MOM (middleware orientado a mensajes), desarrollado con Erlang (un lenguaje de programación orientado a TLC) e implementando el protocolo de conexión AMQP (Advance Message Queuing Protocol). Actualmente, muchas API de cliente (p. Ej., Java, C ++, RESTful, etc.) están disponibles para permitir el uso de los servicios de mensajería RabbitMQ.
JMS (Java Messaging Service) es un estándar JCP que define un conjunto de API estructuradas para ser implementadas por una MOM. Un ejemplo de MOM que implementa (es decir, es compatible con) las API de JMS es ActiveMQ; también hay HornetMQ, y otros. Tales intermediarios obtienen las API de JMS e implementan los patrones de intercambio en consecuencia.
De acuerdo con lo anterior, tomando el esqueleto de las API de JMS, una instancia de RabbitMQ y sus API de cliente de Java, es posible desarrollar una implementación de JMS utilizando RabbitMQ: lo único que uno tiene que hacer, en ese punto, es implementar el patrón de intercambio (sobre RabbitMQ) de acuerdo con la especificación JMS.
La clave es: un conjunto de API, como JMS, se puede implementar sin importar la tecnología (en este caso, RabbitMQ).
JMS, cuando se definió no definió un protocolo entre el cliente JMS y un servidor de mensajería. El cliente JMS, que implementa la API JMS, puede usar cualquier protocolo para comunicarse con el servidor de mensajería. El cliente solo debe cumplir con la API de JMS. Eso es todo. Usualmente, los clientes JMS usan un protocolo personalizado que su servidor de mensajería entiende.
AMQP por otro lado es un protocolo entre un cliente de mensajería y un servidor de mensajería. Un cliente JMS puede usar AMQP como protocolo para comunicarse con el servidor de mensajería. Y hay clientes así disponibles.
http://www.lshift.net/blog/2009/03/16/openamqs-jms-client-with-rabbitmq-server
Sospecho que puede estar buscando esta documentación que dice, en parte:
JMS Client para vFabric RabbitMQ es una biblioteca cliente para vFabric RabbitMQ. vFabric RabbitMQ no es un proveedor de JMS, pero tiene las características necesarias para admitir los modelos de mensajería de JMS Queue y Topic. JMS Client para RabbitMQ implementa la especificación JMS 1.1 en la parte superior de la API del cliente RabbitMQ Java, lo que permite que las aplicaciones JMS nuevas y existentes se conecten con los intermediarios RabbitMQ a través del Protocolo de cola de mensajes avanzado (AMQP).
Su pregunta es un poco desordenada y se asemeja a una pregunta difícil en un documento de preguntas :) (Como los profesores siempre intentan hacer preguntas simples que hacen complejo: DI espero que no seas un maestro :)) Veamos todos estos uno por uno.
Como sabes:
La API de Java Message Service (JMS) es una API de Middleware orientado a mensajes (MOM) de Java para enviar mensajes entre dos o más clientes . JMS es una parte de la Plataforma Java, Enterprise Edition, y está definida por una especificación desarrollada bajo el Proceso de comunidad de Java como JSR 914. Es un estándar de mensajería que permite crear componentes de aplicaciones basados en Java Enterprise Edition (Java EE), enviar, recibir y leer mensajes Permite que la comunicación entre los diferentes componentes de una aplicación distribuida sea débilmente acoplada, confiable y asíncrona .
Ahora (de Wikipedia ):
Advanced Message Queuing Protocol (AMQP) es un protocolo de capa de aplicación estándar abierto para middleware orientado a mensajes. Las características definitorias de AMQP son la orientación de los mensajes, las colas, el enrutamiento (incluido el punto a punto y publicar y suscribir), la fiabilidad y la seguridad.
Y lo más importante (nuevamente de Wikipedia):
A diferencia de JMS, que simplemente define una API, AMQP es un protocolo de nivel de cable. Un protocolo de nivel de cable es una descripción del formato de los datos que se envían a través de la red como una secuencia de octetos. En consecuencia, cualquier herramienta que pueda crear e interpretar mensajes que se ajusten a este formato de datos puede interoperar con cualquier otra herramienta compatible independientemente del lenguaje de implementación.
Algunas cosas importantes que debes saber:
- Tenga en cuenta que AMQP es una tecnología de mensajería que no implementa la API JMS.
- JMS es API y AMQP es un protocolo. Por lo tanto, no tiene sentido decir que lo que es un protocolo predeterminado de JMS, por supuesto, las aplicaciones cliente usan HTTP / S como protocolo de conexión cuando invocan un servicio Web WebLogic.
- JMS solo es una especificación API. No usa ningún protocolo. Un proveedor JMS (como ActiveMQ) podría usar cualquier protocolo subyacente para realizar la API JMS. Por ejemplo: Apache ActiveMQ puede usar cualquiera de los siguientes protocolos: AMQP, MQTT, OpenWire, REST (HTTP), RSS y Atom, Stomp, WSIF, notificación de WS, XMPP. Le sugiero que lea Uso de JMS Transport como el Protocolo de conexión .
Buena suerte :)
Tenía preguntas similares sobre JMS y AMQP. Mientras la discusión aquí responde las preguntas. Este enlace de spring.io también lo explica muy bien y vale la pena echar un vistazo, por lo tanto, compartir ...
https://spring.io/understanding/AMQP
AMQP (Advanced Message Queuing Protocol) es una especificación de cable abiertamente publicada para mensajería asíncrona. Se especifica cada byte de datos transmitidos. Esta característica permite que las bibliotecas se escriban en varios idiomas y se ejecuten en múltiples sistemas operativos y arquitecturas de CPU, lo que permite un estándar de mensajería verdaderamente interoperable y multiplataforma.
AMQP a menudo se compara con JMS (Java Message Service), el sistema de mensajería más común en la comunidad de Java. Una limitación de JMS es que las API están especificadas, pero el formato del mensaje no. A diferencia de AMQP, JMS no tiene ningún requisito sobre cómo se forman y transmiten los mensajes. Básicamente, todos los intermediarios JMS pueden implementar los mensajes en un formato diferente. Simplemente tienen que usar la misma API.
- ¿Dónde entra en juego la API JMS aquí? ¿La API JMS debe usar las bibliotecas cliente de AMQP para conectarse a RabbitMQ?
JMS es una API, por lo que algunas API JMS se implementan a través del protocolo AMQP (como Apache QPID JMS ) mientras que la mayoría de las API JMS usan otros protocolos. Si la versión del protocolo AMQP es la misma, dicho cliente debería poder comunicarse con otro cliente AMQP.
- Normalmente usamos JMS para conectar Message Brokers como RabbitMQ, ActiveMQ, etc. Entonces, ¿cuál es el protocolo predeterminado que se usa aquí en lugar de AMQP?
Depende de su configuración de esa API JMS. Para ActiveMQ, podría ser AMQP pero de forma predeterminada es ''openwire''