Hibernate über RMI

Status
Nicht offen für weitere Antworten.

Ice-Tea

Bekanntes Mitglied
Hallo,
Ich habe einen RMI Client sowie einen Server. Der Server startet eine DerbyDB und verbindet sich damit.

Der Client verbindet sich über RMi mit dem Server und bekommt so zugriff auf die JPAController.

Mein vorhaben ist es, die Hibernate-Bibliotheken nur dem Server mitzugeben.
Der Client soll möglichst klein bleiben.

Das klappt auch alles ganz gut, nur bekommt der Client beim Aufruf der Remote-Methode eine reference auf die JPAController Klasse. (Der Client läd die Klasse nach und braucht entsprechent ein paar Hibernate Klassen. Außerdem versuct der Client bei LAzY-abfragen sich direkt mit dem DerbyServer zu verbinden, was nicht sein soll)
Jetzt ist die Frage ob ich das durch ein ArrayCopy in der RemoteFacade lösen kann , oder ob ich einen ganz anderen weg einschlagen muss.

Hier ist eine meiner RemoteFacaden
Code:
public class ZutatJpaFacade extends UnicastRemoteObject implements ZutatJpaFacadeRemote {

    private volatile ZutatJpaController zutatJpaController;

    public ZutatJpaFacade(
final ZutatJpaController zutatJpaController,
 final int port, final RMIClientSocketFactory csf,
 final RMIServerSocketFactory ssf) throws RemoteException {
        super(port, csf, ssf);
        this.zutatJpaController = zutatJpaController;
    }

    public ZutatJpaFacade(
final ZutatJpaController zutatJpaController,
 final int port) throws RemoteException {
        super(port);
        this.zutatJpaController = zutatJpaController;
    }

    public void create(kochstudio.entity.Zutat zutat) {
        try {
            zutatJpaController.create(zutat);
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(ZutatJpaFacade.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ZutatJpaFacade.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void edit(kochstudio.entity.Zutat zutat){
        try {
            zutatJpaController.edit(zutat);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(ZutatJpaFacade.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ZutatJpaFacade.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void destroy(Long id) {
        try {
            zutatJpaController.destroy(id);
        } catch (kochstudio.persistence.exceptions.NonexistentEntityException ex) {
            Logger.getLogger(ZutatJpaFacade.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<kochstudio.entity.Zutat> findZutatEntities() {
        return zutatJpaController.findZutatEntities();
    }

    public List<kochstudio.entity.Zutat> findZutatEntities(int maxResults, int firstResult) {
        return zutatJpaController.findZutatEntities(maxResults, firstResult);
    }


    public kochstudio.entity.Zutat findZutat(Long id) {
        return zutatJpaController.findZutat(id);
    }

    public kochstudio.entity.Zutat findZutatByName(String name) {
        return zutatJpaController.findZutatByName(name);
    }

    public int getZutatCount() throws RemoteException {
        return zutatJpaController.getZutatCount();
    }
}

Ich hoffe man versteht mein Problem. Ich bin nicht der beste im Probleme wiedergeben :?
 

Ice-Tea

Bekanntes Mitglied
Würde mir folgender Code wieder eine Reference auf das Remote-Object geben? Bzw. brauche ich dann immernoch die Hibernate-Persitenz-Bags auf der Clientseite?
Code:
    public List<kochstudio.entity.Zutat> findZutatEntities() {
        List<kochstudio.entity.Zutat> zutaten = null;
        System.arraycopy(zutatJpaController.findZutatEntities(), 0, zutaten, 0, zutatJpaController.findZutatEntities().size());
        return zutaten;
    }
Und vorallem was mache ich mir der einzelden zutat? Da kann ich schlecht ein Array kopieren.


Ich bin für ratschläge wirklich sehr dankbar, denn das ganze ist nicht so einfach zu testen.

Ich habe mir extra ein Subnetz in meinem Heimischen Netz anlegen müssen um sicherzustellen, das nur der RMI Port benutzt werden kann. ( geöffnete Port im seperaten Router )
Daher bin ich dann erst daruf gekommen, das der Client auch Port 1524 öffnet und versucht sich direkt mit der DB zu verbinden. Und noch chlimmer, da der Client die Controller-Klasse nachläd, versucht der Client auf die IP im Subnetz zuzugreifen, was nicht sein darf und auch nicht funktionieren kann.
 

byte

Top Contributor
Wenn Du Hibernate Objekte vom Server zum Client weiterreichst, musst Du auf Lazy Loading verzichten. Ansonsten gibts ne LazyInit.Exception, wenn Du auf dem Client (ausserhalb der Hibernate Session) auf die Properties zugreifst. Am besten lädst Du alle Properties auf dem Server vor, bevor Du die Objekte an den Client reichst. Oder Du nullst nicht benötigte Properties vorher (so dass keine Hibernate Collections mehr dahinterliegen).

Wenn Du Dich für Remote Lazy Loading interessiert, dann guck Dir das mal an: http://www.java-forum.org/de/viewtopic.php?t=66958
 

Ice-Tea

Bekanntes Mitglied
Mein Problem liegt wo anders.

Ich hab mal den Client aufein paar zeilen zusammengeschitten um den fehler etwas deutlicher zu machen:

Code:
            SslRMIClientSocketFactory rmiCSF =
                    new SslRMIClientSocketFactory();
            registry = LocateRegistry.getRegistry(
                    server.getHostAddress(), PORT, rmiCSF);

            for(String s : registry.list()){
                System.out.println(s);
            }

            try {
                System.out.println(((ChatFacadeRemote) registry.lookup("ChatFacadeRemote")).getBenutzerAnzahl());
            } catch (NotBoundException ex) {
                Logger.getLogger(RmiClient.class.getName()).log(Level.SEVERE, null, ex);
            } catch (AccessException ex) {
                Logger.getLogger(RmiClient.class.getName()).log(Level.SEVERE, null, ex);
            }

Die for-Schleife fukntioniert noch (der client ist also connected), aber sobald ich ein lookup mache, nimmt der Client nicht mehr die öffentliche IP, sondern die lokale IP des Servers (192.168.1.2)

Hier die Ausgabe:

ZutatJpaFacadeRemote
GerichtJpaFacadeRemote
ChatFacadeRemote
24.01.2009 11:44:39 kochstudio.rmi.RmiClient connect
SCHWERWIEGEND: null
java.rmi.ConnectException: Connection refused to host: 192.168.1.2; nested exception is
...

Gibt es eine möglichkeit die Registry an einer Domäne zu binden ohne ein dns aufsetzten zu müssen?

Über google wurde mir schon eine möglickeit aufgezeigt wie ich die Registry an eine bestimmte ip binde (sofern der Host mehrere IP hat). Aber 1. wurde dabei auf SSL verzichtet und 2. ist das auf die lokalenIPs beschränkt.
 

Ice-Tea

Bekanntes Mitglied
Also, solange server+client hinter einer nat sitzten, werde ich einen anderen weg einschlagen müssen.

Ich hab mir den Thread "Lazy Loading" mal angesehen. Leider bin ich nicht so firm in Annostations, daher kann ich die vorgehensweise nicht ganz nachvollziehen. Außerdem ist im augenblick sowieso alles fetchtype.Eager.

Ich habe aber auch schon etwas gefunden, das mir weiterhilft:

RMI behind NAT

Die vorgehensweise eine NAT zu umgehen in dem der Socket offen gehalten wird ist mir bekannt.

Ist es sinnvoll sich an das Beispiel unter dem Link zu halten oder gibt es da schon besser Lösungen?
 

Ice-Tea

Bekanntes Mitglied
Ich :D hat gesagt.:
Die for-Schleife fukntioniert noch (der client ist also connected), aber sobald ich ein lookup mache, nimmt der Client nicht mehr die öffentliche IP, sondern die lokale IP des Servers (192.168.1.2)


Ganz kurz und schmerzlos:
Code:
System.setProperty("java.rmi.server.hostname", "sub.domaene.com");

:cool:

Zu dem Link in meinem letzten Post:
Ich werd mal bei Gelegenheit versuchen den Chat, der im moment über den Server läuft, P2P aufzubauen. Mal sehen ob ich es hinkrieg :bae:
 
T

tuxedo

Gast
@ice-tea

Zum NAt Thema hinter dem Link:

Soweit ich das verstanden habe ist das kein echter Callback: Der Client ruft in einem Serverthread eine blockierende Methode auf. Hat der Server ein "Event" für den Client löst sich die Blockade und der Client holt das Event ab.

Das ist eher ein Event-Listener-Prinzip statt ein "Callback Prinzip".

Funktionier sicher. Aber "effizient" finde ich das nicht. Irgendwo am Server werden hierfür dann wieder Threads benötigt was die Sache mit "1 Thread pro verbundenen Client" wieder näher rücken lässt.

RMI benutzt AFAIK bei echten Callbacks eine neue Verbindung die vom Server zum Client geöffnet wird. Und genau da hapert's mit der NAT...

Gruß
Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X RMI und Hibernate Netzwerkprogrammierung 2
M RMI RMI + Hibernate + DTO Netzwerkprogrammierung 2
M hibernate importieren Netzwerkprogrammierung 9
R RMI Hibernate Problem Netzwerkprogrammierung 4
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2
E Zwei PCs über das Internet miteinander verbinden? Netzwerkprogrammierung 3
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
E Java über Socket ins Internet? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
M Socket JavaProg über einen Clienten steuern Netzwerkprogrammierung 5
M Mail über Exchange versenden Netzwerkprogrammierung 13
F C/S über HTTPS Netzwerkprogrammierung 2
D ...class.getResourceAsStream("/meine.properties") funktioniert nicht über RMI? Netzwerkprogrammierung 3
M ganymed-ssh2.har: ftp-Verbindung über ftp-Proxy Netzwerkprogrammierung 2
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
Z File über Socket lesen Netzwerkprogrammierung 3
A HTTP Binärdaten über PHP-Skript in Datenbank schreiben bzw auslesen Netzwerkprogrammierung 2
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P FTP isFile() über FTP Netzwerkprogrammierung 3
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
A UCP Connection über Proxy möglich? Netzwerkprogrammierung 7
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
F Char über Netzwerk senden Netzwerkprogrammierung 6
S HTTP Login mit CAS Authentisierung über SSL Netzwerkprogrammierung 2
C Befehle über ein GUI an Server senden Netzwerkprogrammierung 15
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
I Objekte über das Netzwerk Netzwerkprogrammierung 5
M Google Translate über Java ansprechen? Netzwerkprogrammierung 13
F Socket ImageIcon über Socket --> Fehler Netzwerkprogrammierung 14
N Datenaustausch zwischen Java-GUI und PHP-Programm über SOAP Netzwerkprogrammierung 19
L RMI Informationen über die Clients herausfinden Netzwerkprogrammierung 5

Ähnliche Java Themen


Oben