Ich habe folgende Situation:
Ich habe 2 JVM-Prozesse (wirklich 2 java
Prozesse, die separat ausgeführt werden, nicht 2 Threads), die auf einem lokalen Computer ausgeführt werden. Nennen wir sie ProcessA
eine ProcessB
.
Ich möchte, dass sie miteinander kommunizieren (Daten austauschen) (z. B. ProcessA
eine Nachricht senden ProcessB
, um etwas zu tun).
Jetzt umgehe ich dieses Problem, indem ich eine temporäre Datei schreibe. Diese Prozesse scannen diese Datei regelmäßig, um eine Nachricht zu erhalten. Ich denke, diese Lösung ist nicht so gut.
Was wäre eine bessere Alternative, um das zu erreichen, was ich will?
java
ipc
concurrent-programming
tnk_peka
quelle
quelle
Antworten:
Mehrere Optionen für IPC :
Socket-basiertes Netzwerk (Bare-Bones)
RMI
Vollwertige Message-Passing-Architekturen
Java Management Extensions (JMX)
Filesharing / Dateisperrung
Signale
Ohne weitere Details scheint ein netzwerkbasierter IPC-Ansatz am besten zu sein, da er:
Basierend auf Ihrem Beispiel (indem Sie einfach den anderen Prozess auffordern, eine Aktion auszuführen) könnte JMX auch gut genug für Sie sein.
quelle
Ich habe auf github eine Bibliothek namens Mappedbus ( http://github.com/caplogic/mappedbus ) hinzugefügt, die es zwei (oder vielen weiteren) Java-Prozessen / JVMs ermöglicht, durch Austausch von Nachrichten zu kommunizieren. Die Bibliothek verwendet eine Speicherzuordnungsdatei und verwendet Abrufen und Hinzufügen sowie flüchtiges Lesen / Schreiben, um die verschiedenen Leser und Schreiber zu synchronisieren. Ich habe den Durchsatz zwischen zwei Prozessen mit dieser Bibliothek auf 40 Millionen Nachrichten / s mit einer durchschnittlichen Latenz von 25 ns zum Lesen / Schreiben einer einzelnen Nachricht gemessen.
quelle
Was Sie suchen, ist
inter-process communication
. Java bietet ein einfaches IPC-Framework in Form der Java RMI API . Es gibt verschiedene andere Mechanismen für die Kommunikation zwischen Prozessen, wie z. B. Pipes, Sockets und Nachrichtenwarteschlangen (dies sind natürlich alle Konzepte, daher gibt es Frameworks, die diese implementieren).Ich denke in Ihrem Fall sollte Java RMI oder eine einfache benutzerdefinierte Socket-Implementierung ausreichen.
quelle
Sockets mit DataInput (Output) Stream zum Senden von Java-Objekten hin und her. Dies ist einfacher als die Verwendung einer Festplattendatei und viel einfacher als Netty.
quelle
Ich benutze jGroup, um lokale Cluster zwischen Prozessen zu bilden. Es funktioniert für Knoten (auch als Prozesse bezeichnet) auf demselben Computer, innerhalb derselben JVM oder sogar auf verschiedenen Servern.
Sobald Sie die Grundlagen verstanden haben, ist es einfach, damit zu arbeiten, und die Optionen, zwei oder mehr Prozesse in derselben JVM auszuführen, machen es einfach, diese Prozesse einfach zu testen.
Der Overhead und die Latenz sind minimal, wenn sich beide auf demselben Computer befinden (normalerweise nur eine TCP-Rountrip von ca.> 100 ns pro Aktion).
quelle
Steckdose ist vielleicht die bessere Wahl, denke ich.
quelle
Im Jahr 2004 implementiere ich Code, der die Arbeit mit Sockets erledigt. Bis dahin suche ich oft nach einer besseren Lösung, weil der Socket-Ansatz eine Firewall auslöst und meine Kunden sich Sorgen machen. Bisher gibt es keine bessere Lösung. Der Client muss Ihre Daten serialisieren, senden und der Server muss empfangen und unserialisieren. Es ist leicht.
quelle