2010-07-14 18 views
6

Ich habe 2 separate Java-Anwendungen gleichzeitig ausgeführt. (Zwei separate javaw.exe) Ich muss ein Objekt zwischen ihnen teilen, während sie ausgeführt werden.Wie teilt man Objekt zwischen Java-Anwendungen?

Was ist der einfachste Weg, um dies ohne permanente Speicherung zu erreichen?

+1

Siehe [Kommunikation zwischen zwei separaten Java-Desktop-Anwendungen] (http://stackoverflow.com/questions/1680898/communication-between-two-separate-java-desktop-applications) –

+0

Dies ist sehr nützlich. Danke :) – Vishal

Antwort

6

Objekte und ihre Instanzvariablen können zwischen Threads in einem Java-Programm geteilt werden, was eine ziemlich einfache Aufgabe ist.
Wenn Sie Objekte (eine Instanz davon) zwischen zwei Programmen ohne Datenspeicher teilen möchten, verwenden Sie als nächstes die Option RMI Socket Communication oder den Java-Messaging-Dienst.

0

Vielleicht Oracle Coherence? Das funktioniert wie eine In-Memory-Map, die über Anwendungen verteilt wird.

3

Sie TCP verwenden können

  1. eine lokale Software-Port verwenden, sagen localhost: 999.
  2. Erstellen Sie eine Anwendung als Server (an diesem Port) und andere als Client (stellt eine Verbindung zum Server unter localhost: 999 her, verwendet jedoch einen anderen Port für die eigene Verwendung).
  3. Client serialisiert Ihr Objekt zu streamen.
  4. Server de-serialisiert!

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

+0

natürlich wird es nicht. Dann sollte es so etwas wie Shared Memory geben. Ein Beispiel für einen gemeinsamen Speicher: http://unserializaloneone.blogspot.com/2006/10/share-precious-heap-memory-accross.html – ankitjaininfo

1

Wenn Sie das Objekt nicht dauerhaft speichern können, müssen Sie es irgendwie übertragen. Dies kann entweder über das Netzwerk oder eine Art gemeinsamen Speicher geschehen.

Für den ersten (Netzwerk-) Ansatz Serialisierung (java.io.Serializable) verwenden und das Objekt über den Socket übertragen. Dies erfordert das Schreiben von Socket-Listenern.

Der zweite Ansatz erfordert die Verwendung und Konfiguration einer Drittanbieter-Bibliothek (z. B. EHCache).

2

Sie müssen entscheiden, ob Sie den freigegebenen und den aktualisierten Status bevorzugen oder einfach ein einmaliges Nachrichtenobjekt senden.

Im ersten Fall müssten Sie eine "Remote-Referenz" zu einem Objekt teilen. RMI ist ein guter Ansatz.

Im zweiten Fall müssen Sie nur das Objekt serialisieren, das Sie teilen und senden möchten. Sie können es (umgerechnet auf byes) serialisiert senden über eine Socket als Ankit said oder sogar können Sie:

  • RMI :) Der Sender verbindet sich mit einem RMI-Empfänger registriert, ruft eine Methode mit dem mesasge Objekt als param und vergisst über das RMI Objekt

  • Java Messaging Service (JMS), vielleicht zuviel des Guten ...

  • einige andere kreative aber einfache Sache ...

2

Ich denke, dass Hazelcast für diese Art von Situation gut funktioniert. Es erfordert praktisch keine Einrichtung (mehr als das müssen Sie die Abhängigkeiten den Hazelcast-Gläsern hinzufügen).Das folgende Codebeispiel zeigt, wie Sie ein freigegebenes Map einrichten.

// 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); 

Hazelcast Unterstützung verschiedene gemeinsam benutzte Datenstrukturen einschließlich Map, Queue, List, AtomicLong, IdGenerator usw. The documentation is good und nach meiner Erfahrung der Umsetzung ist solide.

Verwandte Themen