Cómo hacer que 2 JVM se hablen entre sí


Tengo la siguiente situación:

Tengo 2 procesos JVM (en realidad 2 procesos java que se ejecutan por separado, no 2 subprocesos) que se ejecutan en una máquina local. Llamémoslos ProcessA un ProcessB.

Quiero que se comuniquen (intercambien datos) entre sí (por ejemplo, ProcessA envía un mensaje a ProcessB para hacer algo).

Ahora, trabajo alrededor de este problema escribiendo un archivo temporal y estos procesos escanean periódicamente este archivo para obtener un mensaje. Creo que esta solución no es tan Bien.

¿Cuál sería una mejor alternativa para lograr lo que quiero?

Author: haylem, 2012-06-08

6 answers

Múltiples opciones para IPC:

Redes basadas en Sockets

  • no necesariamente difícil , pero:
    • podría ser verboso por no mucho,
    • podría ofrecer más superficie para los errores, a medida que se escribe más código.
  • podría confiar en frameworks existentes, como Netty

RMI

  • Técnicamente, eso también es comunicación de red, pero eso es transparente para usted.

Arquitecturas completas de Paso de mensajes

  • generalmente se basa en comunicaciones de red o RMI, pero con soporte para conversaciones y flujos de trabajo complicados
  • podría ser demasiado pesado para algo simple
  • frameworks como ActiveMQ o JBoss Messaging

Java Management Extensions (JMX)

  • más destinado a Gestión y monitoreo de JVM, pero podría ayudar a implemente lo que desee si en su mayoría desea que un proceso consulte a otro para obtener datos, o envíe alguna solicitud para una acción, si no son demasiado complejos
  • también funciona sobre RMI (entre otros protocolos posibles)
  • no es tan simple de entender al principio, pero en realidad es bastante simple de usar

Intercambio de archivos / Bloqueo de archivos

  • eso es lo que estás haciendo en este momento
  • es factible, pero viene con muchos problemas para mango

Señales

  • Simplemente puede enviar señales a su otro proyecto
  • Sin embargo, es bastante limitado y requiere que implementes una capa de traducción (es factible, aunque, pero una idea bastante loca para jugar con algo serio.

Sin más detalles, un enfoque de IPC basado en redes parece el mejor, ya que es el:

  • más extensible (en términos de agregar nuevas características y flujos de trabajo a su
  • más ligero (en términos de huella de memoria para su aplicación)
  • más simple (en términos de diseño)
  • más educativo (en términos de aprender a implementar la CIP). (como mencionaste "socket is hard" en un comentario, y realmente no lo es y debería ser algo en lo que trabajes)

Dicho esto, basado en su ejemplo (simplemente solicitando al otro proceso que realice una acción), JMX también podría ser lo suficientemente bueno para usted.

 68
Author: haylem,
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
2016-04-26 17:16:45

He añadido una biblioteca en github llamada Mappedbus ( http://github.com/caplogic/mappedbus ) que permiten que dos (o muchos más) procesos Java/JVM se comuniquen intercambiando mensajes. La biblioteca utiliza un archivo mapeado de memoria y hace uso de fetch-and-add y lectura/escritura volátil para sincronizar los diferentes lectores y escritores. He medido el rendimiento entre dos procesos usando esta biblioteca a 40 millones de mensajes / s con una latencia promedio de 25 ns para leer / escribir un solo mensaje.

 16
Author: MikaelJ,
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
2015-06-04 16:30:46

Lo que estás buscando es inter-process communication. Java proporciona un marco de trabajo IPC simple en forma de Java RMI API . Hay varios otros mecanismos para la comunicación entre procesos, como tuberías, zócalos, colas de mensajes (todos estos son conceptos, obviamente, por lo que hay marcos que implementan estos).

Creo que en su caso Java RMI o una simple implementación de socket personalizado debería ser suficiente.

 5
Author: Strelok,
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-06-08 02:45:49

Sockets con flujo DataInput(Salida), para enviar objetos java de ida y vuelta. Esto es más fácil que usar disk file, y mucho más fácil que Netty.

 3
Author: Alexei Kaigorodov,
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-06-08 05:07:54

Tiendo a usar jGroup para formar clústeres locales entre procesos. Funciona para nodos (también conocidos como procesos) en la misma máquina, dentro de la misma JVM o incluso a través de diferentes servidores.

Una vez que comprenda los conceptos básicos, es fácil trabajar con él y tener las opciones para ejecutar dos o más procesos en la misma JVM hace que sea fácil probar esos procesos fácilmente.

La sobrecarga y la latencia son mínimas si ambos están en la misma máquina (generalmente solo una redada TCP de aproximadamente >100ns por acción).

 2
Author: Martin Kersten,
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
2015-04-30 09:30:39

Socket puede ser una mejor opción, creo.

 0
Author: Marcus,
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-06-08 02:42:11