RMI Threads die über RMI auf Datenbank zugreifen

P

Prosec

Gast
Hallo Leute,

ich habe ein Problem und komme einfach nicht weiter!
Im Zuge einer Hausarbeit habe ich mit hsql eine Datenbank erstellt, die zur Verwaltung für eine CarSharing Firma dienen soll. In der Datenbank sind Tabellen zu Kunden, Fahrzeuge, Buchen, usw..
Außerdem habe ich einen Thread erstellt, der eine Fahrt simuliert und regelmäßig gefahrene Kilometer und die gefahrene Zeit in der jeweiligen Buchung aktualisiert. Es können auch mehrer Fahrten parallel laufen.
Das klappt auch alles so weit!
Jetzt ist die Aufgabe, dass die simulierten Fahrten nicht direkt auf die Datenbank zugreifen sollen, sondern über ein RMI-Client/Server System.

Ich muss dazu sagen, dass ich wirklich erst seit ein paar Wochen mit Java arbeite und RMI vorher auch noch nie genutzt hab. Ist also alles Neuland für mich.

Ich habs jetzt mal so probiert:

Interface:
[Java]
package RMI.Server;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.sql.SQLException;

public interface Fahrtinterface extends Remote{

public void updateBuchung (int buchnr, int min, int km)
throws RemoteException, ClassNotFoundException, SQLException;
}
[/code]

Implementation:
Java:
package RMI.Server;

import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;


public class FahrtImpl implements Fahrtinterface{
    static boolean locked = false;
    
   public FahrtImpl() throws RemoteException {
       System.out.println ("Erzeuge Interface");
   }
    @Override
    public synchronized void updateBuchung (int buchnr, int min, int km) 
    throws RemoteException, SQLException, ClassNotFoundException
    {
    /**
     * Warten, falls momentan ein anderer Thread die Datenbank bearbeitet
     */
    while (locked){};
    /**
     * Die Datenbank "abschließen", damit kein anderer Thread zur selben Zeit
     * auf die Datenbank zugreifen kann
     */
    locked = true;
    /**
     * Treiber initialisieren
     */             
    Class.forName ("org.hsqldb.jdbcDriver");           
    /**
     * Verbindung aufbauen
     */                    
    Connection con = DriverManager.getConnection
    ("jdbc:hsqldb:file:C:\\hsql\\data\\datenbank; shutdown=true", "SA", "");
    /**
     * Statement erzeugen
     */    
    Statement stm = con.createStatement();
    /**
     * Kilometer und Endzeit in der Datenbankauf den aktuellen Stand der Fahrt setzen
     */
    String update =
    "UPDATE BUCHT SET ENDE = START + "+min+" MINUTE, "
    + "KILOMETER = "+km+" WHERE BUCHNR = "+buchnr;
    stm.executeUpdate(update);
    stm.close();
    con.close();
    /**
     * Datenbank wieder für andere Threads freigeben
     */
    locked = false;
    }
}

Server:
Java:
package RMI.Server;

import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;


class FahrtServer extends UnicastRemoteObject {

    public FahrtServer() throws RemoteException{
        
        FahrtImpl fi = new FahrtImpl();
        Fahrtinterface stub = (Fahrtinterface) 
        UnicastRemoteObject.exportObject(fi, 0);
        LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        Registry reg = LocateRegistry.getRegistry("127.0.0.1");
        reg.rebind("Fahrtinterface", stub);
        System.out.println("Interface angemeldet.");
    }
        public static void main(String[] args) throws RemoteException, AlreadyBoundException {
        new FahrtServer();
    }
}

Thread:
Java:
package RMI.Client;
import java.rmi.RemoteException;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Rmifahrt extends Thread 
    {
    /**
     * Attribute festlegen
     */
    private final int buchnr;
    private final String fname;
    Fahrtinterface fi;
    /**
     * Konstruktor
     */
    public Rmifahrt (int buchnr, String fname, Fahrtinterface fi)
    {
    this.buchnr = buchnr;
    this.fname = fname;
    this.fi = fi;
    }
    
    
    @Override public void run()
    {
    
    System.out.println(fname+ " wird gestartet!");
    /**
     * Gefahrene Kilometer und Zeit auf Null setzen
     */
    int km = 0;
    int min = 0;
    /**
     * Schleife um Fahrt zu simulieren
     * 
     */
        for ( int i = (int) (Math.random() * 91); i < 95; i++) 
        {
        km = km + (int) (Math.random() * 30);
        min = min + 15;
            try {
                try {
                    /**
                     * Aktuell gefahrene Zeit und Kilometer an die Datenbank übermitteln
                     */
                    fi.updateBuchung(buchnr, min, km);
                } catch (RemoteException ex) {
                    Logger.getLogger(Rmifahrt.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (SQLException ex) {
            Logger.getLogger(Rmifahrt.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
            Logger.getLogger(Rmifahrt.class.getName()).log(Level.SEVERE, null, ex);
            }
        /**
         * Statusmeldung ausgeben
         */
        System.out.println
        (fname+ " hat jetzt "+km+" Kilometer in "+min+" Minuten zurückgelegt!");
        }
    /**
     * Final gefahrenen Kilometer und Zeit ausgeben
     */
    int h = min / 60;
    min = min % 60;
    System.out.println
    (fname+ " wurde beendet und hat "+km+" Kilometer "
    + "in "+h+" Stunden und "+min+" Minuten zurückgelegt!");
    }
}

Client:
Java:
package RMI.Client;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;


public class RmisimuliereFahrten {

    
    public static void main(String[] args) throws RemoteException,
    NotBoundException,
    UnknownHostException
    {
    Registry reg = LocateRegistry.getRegistry("127.0.0.1");
    String sender = InetAddress.getLocalHost().getHostAddress();
    Fahrtinterface fi = (Fahrtinterface) reg.lookup("Fahrtinterface");
    /**
     * Threads erzeugen
     */  
    Thread Fahrt1 = new Rmifahrt(5, "Fahrt 1", fi);
    Thread Fahrt2 = new Rmifahrt(23, "Fahrt 2", fi);
    Thread Fahrt3 = new Rmifahrt(42, "Fahrt 3", fi);
    Thread Fahrt4 = new Rmifahrt(54, "Fahrt 4", fi);

    /**
     * Threads starten
     */
    Fahrt1.start();
    Fahrt2.start();
    Fahrt3.start();
    Fahrt4.start();
    }
}

Die Klassenstruktur sieht wie folgt aus:

Package RMI.Server:
FahrtInterface
FahrtImpl
FahrtServer

Package RMI.Client:
FahrtInterface (Gleicher Inhalt wie in RMI.Server.FahrtInterface)
RmiFahrt (Thread)
RmisimuliereFahrten (Der Client, der ausgeführt werden soll)


Ich bin schon nicht sicher, ob das geht, dass ich "fi" vom Typ Fahrtinterface aus "RmisimuliereFahrten" an den Thread übergeben kann und dann der Thread mit dem Server kommunizieren kann und über "fi.updateBuchung" (Zeile 49 in "RmiFahrt") auf die Datenbank zugreifen kann.
Aber so weit komme ich eh noch nicht!
Den Server kann ich starten, das ist kein Problem.
Aber wenn ich dann "RmisimuliereFahrten" ausführe, bekomme ich diesen Fehler:

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to RMI.Client.Fahrtinterface
at RMI.Client.RmisimuliereFahrten.main(RmisimuliereFahrten.java:21)

Wieso klappt der Cast da nicht? Ich habe alle meine Vorlesungsunterlagen durchforstet und mache alles (was die Verbindung zwischen Server und Client angeht) genau so, wie es beschrieben wurde.
Habe auch gestern und heute schon stundenlang gegoogelt, habe aber keine Lösung gefunden...

Kann mir bitte jemand helfen, ich bin echt am verzweifeln!?
 
S

SlaterB

Gast
ein Objekt vom Typ RMI.Server.Fahrtinterface kann nicht auf RMI.Client.FahrtInterface gecastet werden,
wenn du innerhalb eines Projektes arbeitest kannst du auch zunächst einfache Objekt-Übergabe testen,
packages übrigens (wie auch Variablen) unbedingt klein schreiben!

du brauchst ein gemeinsames Interface, z.B. in package rmi.common
 
P

Prosec

Gast
Es klappt!!!!!!!!!
Oh mein Gott, vielen vielen Dank!
Und vor allem klappt jetzt auch wirklich schon ALLES! Ich hab ja jetzt eigentlich einfach mit der nächsten Fehlermeldung gerechnet, aber die Fahrten wurden korrekt simuliert und auch die Einträge in der Datenbank wurden aktualisiert. :)

Tja da sieht man mal, dass man sich unbedingt immer auf Vorlesungsunterlagen verlassen sollte...Habe gerade nochmal nachgeschaut und in einem Beispiel, dass wir bekommen haben, wurde eindeutig sowohl im Server package, als auch im Client package ein identisches Interface angelegt.

Naja egal, jetzt ist ja alles gut! :)

Wenn ich übrigens rmi vor ein package schreibe, also halt z.B. rmi.common macht mein Netbeans automatisch RMI.common daraus...;)

Also nochmal vielen Dank für die tolle und vor allem schnelle Hilfe! :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
T TCP mit und ohne Threads Netzwerkprogrammierung 1
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
D Exception Handling bei In/Outputsockets in eigenen Threads Netzwerkprogrammierung 1
C Frage zu Threads & Server Netzwerkprogrammierung 4
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
J Threads & Streams Netzwerkprogrammierung 9
S HTTP ServerSockets und Threads Netzwerkprogrammierung 5
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
R Threads mit einem WebService Netzwerkprogrammierung 4
M Verständnisfrage zu RMI und Threads Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
A Threads auflisten und nacheinander ansprechen Netzwerkprogrammierung 6
C I/O - Synchronisation durch Threads in einem ChatClient Netzwerkprogrammierung 4
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
P Threads einbinden Netzwerkprogrammierung 11
P RMI Callback (mit Threads?) Netzwerkprogrammierung 3
T RMI Threads und Synchronized Netzwerkprogrammierung 13
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
S Threads beim Server koordinieren Netzwerkprogrammierung 5
L ClientServer mit 2 Threads Netzwerkprogrammierung 5
N Threads und Socketprogrammierung Netzwerkprogrammierung 4
G 1 Socket 2 Threads problem Netzwerkprogrammierung 13
K Problem mit Threads Netzwerkprogrammierung 3
S Threads bei Web Service sinnvoll oder Alternative? Netzwerkprogrammierung 2
K Hintergrund - Threads Netzwerkprogrammierung 3
G Socket Programmierung - Max. Threads Netzwerkprogrammierung 5
C NetScanner arbeitet trotz Threads langsam Netzwerkprogrammierung 6
L UDP-Server mit Threads Netzwerkprogrammierung 8
K Windows 10 Threads gleichzeitig Netzwerkprogrammierung 18
C Join von Threads bei I/O-Operation Netzwerkprogrammierung 6
F Threads synchronisieren mit Pipes Netzwerkprogrammierung 3
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
T Kleiner Chatserver: Threads oder Multiplex? Netzwerkprogrammierung 18
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
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
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

Ähnliche Java Themen

Neue Themen


Oben