java java-ee jms rmi distributed-system

¿Cuál es la diferencia entre Java RMI y JMS?



java-ee distributed-system (4)

Al diseñar una aplicación distribuida en Java, parece haber algunas tecnologías que abordan el mismo tipo de problema. He leído brevemente sobre Java Remote Method Invocation y Java Message Service , pero es difícil realmente ver la diferencia. Java RMI parece estar más estrechamente acoplado que JMS porque JMS usa comunicación asincrónica, pero de lo contrario no veo grandes diferencias.

  • ¿Cuál es la diferencia entre ellos?
  • ¿Es uno de ellos más nuevo que el otro?
  • ¿Cuál es más común / popular en las empresas?
  • ¿Qué ventajas tienen uno sobre el otro?
  • ¿Cuándo se prefiere uno sobre el otro?
  • ¿Difieren mucho en lo difícil que son para implementar?

También creo que los servicios web y CORBA abordan el mismo problema.


Realmente no se puede comparar los dos, sus manzanas y naranjas.

RMI es una forma de Llamada a procedimiento remoto (RPC). Es una API liviana y específica de Java que espera que la persona que llama y el receptor estén disponibles en el momento de la comunicación.

JMS es una API de mensajería confiable. Los proveedores JMS existen para varios sistemas de mensajería. Los mensajes se pueden pasar incluso si una de las partes no está disponible si el proveedor implementa eso. Los dos con los que estoy familiarizado son TIBCO e IBM MQ.

RMI no se ocupa de entrega garantizada o respuestas asincrónicas, JMS puede, dependiendo del proveedor.

JMS permite un acoplamiento flexible en el sentido de disponibilidad. "Servicios web" permite un acoplamiento flexible en el sentido de protocolo y datos, pero no especifica mucho en el camino de la mensajería confiable, aunque algunas implementaciones sí lo incluyen (Windows Communication Foundation) y otras no.

EDITADO: Revisado por comentarios. Cuando escribí esta respuesta en 2010, mi experiencia fue en realidad con un solo proveedor de JMS y no sabía realmente que no había un proveedor de JMS predeterminado.


Usted ya sabe acerca de las llamadas a los métodos. ¿Qué ocurre si el objeto sobre el que desea invocar el método está en una computadora diferente? Utiliza RMI para enviar la llamada de una computadora (cliente) a la otra (servidor). El cliente esperará (o "bloqueará") hasta que el resultado regrese del servidor. Esto se llama operación síncrona .

JMS es diferente: permite que una computadora envíe un mensaje a otra, como el correo electrónico. El primero no tiene que esperar una respuesta: puede seguir haciendo cualquier trabajo que desee. Puede que ni siquiera haya una respuesta. Los dos sistemas informáticos no necesariamente funcionan exactamente en el paso, por lo que esto se llama asíncrono .

Otra forma de pensar sobre la diferencia: RMI es como hacer una llamada telefónica, y JMS es como enviar un mensaje de texto.

RMI es un poco más antiguo que JMS, pero eso no es realmente relevante. Los dos conceptos son mucho más antiguos que Java.

No hay mucha diferencia en la complejidad. Creo que deberías intentar hacer un tutorial sobre cada uno. RMI y JMS

Si está comenzando un proyecto desde cero y no está seguro de cuál usar, entonces probablemente el problema sincrónico / asincrónico sea el mejor factor de decisión. Si está trabajando en un sistema existente, probablemente sea mejor no introducir demasiadas tecnologías nuevas. Entonces, si ya están usando uno, entonces sugeriría que probablemente sea mejor seguir con ese.


Invocación de método remoto (RMI) : 1. Interfaz RPC nativa de Java 2. Los objetos remotos pueden ejecutarse con semántica similar a los objetos locales 3. La implementación predeterminada usa un protocolo de comunicación binario patentado, pero RMI puede implementarse sobre SOAP

Java Messaging System (JMS) 1. Interfaz y especificación de Java para Middleware orientado a mensajes 2. Los paquetes de datos se pueden enviar a colas de mensajes y temas donde se ejecutarán de forma asincrónica. Las colas o los temas no necesitan ser remotos. El servidor 3.JMS podría estar utilizando RMI, SOAP, etc.


  • Los RMI se utilizan para comunicar aplicaciones estrechamente acopladas entre sí en lugar de utilizar JMS para un acoplamiento débil.
  • RMI se utiliza de forma asincrónica (chat en tiempo real) pero JMS se usa para ambos Sincronización (chat fuera de línea).

  • En RMI, la serialización de objeto principalmente es suya, pero en JMS puede ser que no la necesite

Aquí hay más detalles sobre las terminologías anteriores

Ahora, ¿cuál es el significado flojo y estrechamente acoplado en RMI y JMS?

La mensajería permite la comunicación distribuida que está débilmente acoplada. Un componente envía un mensaje a un destino y el destinatario puede recuperar el mensaje desde el destino. Sin embargo, el emisor y el receptor no tienen que estar disponibles al mismo tiempo para poder comunicarse. De hecho, el remitente no necesita saber nada sobre el receptor; ni el receptor necesita saber nada sobre el remitente. El remitente y el receptor solo deben saber qué formato de mensaje y qué destino usar. A este respecto, la mensajería difiere de las tecnologías estrechamente acopladas, como la Invocación de Método Remoto (RMI), que requieren una aplicación para conocer los métodos de una aplicación remota.