2010-07-14 45 views
6

Tengo 2 aplicaciones Java separadas ejecutándose a la vez. (Dos javaw.exe separados) Necesito compartir un objeto entre ellos mientras se ejecutan.¿Cómo compartir objetos entre aplicaciones java?

¿Cuál es la forma más sencilla de lograr esto sin tener un almacenamiento permanente?

+1

Consulte [Comunicación entre dos aplicaciones de escritorio Java separadas] (http://stackoverflow.com/questions/1680898/communication-between-two-separate-java-desktop-applications) –

+0

Esto es muy útil. Gracias :) – Vishal

Respuesta

6

Los objetos y sus variables de instancia se pueden compartir entre subprocesos en un programa Java, lo cual es una tarea bastante simple.
Si necesita compartir objetos (instancia) entre dos programas, sin almacenamiento de datos, la siguiente opción sería usar RMI Socket Communication o el servicio de mensajería Java.

0

Tal vez Oracle Coherence? Eso funciona como un mapa en memoria compartido en todas las aplicaciones.

3

Puede utilizar TCP

  1. utilizar un puerto local de software, dicen localhost: 999.
  2. Haga una aplicación como servidor (escuchando en este puerto) y otra como cliente (se conectará al servidor en localhost: 999, pero usará un puerto diferente para su propio uso).
  3. El cliente serializará su objeto para transmitir.
  4. ¡El servidor no se serializa!

Ejemplo: http://www.java-samples.com/showtutorial.php?tutorialid=1167

+0

por supuesto que no. Entonces debería haber algo así como memoria compartida. Un ejemplo de memoria compartida: http://unserializableone.blogspot.com/2006/10/share-precious-heap-memory-accross.html – ankitjaininfo

1

Si no puede almacenar el objeto de forma permanente, es necesario transferir alguna manera. Esto se puede hacer a través de la red o algún tipo de memoria compartida.

Para el primer enfoque (de red), use la serialización (java.io.Serializable) y transfiera el objeto a través del socket. Esto requerirá escribir oyentes de socket.

El segundo enfoque requerirá el uso y la configuración de una biblioteca de terceros (por ejemplo, EHCache).

2

Debe decidir si prefiere el estado compartido y actualizado, o simplemente enviar un objeto de mensaje de una sola vez.

En el primer caso, tendría que compartir una "referencia remota" con algún objeto. RMI es un buen enfoque.

En el segundo caso, solo necesita serializar el objeto que desea compartir y enviarlo. Puede enviarlo por entregas (convertido a despedidas) sobre un socket como Ankit said o incluso se puede utilizar:

  • RMI :) El emisor se conecta a un receptor RMI registrado, invoca un método con el objeto mesasge como un parámetro y se olvida sobre el objeto RMI

  • Java Messaging Service (JMS), tal vez una exageración ...

  • alguna otra cosa creativa pero sencilla ...

2

Creo que Hazelcast funciona bien para este tipo de situación. Prácticamente no requiere configuración (más que eso, necesita agregar las dependencias a los contenedores de Hazelcast).El siguiente ejemplo de código muestra cómo configurar un Map compartido.

// Code in process 1 
Config cfg = new Config(); 
HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg); 
Map<Integer, String> sharedData = instance.getMap("shared"); 
sharedData.put(1, "This is shared data"); 

// Code in process 2 
Config cfg = new Config(); 
HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg); 
Map<Integer, String> sharedData = instance.getMap("shared"); 
String theSharedString = sharedData.get(1); 

apoyo Hazelcast varias estructuras de datos compartidas que incluyen Map, Queue, List, AtomicLong, etc. IdGeneratorThe documentation is good y en mi experiencia de la aplicación es sólido.

Cuestiones relacionadas