RMI Angemeldetes Objekt nicht aktuell?

Kai2

Mitglied
Hallo,
ich bin durch zufall auf dieses Forum gestoßen und hoffe, ihr könnt mir helfen:
Ich bin gerade dabei eine Anwendung auf zwei Rechnern mittels RMI kommunizieren zu lassen.
Auf einem Rechner melde ich ein Objekt a in der Registry an (wobei a INstanz der Klasse A). Dieses Objekt anhält eine Hashmap der Form (ID, b) wobei b eine Instand der Klasse B ist.
Sowohl die Interfaces von a und b sind von Remote abgeleitet, da ich auf dem andern Rechner keine Kopien von b haben möchte, sondern per Fernzugriff drauf zugreifen mag.
Die Implementierungen erweitern UnicastRemoteObject und implementieren die Schnittstellen.

So weit so gut.

Wenn ich mir nun von dem andern Rechner das Objekt a per Fernzugriff hole, sind in diesem alle bis dahin in der Hashmap gespeicherten Objekte b' vorhanden. Füge ich nun aber in die Hashmap neue Elemente während der Laufzeit ein und greife danach per Fernzugriff auf mein zuvor referenziertes Objekt a zu - so fehlen diesem diese Objekte in der Hashmap!

Irgendwie kommt mir das so vor, als wäre auf dem Rechner, welcher a in der Regesitry anmeldet zuvor eine Kopie von a gemacht wurde, die nun referenziert wird und forlglich nicht aktuell ist, wenn Änderungen am wirklichen Objekt a vorgenommen werden.
Wenn ich nach jeder Änderung an a am Server ein rebind mache, dann hat der Client die Aktuellen Daten.

Das ist aber natürlich umständlich, da man ein rebind schnell mal vergisst, wenn man es überall machen muss, wo man am Server was an a ändert. Wieso ändere ich denn nicht autormatisch das Objekt in der Registry? Ist dieses jedesmal neu anmelden überhaupt sinnvoll oder mache ich hier etwas falsch?

Schonmal vielen Dank!

MfG Kai
 
T

tuxedo

Gast
Hui... Das ist ja echt fatal. Wäre jetzt echt davon ausgegangen dass sowas auch ohne rebind() geht.

Zeig mal den Codeausschnitt der 'a' erzeugt und dann in der Registry anmeldet. Vielleicht ist da der Wurm drin.

Gruß
Alex
 

mvitz

Top Contributor
Hab den Fall gerade mal nachgestellt und ist in der Tat so wie oben beschrieben:

Java:
package de.mvitz.jf.rmiaktuell;

import java.io.Serializable;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.HashMap;
import java.util.Map;

public final class Test {

    public interface A extends Remote, Serializable {
        Map<Integer, Integer> getMap() throws RemoteException;
    }
    @SuppressWarnings("serial")
    public static final class AImpl implements A {
        private final Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        public AImpl() {
            add();
        }
        void add() {
            int key = map.size() + 1;
            map.put(key, key);
        }
        @Override
        public Map<Integer, Integer> getMap() throws RemoteException {
            return map;
        }
    }
    
    private static final AImpl a = new AImpl();
    
    public static void main(String[] args) throws Exception {
        LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        Naming.bind("a", a);

        for(int i = 1; i < 11; i++) {
            execute(i > 4);
            Thread.sleep(1000);
        }
    }

    private static void execute(boolean withRebind) throws Exception {
        System.out.println("Server: " + a.getMap());
        System.out.println("Client: " + ((A) Naming.lookup("//localhost/a")).getMap());
        a.add();
        if (withRebind) {
            Naming.rebind("a", a);
        }
    }

}

Wird die Map denn vom Server, oder von anderen Clients erweitert? Sollte dies Serverseitig geschehen, müsste man um deine Klasse A eben eine "Serviceschicht" bauen, die sicherstellt, dass nach jedem "put" ein "rebind" aufruft.
 
T

tuxedo

Gast
Hmm, als einziges eventuelles Problem hab ich jetzt mal die statische Instanz der Klasse AImpl ausgemacht. Hast du mal probiert 'a' nicht-statisch in "main" zu erzeugen? Ändert das etwas am Verhalten? "static" bezieht sich ja erstmal auf den ClassLoader. Sind mehrere Classloader im Spiel (was bei RMI durchaus sein könnte), kann es da Probleme geben.

Aber eventuell bist du ja nicht zwingend an RMI gebunden und möchtest mal SIMON ausprobieren?!
Dort sollte es keine derartigen Probleme geben.

- Alex
 

mvitz

Top Contributor
Ja, habe vorher das ganze sogar in separaten Klassen gehabt und AImpl in der Main erzeugt. Das obige Listing ist nur so, da es so kürzer ist und hier nicht so viel Platz weg nimmt.
 
T

tuxedo

Gast
Hmm, okay. Auch wenn ich mir nicht so richtig vorstellen kann dass das wirklich nicht ohne ein rebind() geht (wäre ja wirklich sau-doof von RMI gelöst), ausschließen kann ich's nicht.

Bleibt nur noch zu sagen: Mit SIMON geht das (und vieles andere) ohne Probleme.
 
T

tuxedo

Gast
Stimmt, im Beispiel hat er's nicht drin. Aber im Eingangspost hat er's geschrieben dass er das so gemacht hat:
Die Implementierungen erweitern UnicastRemoteObject und implementieren die Schnittstellen.

... und da hat's ja angeblich auch nicht funktioniert.
 

mvitz

Top Contributor
Korrekt, danke das hatte ich glatt überlesen. Folgendes funktioniert jetzt ohne Probleme
Java:
package de.mvitz.jf.rmiaktuell;

import java.io.Serializable;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public final class Test {

    public interface B extends Remote, Serializable {
        int getNr() throws RemoteException;
    }
    public interface A extends Remote, Serializable {
        Map<Integer, B> getMap() throws RemoteException;
    }
    @SuppressWarnings("serial")
    public static final class BImpl extends UnicastRemoteObject implements B {
        private final int nr;
        public BImpl(int nr) throws RemoteException {
            this.nr = nr;
        }
        @Override
        public int getNr() throws RemoteException {
            return nr;
        }
    }
    @SuppressWarnings("serial")
    public static final class AImpl extends UnicastRemoteObject implements A {
        private final Map<Integer, B> map = new HashMap<Integer, B>();
        public AImpl() throws RemoteException {
            add();
        }
        void add() throws RemoteException {
            int key = map.size() + 1;
            map.put(key, new BImpl(key));
        }
        @Override
        public Map<Integer, B> getMap() {
            return map;
        }
    }
    
    private static AImpl a;
    
    public static void main(String[] args) throws Exception {
        a = new AImpl();
        
        LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        Naming.bind("a", a);

        for(int i = 1; i < 11; i++) {
            System.out.println("Server: " + asString(a.getMap()));
            System.out.println("Client: " + asString(((A) Naming.lookup("//localhost/a")).getMap()));
            a.add();
            Thread.sleep(1000);
        }
        System.exit(0);
    }
    private static String asString(Map<Integer, B> map) throws RemoteException {
        StringBuilder b = new StringBuilder("{");
        for (Entry<Integer, B> entry : map.entrySet()) {
            b.append(entry.getKey()).append("=").append(entry.getValue().getNr()).append(", ");
        }
        b.append("}");
        return b.toString();
    }
}

@Kai2: Du solltest evtl. mal ein vereinfachtes Beispiel posten, in dem man den Fehler nachvollziehen kann.
 

Kai2

Mitglied
Hallo,
erstmal vielen Dank für die ganze Mühe! Ich hatte leider extrem viel Stress an Arbeit, daher komme ich erst jetzt zum posten. Ich habe heute denFehler selber entdeckt und behoben! Ich nutzte die OSGi Plattform und hab ausversehen im Activator einmal eine Dienstregistryinstanz beim Service erstellen kreiert und dann nochmal eine neue Instanz beim binden in die RMI-registry. Der Client hat quasi erst nach dem ersten rebind() auf die richtige Instanz zugegriffen.
War nen blöder Fehler von mir... . Hab den aber durch die hunderte Zeilen an Code leider erst lange nicht entdeckt. Bis zum Glück jetzt :) Euch trotzdem vielen Dank!

Ich bin nun ohnehin von der RMI Variante abgewichen, da ich wie erwähnt die OSGi-Plattform nutze. Habe da nun gelesen, dass es für diese schon fertige Erweiterungen in Hinblick verteilte Anwendungen/Netzwerkkommunikation gibt, so dass es quatsch wäre, RMI händisch anzuwenden. (siehe andere Post von mir in der OSGi-Rubrik)

MfG Kai
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Objekt mit RSA und AES verschlüsseln und entschlüsseln HILFE Netzwerkprogrammierung 4
OnDemand Json Objekt leeres Array beim lesen Netzwerkprogrammierung 9
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
L Java RMI Objekt konsistenz Netzwerkprogrammierung 1
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
R RMI und Entferntes Objekt (EO) Netzwerkprogrammierung 0
A Server Antwort enthält JSON Objekt/Array Netzwerkprogrammierung 8
N Selbes URL Objekt für alle Requests nutzen Netzwerkprogrammierung 7
B udp erkennen um welches objekt es sich handelt / max size Netzwerkprogrammierung 5
S Socket Client liest leeres Objekt Netzwerkprogrammierung 10
D Remote-Objekt-Server : Alternative Methodenaufruflogik zu Reflection und hart codiert Netzwerkprogrammierung 5
D [CORBA] Eigenes Objekt in idl? undefined type Netzwerkprogrammierung 5
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
H Objekt von JSP an Servlet übergeben Netzwerkprogrammierung 4
T Wieso ist mein Objekt leer? Netzwerkprogrammierung 6
L RMI-Objekt zwischen zwei RMI-Servern kopieren Netzwerkprogrammierung 2
S Objekt Felder versenden Netzwerkprogrammierung 5
W Objekt über Socket übertragen Netzwerkprogrammierung 14
G Problem bei Objekt senden von server zu client Netzwerkprogrammierung 6
P RMI - Objekt als Rückgabeparameter Netzwerkprogrammierung 3
M RMI - Ein Objekt für Alle? Netzwerkprogrammierung 5
H Versenden von Objekt Netzwerkprogrammierung 2
J Prblem, wenn im verschickten Objekt ein Array ist Netzwerkprogrammierung 4
JavaDevOp Socket Status von UDP-Port prüfen (PortUnreachableException funktioniert nicht?) Netzwerkprogrammierung 32
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
B Multicast-Nachrichten-Empfang funktioniert nicht Netzwerkprogrammierung 5
M JAX-WS unter Java 17 plötzlich nicht mehr möglich Netzwerkprogrammierung 5
S BufferedStream funktioniert nicht immer Netzwerkprogrammierung 7
T OutputStream kommt nicht an Netzwerkprogrammierung 18
G UDP Packet empfangen funktioniert nicht. Netzwerkprogrammierung 16
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
S .jar läuft local, aber nicht remote (SSH/Terminal) Netzwerkprogrammierung 10
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
J SSL haut nicht hin Netzwerkprogrammierung 3
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
J Wechsel auf Jdk13 , sfpt funktionier nicht mehr Netzwerkprogrammierung 2
Dann07 Proxy funktioniert nicht so wie gewünscht! Netzwerkprogrammierung 18
B RESTful API weiß nicht weiter Netzwerkprogrammierung 2
L Kann VM nicht ueber Host Name finden Netzwerkprogrammierung 0
V Ich finde den Fehler nicht... Netzwerkprogrammierung 2
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
S Socket Webserver mit SSLSocket geht nicht Netzwerkprogrammierung 1
P RMI stub wird nicht gefunden Netzwerkprogrammierung 8
N Test Servlet funktioniert nicht Netzwerkprogrammierung 11
M com.google.gson wird nicht erkannt Netzwerkprogrammierung 2
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D FTP ListNames() funktinoniert nicht richtig Netzwerkprogrammierung 2
Thallius JDBC getConnection kommt nicht zurück Netzwerkprogrammierung 1
KingSquizzi3 Website parsen mit Hilfe von jsoup funktioniert nicht Netzwerkprogrammierung 3
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
F Reader/ Writer werden nicht geschlossen Netzwerkprogrammierung 2
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
R Socket bei server.accept(); gehts nicht weiter Netzwerkprogrammierung 2
K Server liest Daten nicht Netzwerkprogrammierung 6
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
G Mail senden funktioniert nicht mit SSL Netzwerkprogrammierung 7
L IText mit Servlets, funktioniert nicht Netzwerkprogrammierung 0
E Gruppenchat: Über HTTPS oder nicht? Netzwerkprogrammierung 5
P nanoHttp upload.html page lädt nicht Netzwerkprogrammierung 4
M Byte Array kommt nicht an Netzwerkprogrammierung 0
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5
C Servlet erstellen klappt nicht Netzwerkprogrammierung 3
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
B Methoden und Konstruktoren von Java.net package werden nicht geladen Netzwerkprogrammierung 2
L Email versenden mit Java funktioniert nicht, Fehlermeldungen: MessagingException & SocketException Netzwerkprogrammierung 10
L Server anpingen (Pingzeit) ?? Pingzeit wird nicht verändert Netzwerkprogrammierung 6
C Portscanner funktioniert nicht! Netzwerkprogrammierung 8
M JSP wird im gesamten Projekt nicht neugeladen Netzwerkprogrammierung 3
B HTTP Webseite unter IP-Addresse nicht aufrufbar - unter Domain schon Netzwerkprogrammierung 9
K Chatprogramm - Server funktioniert nicht Netzwerkprogrammierung 5
A Socket ASCii Zeichen werden nicht per udp übermittelt. please help . Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
H HTTP Header Response kann nicht ausgelesen werden Netzwerkprogrammierung 4
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
G FTP FTP-Client funktioniert nicht bei Modem-Verbindungen Netzwerkprogrammierung 8
R Socket SSL-Connect in Servlet - keystore wird nicht gefunden Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
V Socket Objekte werden nicht aktualisiert Netzwerkprogrammierung 2
F Kann Klasse nicht zu Servlet casten Netzwerkprogrammierung 5
T Server und Client verbinden nicht Netzwerkprogrammierung 6
M HTTP File Upload mit Prozessbar Funktioniert nicht. Netzwerkprogrammierung 8
K Socket byte Schleife beendet nicht Netzwerkprogrammierung 9
J FTP FTP funktioniert nicht. Netzwerkprogrammierung 5
M Socket Exception tritt auf - weiß nicht weiter Netzwerkprogrammierung 3
L Socket Client empfängt nicht Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben