Getrennte Rechner für RMI-Server/RMI-Registry, bzw. Alternativen?

kopfsalat

Bekanntes Mitglied
Hallo!

Ich möchte eine verteilte Anwendung schreiben, bei der insbesondere eine Komponente namens Controller und eine namens Worker auf verschiedenen Rechnern laufen sollen. Üblicherweise sendet der Controller and den Worker Befehle, die dann von diesem ausgeführt werden. Manchmal jedoch möchte auch der Worker eine Information unaufgefordert an den Controller senden.

Mein Plan war bisher, Java RMI hierfür zu nutzen. Dazu wollte ich auf einem Rechner den Controller laufen lassen, auf einem weiteren den Worker, und auf einem der beiden oder einem dritten eine RMI Registry. Idee war, dass nun Controller und Worker sich bei der Registry anmelden und dann jeweils wechselseitig ein Remote-Objekt des anderen holen, um diesem dann Nachricht zuzusenden.

Problem: Es scheint nicht möglich zu sein, ein Remote-Objekt bei der Registry anzumelden, wenn dieses nicht auf demselben Rechner wie die Registry implementiert ist (zumindest gelingt mir das nicht).
Frage 1: Stimmt das? Oder kann man das Problem irgendwie umgehen?

Alternative: Nun gäbe es natürlich die Möglichkeit, auf dem Controller- und dem Worker-Rechner jeweils zusätzlich eine eigene RMI Registry zu starten, so dass die beiden Komponenten die Implementierung des jeweils anderen bei seiner Registry erfragen können. Das finde ich aber doof, da dann auch wechselseitig die IPs bekannt gemacht werden müssen. Stattdessen wäre vielleicht folgendes möglich (?):

Der Controller (RMI-Client) registriert sich anfangs als Listener-beim Worker (RMI-Server), indem er diesem eine Art Posteingangs-Objekt (den Listener) übersendet. Fortan kann nun auch der Worker jederzeit Listener-Funktionen des Controllers aufrufen. Mit dieser Alternative versuche ich also, eine bidirektionale Kommunikation herzustellen, obwohl nur eine einzige RMI Registry genutzt wird.

Frage 2: Ist das so möglich? Ich erahne dort folgendes Problem (welches vielleicht aber gar nicht existiert). Wenn der Controller das Listener-Objekt an der Worker gesendet hat und aus diesem Remote-Call zurückgekehrt ist, wird das Listener-Objekt dann vielleicht nach einiger Zeit ungültig? Oder darf es problemlos im Worker gespeichert werden und jederzeit später auch für Rückaufrufe zum Controller verwendet werden?

Zur Verdeutlichung hier eine Rohstruktur dieser bidirektionalen Kommunikation:

[Java]
// RMI-Server
class Worker {
public doSomething() {
// Aufgerufen vom RMI-Client, implementiert auf Seiten des Workers (RMI-Server)
}

public registerListener(Listener listener) {
// aufgerufen vom RMI-Client via Remote.
// übergibt insbesondere einen Listener, der auf der RMI-Client-Seite implementiert ist,
// und ab und an von hier aus (also vom RMI-Server aus) aufgerufen wird.
}
}
[/Java]

[Java]
// RMI-Client
class Controller {
Listener listener;
(...)
}
[/Java]

[Java]
// Hilfsklasse, implementiert auf RMI-Client-Seite
class Listener {
public somethingHappened(String s) {
// Aufgerufen vom RMI-Server, implementiert auf Seiten des Controllers (RMI-Client)
}
}
[/Java]

Also: Weiß jemand, ob es hierbei ein Problem gibt? Oder gibt es vielleicht noch eine elegantere Lösung?

Würde mich sehr über Hilfe freuen!
Danke,
kopfsalat
 

kopfsalat

Bekanntes Mitglied
Danke schonmal für den Hinweis! JMS kannte ich noch gar nicht, aber es kommt durchaus als weitere Alternative in Betracht. Allerdings möchte ich zumindest für die Richtung Controller -> Worker lieber eine synchrone Kommunikation: Das Leben wird mir derzeit sehr dadurch vereinfacht, dass der Remote Call bis zur Fertigstellung blockiert und auch direkt einen Rückgabewert hat. Mittels JMS müsste ich hier wohl nach jedem Nachrichtenversand an den Worker den Controller in eine Warteschleife übergehen und seine Eingangsqueue nach der Antwort pollen lassen. Etwaige Übertragungsfehler (da etwa der Worker abgeschmiert ist) müsste ich mittels Time-Outs abfangen. Ist also um einiges komplizierter.

Ergo: Mir wäre eine synchrone bidirektionale Kommunikation lieber, wie eben per RMI 'in beiden Richtungen'.
 

FArt

Top Contributor
Das Verhalten wäre mit reinem JMS nicht so viel anders. Aktives pollen ist nicht nötig (ok, zugegeben, das wird implizit natürlich schon gemacht). Du registrierst einen Listener auf eine Queue (oder Topic bei einer Art Broadcast) und dessen Callback (onMessage) wird aufgerufen, sobald etwas da ist.
Ausserdem kannst du bei JMS leicht das verwendete Protokoll austauschen, das für die Übertragung verwendet wird. Das macht dich viel flexibler (angenommen Controller und Worker sind über komplexe Infrastrukturen (Router, Firewalls, DMZ, Internet, ...) verbunden... Du kannst Messags priorisieren, filtern, transaktional versenden, persistente Messages verwenden (die gehen auch nicht verloren, wenn mal der Controller down ist, ..., uvm).

Mein Tipp: für dein Vorhaben nur auf JMS setzen...
 

kopfsalat

Bekanntes Mitglied
Ich habe mir nun JMS (Apache ActiveMQ) genauer zu Gemüte geführt. Tatsächlich beabsichtige ich nun, JMS anstelle RMI zu nutzen, obwohl synchrone Kommunikation deutlich umständlicher zu realisieren ist - einige Tests zeigten aber, das bei RMI und JMS letzlich der einfache Nachrichtenversand etwa gleich schnell funktioniert. Grund dafür ist wohl auch, dass man bei JMS nicht tatsächlich auf Pollen (im Sinne von aktivem Warten) angewiesen ist, sondern dass mittels Listenern und Monitoring direkt auf einkommende Nachrichten reagiert werden kann. Auf diese Weise habe ich mir nun "Agenten" geschrieben, die auch eine Funktion send(...) anbieten, die solange wartet, bis die entsprechende Antwort (oder ein TimeOut) eintritt. Damit wird das ganze dann ab dieser Ebene genauso komfortabel wie mit RMI.

Schön ist auch die Möglichkeit zur Authentifizierung, die man sonst bei reinem RMI erst noch selbst einbauen müsste. Der ausschlaggebende Grund war aber die Möglichkeit, an die JMS-Schnittstelle leichter andere Architekturen andocken zu können, was für mein Projekt durchaus interessant werden kann.

Eine Sache muss ich aber noch testen, und habe diesbzgl. ein paar besorgniserregende Fragen im Netz gefunden: Kann ich einen Client auch über einen HTTP-Proxy (im Firmennetz) mit einem JMS-Broker (per ActiveMQ) verbinden? Tests kann ich erst nächste Woche dazu machen, ich würde es zunächst einfach mittels den Proxy-Klassen oder dem Vorgehen von hier: Java HTTP Proxy Settings Information for Technology versuchen. Mit RMI war das kein Problem - und eigentlich sollte das hier ja auch funktionieren... Hast Du, oder jemand anderes, da vielleicht Erfahrung mit ?

Vielen Dank nochmal für den JMS-Tip!
 

FArt

Top Contributor
Ich habe mit ActiveMQ noch nicht gearbeitet.
Ich gehe davon aus, dass die Transportschicht auch dort von JMS getrennt konfiguriert werden kann. Somit muss ActiveMQ nur so konfiguriert werden, dass HTTP als Transport verwendet wird. Dazu arbeitet in der Regel ein Servlet auf der Serverseite. Damit ist es auch kein Thema einen HTTP Proxy zu verwenden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Eigenen Rechner als Server? Netzwerkprogrammierung 16
M Socket Hole Punching auf Rechner mit mobilem Zugang Netzwerkprogrammierung 1
X Mit Java eine Applikation auf einem anderen Windows Rechner (Windows Server 2008) starten Netzwerkprogrammierung 1
A Server auf eigenem Rechner Netzwerkprogrammierung 14
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
S XAMPP auf anderem Rechner erreichen Netzwerkprogrammierung 6
S anderer Rechner wird nicht gefunden Netzwerkprogrammierung 20
M Subnetz-Rechner Netzwerkprogrammierung 2
A java im netzwerk anderen rechner runterfahren Netzwerkprogrammierung 3
c_sidi90 Alle Rechner im Netzwerk ermitteln Netzwerkprogrammierung 17
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
M RMI auf lokalem Rechner Netzwerkprogrammierung 12
J Mit Java Anwendung ein (externes) Programm auf einem AIX Rechner starten Netzwerkprogrammierung 6
D Client-Rechner stürzt ab - was dann? Netzwerkprogrammierung 2
S welche Rechner sind im lokalen Netz online Netzwerkprogrammierung 11
T Andere Rechner im Netz finden Netzwerkprogrammierung 21
M Rechner einer Domäne auslesen? Netzwerkprogrammierung 3
D Multicast geht nur auf einem Rechner Netzwerkprogrammierung 9
J Kopieren von entfernten Rechner Teil 2 Netzwerkprogrammierung 11
J Kopieren von entfernten Rechner Netzwerkprogrammierung 5
A Broadcast - senden eines Packetes an alle rechner im netz Netzwerkprogrammierung 15
D Zugriff auf Rechner im Lan Netzwerkprogrammierung 2
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
FrankenDerStein Socket UDP Multithreading für ein Port Netzwerkprogrammierung 2
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
F Server für Java Applikationen Netzwerkprogrammierung 16
B Webview für Anwendung Netzwerkprogrammierung 7
M Sicheres Login-System für App implementieren Netzwerkprogrammierung 6
J Netty umsetzung für ein Protokoll Netzwerkprogrammierung 1
J ERM für kleine Verwaltungsdatenbank Netzwerkprogrammierung 2
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
Messoras Launcher für mein Spiel Netzwerkprogrammierung 7
F Einfaches Gateway für Log-Files Netzwerkprogrammierung 1
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
P PPTP Protokoll für JAVA Netzwerkprogrammierung 14
T FTP Wie Notwendigkeit für "rekey" klientenseitig detektieren? Netzwerkprogrammierung 3
S Webserver für Jar File Netzwerkprogrammierung 4
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
M Erreichbar für alle zu sein Netzwerkprogrammierung 9
M Server nur für eine Aufgabe Netzwerkprogrammierung 2
N Selbes URL Objekt für alle Requests nutzen Netzwerkprogrammierung 7
T uberspace.de als (v)root-Ersatz für kleinere Java-Anwendungen? Netzwerkprogrammierung 12
L Proxy für Dateidownload? Netzwerkprogrammierung 3
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Socket Leitstelle für Funkspiel Netzwerkprogrammierung 8
F Java-Beispielcode für Zeroconf (ähnlich Apple Bonjour) Netzwerkprogrammierung 7
I HTTP S - Zertifikate+Cockies für Form-basierten Login Netzwerkprogrammierung 2
Ollek Socket Sucher passende Server/Client Lösung für meine Anwendung Netzwerkprogrammierung 2
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
N RMI Einstellungen für "übers Internet" Netzwerkprogrammierung 8
F SSL-Zertifikate für viele Nutzer? Netzwerkprogrammierung 8
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
S wie stell man die classpath für JARs? Netzwerkprogrammierung 3
M Bestimmte Klassen für Netzwerkchecks gesucht Netzwerkprogrammierung 11
M ClassLoader für Axis2 setzen Netzwerkprogrammierung 15
M Welches Speicherformat für News-Database?? Netzwerkprogrammierung 2
Shoox VPN-Verbindung für Datenbankzugriff Netzwerkprogrammierung 2
P Proxy für Anwendung setzten Netzwerkprogrammierung 3
T Bezeichner "end of line" für die Funktion readline Netzwerkprogrammierung 5
A DataGramsocket Übertragungsproblem im Internet (IPs für Voip) Netzwerkprogrammierung 5
E Userliste für Chat Applet Netzwerkprogrammierung 4
S HTTP Kleines Programm für den Routerneustart Netzwerkprogrammierung 3
L Zeitspanne für erneutes senden Netzwerkprogrammierung 16
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
F Netzwerkprogrammierung für Anfänger Netzwerkprogrammierung 2
J Framework/ Muster für Chat-ähnliches Programm gesucht Netzwerkprogrammierung 2
B Variablen ausrichten für Übertragung Netzwerkprogrammierung 2
D FTP Pfadangabe für ftp-upload funktioniert nicht Netzwerkprogrammierung 5
dayaftereh HTTPCleint und HTMLparser für hTTpBot Netzwerkprogrammierung 2
E Socket Client-Applikation mit GUI für Internet IO-Platine Netzwerkprogrammierung 2
0din Grundlage für Bluetooth Netzwerkprogrammierung 5
N "Jungfernflug" der Socketprogrammierung für ein Mühlespiel Netzwerkprogrammierung 8
F Empfehlung für embedded Webserver Netzwerkprogrammierung 10
W Bibliothek für Certificate Management Protocol (CMP) Netzwerkprogrammierung 3
O Client/Server für Ticker Netzwerkprogrammierung 2
J Stubs für SOAP-Webservice generieren. Ich bekomme es einfach nicht hin... Netzwerkprogrammierung 3
dayaftereh Bester Stream für ein Spiel? Netzwerkprogrammierung 15
data89 Sockets: ein alter Hut - für Euch - für mich nicht! Netzwerkprogrammierung 10
G FileDialog für FTP Client Netzwerkprogrammierung 2
P Welches Protokoll für RMI verwenden? Netzwerkprogrammierung 10
H RCON Tool für Gameserver Netzwerkprogrammierung 11
A Wichtig für einen Chat? Netzwerkprogrammierung 4
D Was für Verbindungen mit Socket möglich? Netzwerkprogrammierung 2
S Realisierung eines Netzwerkcodes für ein Strategiespiel Netzwerkprogrammierung 7
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
W Was für ein Stream soll ich verwenden? Netzwerkprogrammierung 8
A Rezept für Webservices Netzwerkprogrammierung 5
I unc pfad für die klasse file? Netzwerkprogrammierung 4
P eine BufferedReader für alles ankommende Netzwerkprogrammierung 2
T Filter für Input UND OutputStream Netzwerkprogrammierung 4
T Welches Netzwerk ist am bestern für. Netzwerkprogrammierung 2
G server für mein spiel. Netzwerkprogrammierung 5
M Log In Programm für Seiten Netzwerkprogrammierung 2
G Netzwerkprogrammierung für spiele Netzwerkprogrammierung 2
A IRC-Server für das lokale Netzwerk? Netzwerkprogrammierung 12
C Einfacher Filedownload mit Sockets geht nicht für pdffiles Netzwerkprogrammierung 16
S Server für Internetspiel Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben