[Erledigt] RMI Registry.Registry.bind disallowed

Hi,
ich steh gerade vor dem Problem, ich habe einen Server der gleichzeitig die RMI Registry erzeugt lokal läuft alles, aber sobald ich von einem zweiten Rechner aus zugreifen will geht es nicht. Da bekomm ich immer die Exception auf dem Client.

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.AccessException: Registry.Registry.bind disallowed; origin /192.168.25.190 is non-local host
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
	at sun.rmi.transport.Transport$1.run(Transport.java:159)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)......

SecurityException? Musst du da vielleicht etwas signieren?

ne ich wundere mich auch warum das kommt, nahezu die identische Arbeitsweise funktioniert mit ner anderen Software.

origin /192.168.25.190 is non-local host

Das sind irgendwelchen “wirren” internas von RMI. Hatte ich schon öfter.
Hilft vielleicht wenn du postest welche IP Server und Client haben…

Ein paar Schlagwörter die mir in dem zusammenhang (der Fehlermeldung) einfallen:

  • Mehrere Netzwerkkarten?
  • IP Adresskonflikt?
  • DNS -> Hostauflösung nicht korrekt?

Gruß
Alex

der Client hat die IP 192.168.25.190 der Server 192.168.25.222
Lokal läuft alles, wenn ich mit anderen Sachen die IP anspreche klappts auch aber nicht mit RMI wenn die Registry auf nem fremden Rechner läuft

So wie ich das jetzt gerade auf ein paar Seiten gelesen hab scheint RMI es nicht zu unterstützen wenn die Registry nicht auf dem gleichen Rechner läuft wie der Server.

Das ist scheiße…

Hmm, wieso muss denn die Registry auf nem anderen Rechner laufen?

Ah, da fällt da gerade ein neues Feature für mein SIMON ein (vielleicht ist das ja dein Hintergrund für die externe Registry):

Folgendes Szenario:

Ein Registry-Server, eine Hand voll Server und tausende Clients.
Die Registry kann dann eine Art Load-Balancing machen und einen neu hinzukommenden Client an den Server vermitteln, der gerade am wenigsten zu tun hat. tolle idee Wäre quasi eine Art Clustering, sofern die Server untereinander noch den selben Kontext haben (z.b. alle über eine DB angebunden oder sowas, kommt halt auf den Anwendungsbereich an).

  • Alex

Ich baue einen Watchdog, es gibt den Watchdog und der hat die Registry bei sich. Die "Client"Server melden sich bei ihm an und registrieren sich damit er sie immer Abfragen kann.

Geht das mit deinem Simon?

[QUOTE=EagleEye]Ich baue einen Watchdog, es gibt den Watchdog und der hat die Registry bei sich. Die "Client"Server melden sich bei ihm an und registrieren sich damit er sie immer Abfragen kann.

Geht das mit deinem Simon?[/QUOTE]

Bin jetzt etwas verwirrt:

Du hast also einen Watchdog Server.
Dort registrieren sich die zu „überwachenden“ Server, damit der Watchdogserver weiß (in dem er immer mal wieder jeden einzelnen Server anspricht), wann welcher abraucht oder nicht mehr erreichbar ist?

Hab ich das richtig verstanden?

Wenn ja: Klar, das kannst du auch in SIMON basteln. Da kannst du beliebig Server und Clients schachteln und somit folgende Struktur herstellen:

WatchdogServer [SIMON Server] <---------> eigentlicher Server (davon gibts mehrere) [SIMON Client+Server] <----------> normaler Client [SIMON Client]

Mit RMI sollte das auch möglich sein (brauchst halt mehrere Registrys [SIMON übrigens auch, weil dort ist die Registry der Server]), aber das wird irgendwann „unschön“ da dort kreuz und quer TCP Verbindungen auf und abgebaut werden. Wenn man dann noch mit Callbacks arbeiten will: Gute Nach Javaland…

Im übrigen: Ich hab mal nach weiteren RMI alternativen geschaut. Entweder sind die wieder in der versenkung verschwunden, oder sie sind zu einem furchtbar komplexen gebilde mutiert oder sie lassen sich nur in Verbindung mit anderen durchtbaren Gebilden nutzen. Aber jedenfalls keine der Alternativen nutzt NIO :wink:

  • Alex

Ja klingt komisch ist aber so :wink:
Das Hauptproblem bei meinen Servern ist nicht dass sie ausgehen sondern das einzelne Threads hängen bleiben und das wird mit dem Watchdog überwacht.

Kann ich bei SIMON eine Registry haben, bei der sich X Server registrieren die auf anderen Rechnern liegen oder müssen die auch auf dem gleichen System liegen?

[QUOTE=EagleEye]Ja klingt komisch ist aber so :wink:
Das Hauptproblem bei meinen Servern ist nicht dass sie ausgehen sondern das einzelne Threads hängen bleiben und das wird mit dem Watchdog überwacht.
[/quote]

Wieso bleiben denn einzelne Threads hängen? Hört sich stark nach einem DeadLock an. Da hilft dann ein guter Profiler: www.yourkit.com

[/quote]
Kann ich bei SIMON eine Registry haben, bei der sich X Server registrieren die auf anderen Rechnern liegen oder müssen die auch auf dem gleichen System liegen?[/QUOTE]

Der Begriff Registry hat bei RMI eine andere Bedeutung als bei SIMON.

Bei Simon IST die Registry ein Server und steht nicht alleine für sich.
Bei RMI ist Registry und Server irgendwie getrennt (zumindest hab ich das so aus der Doku gelesen) so dass es theoretisch möglich ist, die Registry auf Rechner A und die Server die sich da registrieren auf Rechner B, C, D, … laufen zu lassen. Aber wie du ja festgestellt hast, scheint das irgendwie nicht ohne weiteres zu funktionieren.

Finde den Ansatz auch nicht sonderlich toll. Was bringt mir eine Registry auf einem alleinstehenden Rechner, wenn dort keine eigene Programmlogik mitläuft? Das hat wenn überhaupt eine Art „Telefonbucheffekt“ ala DNS.

Aber es ist ja kein Problem einen Watchdog Server zu erstellen auf dem deine anderen Server eine Methode aufrufen und damit ein Callbackobjekt übergeben. Das Callbackobjekt ermöglicht dem Watchdogserver den Server zu fragen ob XYZ noch läuft (oder was immer du eben realisiert haben möchtest).

Willst du mit dem Watchdog Server Fehler suchen (blockierende Threads finden) oder wie hast du dir das vorgestellt?

  • Alex

Achso ich bin jetzt auch dabei das so in der Art zu lösen, dass jeder Server sich an eine lokale Registry registriert und sich beim Watchdog meldet. So kann er die dann ansprechen.

Ja unteranderem jeder Server testet seine Funktionen (Datenbankverbindungen, Parser, …) durch ob sie noch laufen und meldet das an den Server.

Achso ich bin jetzt auch dabei das so in der Art zu lösen, dass jeder Server sich an eine lokale Registry registriert und sich beim Watchdog meldet. So kann er die dann ansprechen.

Jupp, so geht’s in RMI auch.

Ja unteranderem jeder Server testet seine Funktionen (Datenbankverbindungen, Parser, …) durch ob sie noch laufen und meldet das an den Server.

Also eine Art Health-Status …

Ein Watchdog funktioniert aber eigentlich anders rum: Ein Watchdog prüft aktiv ob seine Schützlinge noch das tun was sie tun sollen. Ist auch in der Elektrotechnik und im Embedded-Bereich so. Ist ein i-Tupfer sicherer. Weil: Selbst nachfragen ist besser als sich darauf zu verlassen dass man informiert wird (wobei informiert werden ja eindeutig bequemer ist).

  • Alex

jo Health-Status kann man es auch nennenm da ich einfallslos bin hab ichs Watchdog genannt :wink:

Das mit dem Regisrieren ist auch einfach nur bequemlichkeit, zumal der Watchdog zu großen Teilen eine Frage der Interpretation ist. Daher ist er gerade auch als reine Überwachung mit GUI geplant. Das heißt du klickst drauf und er sagt dir wie es überall aussieht.
Viele Teile werden derzeit als inaktiv markiert nur weil sie gerade nichts zum arbeiten haben und der Watchdog sie auch nicht so einfach aufwecken kann.
Aber da fällt mir vielleicht auch noch was ein.

Ich habs jetzt erstmal “fertig” aber das läuft einfach scheiße, auf meinem Notebook hab ich ja 2 Netzwerkkarten und ich benutz gerade nur WLAN aber die Registry gibt den anderen Clients die IP von meinem festen Anschluss. Damit kommen die nicht drauf. Jetzt bin ich kurz davor den RMI Kram rauszuwerfen und irgendwas eigenes zu basteln.

Kann das bei deinem SIMON auch mit den IPs auftreten? Wenn ja hab ich da irgendwie einen Einfluss welche IP genommen werden soll?

Hmm, kann ich “schnell” einbauen an welche IP sich der Server binden soll. Sollte kein Problem sein.

  • Alex

Ich denke das solltest du auf jeden Fall machen, weil es gibt oft den Fall das in einem Rechner mehrere Netzwerkkarten stecken die nicht umbedingt im gleichen Netz sind.

Ich werd erstmal Mittag machen und dann überlegen wie ich diesen Blödsinn behebe

Sorry, ich hab das in der Tat schon längst berücksichtigt …

	 * Creates a registry with the scope of an own lookup table. 
	 *  
	 * @param address the {@link InetAddress} the registry is bind to
	 * @param port the port the registry is bind to
	 * @return the created registry
	 */
	public static Registry createRegistry(InetAddress address, int port){
	...
	}

Also einfach die passende createRegistry() Methode in der “Simon” klasse wählen. Wenn du hilfe brauchst: Frag ruhig.

  • Alex

[update]
Hab gerade gesehen dass es da noch probleme mit dem Lookup geben könnte. Werde das prüfen und ggf. fixen.

[update2]
Werde jetzt auch endlich JUnit Tests einführen… So langsam wirds aufwenidg alles mehrfach von Hand zu testen…