¿Cómo funciona internamente JMS Receive?


He estado investigando varias tecnologías de comunicación/arquitecturas/patrones/implementaciones (léase: palabras de moda) incluyendo Servicios Web (WCF, Axis2), ESBs, SOA, y quería saber más sobre JMS con respecto a la mensajería.

Conceptualmente, JMS suena simple. Mi opinión es que es un corredor intermedio que administra los mensajes de los editores y los dirige a los suscriptores apropiados. Esto se hace haciendo cola de mensajes a medida que se publican, y dequeuing ellos como son recibir.

Pregunta 1: ¿Es correcta mi comprensión básica de JMS?

Una de las cosas que me molesta cuando leo sobre tecnologías es cuando se hace un cierto nivel (intencional o no intencional) de agitar la mano sobre una característica.

Según mi comprensión básica, un proveedor de JMS debe estar ejecutándose para enviar o recibir mensajes. Mi suposición sobre la publicación es que el proveedor JMS simplemente espera hasta que se publique un mensaje, luego lo almacena en una cola (memoria o respaldado por bases de datos, dependiendo de la implementación). Sin embargo, no estoy muy seguro de cómo funciona receive.

Pregunta 2: ¿Recibe (típicamente) bloquear si no hay mensajes disponibles?

Pregunta 2b: Si es así, ¿cómo se logra el bloqueo? ¿El cliente sondea continuamente los mensajes? El servidor simplemente no responde hasta que se publica un mensaje (¿cómo funciona esto sin que se agote el tiempo?) ¿El proveedor inicia una llamada al destinatario?

Pregunta 2c: Si no, ¿ cómo se asegura de que los mensajes se reciban de manera oportuna, sin afectar el rendimiento?

La descripción básica parece inclinarse hacia un único proveedor de JMS para garantizar que los mensajes se gestionen de forma centralizada y no se pierdan. Veo que escalar es un problema.

Pregunta 3: ¿Cómo escala JMS?

Al escalar, puedo ver que hay complejidades para garantizar que se entregue un solo mensaje a todos los suscriptores apropiados, independientemente del servidor físico recibe el mensaje.

Question 3b: How does a JMS implementation ensure reliable delivery in a scaled environment?

Tenga en cuenta que aunque estas preguntas están relacionadas con JMS, es probable que se apliquen a cualquier infraestructura de mensajería. Acojo con satisfacción las respuestas específicas a JMS, así como aquellas que son más generales o incluso específicas a otra tecnología.

Author: Travis, 2011-05-10

5 answers

Estoy tratando de responder algunas preguntas basadas en mi experiencia en JMS.

Respuesta 1: - JMS es Java Message Service API; proporciona una interfaz uniforme para que los clientes Java accedan al marco de mensajería. Debajo de la API de JMS hay un proveedor de mensajería compatible con JMS, por ejemplo, el proveedor WebSphere MQ. JMS admite el transporte de una carga útil a través de cualquier protocolo de mensajería a destinos, a saber. Cola y Tema. Estos son los conceptos básicos de JMS.

¿Cómo funciona receive? Especificación JMS proporciona dos clases importantes:- MessageConsumer y MessageListener. La clase MessageConsumer permite a un cliente JMS recibir mensajes JMS sincrónicamente llamando a cualquiera de sus métodos receive(). Esta llamada bloqueará el hilo hasta que se reciba un mensaje. De lo contrario, la recepción asíncrona se puede hacer registrando un objeto de MessageListener con MessageConsumer. Es JMSProvider quien llega a saber que un mensaje llega a su destino local y su trabajo es entregar mensajes a cualquiera de los mensajes de sondeo de hilo de consumidor o no de sondeo registrado hilo de escucha de mensajes.

Respuesta 2: MessageConsumer API tiene dos variantes de recepción: receive() y receive(long timeout). La última variante permite que MessageConsumer se bloquee el hilo hasta que el mensaje llegue dentro de un período de tiempo de espera específico o de lo contrario se agota.

Diferentes marcos de mensajería podrían implementar la función de bloqueo de diferentes maneras. Como los objetos JMS son objetos administrados por JNDI y los objetos proxy específicos del proveedor se devuelven al cliente JMS, esto significa que el cliente no es consciente de cómo es el bloqueo pasando en segundo plano. Un marco de mensajería en particular puede elegir el sondeo del hilo del consumidor de mensajes después de un período de tiempo particular. Alternativamente, puede optar por bloquear hasta que se envíe la notificación.

No estoy seguro de si está buscando una respuesta para un marco de mensajería compatible con JMS en particular?

Respuesta 3: Supongo que con JMS scaling te refieres a la capacidad de tener muchos editores/suscriptores, muchos destinos en múltiples máquinas físicas. El escalado de JMS requiere soporte del proveedor de mensajería subyacente para soportar algún tipo de agrupación/conmutación por error. Como tal, la especificación JMS no admite escalabilidad. Corrígeme si me equivoco en esto? Por ejemplo, he trabajado en WebSphere MQ compatible con JMS que proporciona soporte de clustering.

 16
Author: ag112,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-27 01:26:53

Pregunta 1: ¿Es correcta mi comprensión básica de JMS?

Vamos a obtener las terminologías bien primero. No se puede decir JMS Provider must be running porque el proveedor es una entidad que ha construido el servidor JMS y es el servidor JMS el que debe estar ejecutándose. Por lo tanto, cuando decimos JMS, nos referimos a un conjunto de API (interfaces más técnicas) que implementan los proveedores. Así que básicamente los proveedores escriben su propia implementación de JMS. Por ejemplo, Active MQ is a JMS server que es proporcionado por Apache(provider)

Mi suposición al publicar es que el proveedor de JMS simplemente espera hasta que se publique un mensaje, luego lo almacena en una cola (respaldada por memoria o base de datos, dependiendo de la implementación).

Cierto hasta Cierto punto. Hay diferentes modelos que se siguen. El servidor JMS mantiene un socket abierto. Cada vez que un cliente remitente tiene que enviar un mensaje, simplemente abre una conexión al socket y envía el mensaje. Cómo se comporta receive es completamente diferente. Tienes pully push. En push el servidor enviará los mensajes al cliente live receiver tan pronto como reciba el mensaje. Esto también se llama modo asíncrono. En el modelo pull, el receptor del cliente envía una solicitud al servidor para obtener mensajes (modo síncrono).

Recibe (típicamente) bloquear si no hay mensajes disponibles?

Como mencioné en el punto anterior, dependerá del modelo que esté utilizando. El receptor se bloqueará en el modelo de extracción ( recepción síncrona). También esto sucede en Session thread, no en el hilo principal.

Si es así, ¿cómo se logra el bloqueo? ¿El cliente sondea continuamente los mensajes?

Sí, el cliente sondeará continuamente en caso de modelo de extracción. Generalmente hay un tiempo de espera después del cual el cliente será terminado.

Si no es así, ¿cómo se asegura de que los mensajes se reciban de manera oportuna, sin afectar el rendimiento?

Use modo asíncrono. Simplemente tienes para registrar un MessageListener y recibirá un mensaje cuando se anule onMessage(Mensaje msg) cuando haya disponibilidad de mensajes en el servidor.

Pregunta 3: ¿Cómo escala JMS?

Es realmente una pregunta de la que los proveedores deben preocuparse. Cuando usted dice que un mensaje es recibido por todos los suscriptores que se refiere a PUBSUB modelo de comunicación (otro ser PTP ). En PUBSUB se entregará el mensaje enviado a un tema a todos los suscriptores suscritos a ese tema.

Pregunta 3b: ¿Cómo garantiza una implementación de JMS una entrega confiable en un entorno escalado?

Fiabilidad? No siempre. Una vez más, esto depende del caso de uso. Puede tener mensajes persistentesasí como mensajes no persistentes. En caso de mensajes persistentes, los mensajes se almacenan en la base de datos (archivo u otros) y se garantiza su entrega. En caso de mensajes no persistentes no existe tal garantía. Servidor el fallo puede resultar en la pérdida del mensaje.

 3
Author: Aniket Thakur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-27 01:21:16

JMS admite el consumo de mensajes con un método síncrono (recibir con y sin tiempo de espera bloqueando tu hilo) o con una devolución de llamada impulsada por eventos (oyente de mensajes asíncronos)).

Puede decidir qué método se adapta mejor a sus necesidades, pero también puede tener que echar un vistazo a la implementación real. Por ejemplo, algunas implementaciones de JMS hacen un recorrido de red para receive () y por lo tanto se usan mejor con un tiempo de espera o con el receptor.

Con el hilo de escucha de mensajes el comportamiento y la pausa de la recepción de mensajes no se controlan tan fácilmente como con una llamada de recepción de bloqueo. Por lo general, la mayor parte del control se logra al tener su propio grupo de bloqueo de llamadas receive() con tiempos de espera, enviando a sus trabajadores.

 2
Author: eckes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-26 10:54:00

Creo que la diferencia entre la Cola y el Tema debe mencionarse, ya que hay diferencias importantes en la forma en que se entregan los mensajes.

Cola: solo un cliente recibirá un mensaje. Para escalar, por ejemplo, puede tener 10 clientes conectados a la misma cola - pero sólo uno de ellos recibirá un mensaje en particular. Si no hay clientes conectados, el mensaje permanecerá en la cola hasta que alguien se conecte o el mensaje se agote.

Tema: todos los clientes recibirán un copia de cada mensaje. Normalmente se usa en un escenario de suscriptor donde muchos endpoints están potencialmente interesados en cada mensaje. Un suscriptor duradero puede incluso estar inactivo por un tiempo; el mensaje se mantendrá hasta que el suscriptor vuelva a estar activo o el mensaje se agote. Si no hay clientes conectados y no hay suscriptores duraderos, el mensaje se eliminará.

 2
Author: Simen R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-11 12:46:55

Hay dos tipos de dominios de mensajería en JMS.

  1. Pcualquier-To-Pcualquier(PTP) Dominio de Mensajería
  2. Dominio de Mensajería del Editor/Suscriptor

En el modelo PTP , un mensaje se entrega a un solo receptor. Aquí, la Cola es usada como un Message Oriented Middleware (MAMÁ).

La Cola es responsable de retener el mensaje hasta que el receptor esté listo.

En PTP modelo, no hay dependencia de tiempo entre el emisor y el receptor.

introduzca la descripción de la imagen aquí


En el modelo Pub / Sub , se envía un mensaje a todos los suscriptores. Es como la radiodifusión. Aquí, Topic se utiliza como un middleware orientado a mensajes que es responsable de mantener y entregar mensajes.

En el modelo PTP, hay dependencia de tiempo entre el editor y el suscriptor.

introduzca la descripción de la imagen aquí


Programación JMS Modelo

introduzca la descripción de la imagen aquí

Fuente


Message Driven Bean (MDB)

  • MDB es un frijol que contiene lógica de negocios. Pero, se invoca al pasar el mensaje. Por lo tanto, es como JMS Receptor.
  • MDB recibe asíncronamente un mensaje y lo procesa.
  • MDB recibe un mensaje de la cola o del tema.
  • MDB es como un bean de sesión sin estado que encapsula una lógica de negocio y no mantener un estado de la haba.

introduzca la descripción de la imagen aquí

 0
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-19 04:49:12