Announcement

Collapse
No announcement yet.

Problem beim Erstellen des Servers

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem beim Erstellen des Servers

    Hallo,
    ich beschäftige mich nun schon mehrere Wochen mit RMI, aber blicke nicht so ganz durch. Ich hoffe, ihr könnt mir helfen. Vlt beschreibe ich zunächst, was ich erreichen möchte und anschließend meine Konzeptionelle Umsetzung mit wenigen Implementierungsdetails. Vlt reicht das schon, damit ihr helfen könnt.

    Grundgedanke: Ich habe verschiedene Rechner auf welchen sich jeweils ein Grundprogramm befindet. Dieses kann durch Dienste erweitert werden. Wir an einem Rechner ein Dienst hinugefügt, sollen alle Rechner diesen Dienst nutzen können, indem sie per remote Zugriiff auf das Dienstobjekt zugreifen.

    Was habe/möchte ich: Ich habe pro Rechner eine Klasse (Dienstregistry), welche alle Dienste im Netzwerk speichert mittels ID und Implementierung bzw. remote Referenz auf Implementierung, wenn der Dienst auf einem andern Rechner liegt. Diese Klasse ist dann meine Serverklasse. Wird ein neuer Dienst an einem Rechner hinzugefügt, kann dieser per RMI auf die Dienstregistry der andern Rechner zugreifen und fügt dort eine Referenz auf den neuen Dienst ein.

    Meine Umsetzung:

    Meine Serverklasse (die Dienstregistry):
    public interface ISimulationRegistry extends Remote {
    ...
    public boolean isLocal(String simulationID) throws RemoteException;
    ... }

    Alle Methoden habe ich eine RemoteException werfen lassen.
    Die dazugehörige Implementierung:
    public class SimulationRegistry extends UnicastRemoteObject implements ISimulationRegistry {...}

    In einer andern Klasse wird der Server an der RMI-Registry angemeldet:
    if(LocateRegistry.getRegistry(this.port) != null){
    this.registry = LocateRegistry.getRegistry(this.port);
    } else {
    this.registry = LocateRegistry.createRegistry(this.port);
    }
    this.registry.rebind("registry", new SimulationRegistry(bundleContext));

    Mein nachfolgender Fehler gibt im Code die letzte Zeile an! (this.registry.rebind...).
    Mache ich hier etwas falsch?

    Der Client dürfte uninteressant sein, da ich nichtmal den Server starten kann und somit überhaupt nicht zu dessen Ausführung komme. Aber dennoch sein relevanter Code:
    ISimulationRegistry remoteRegistry = (ISimulationRegistry)Naming.lookup("//localhost/registry");
    System.out.println(remoteRegistry.sayHello());
    ISimulationElement element = remoteRegistry.getSimulationElementByIDviaRMI("Sim ulation1_0");

    Das ISimulationElement (das sind meine Dienste, auf die ich im Enddefekt fern zugreifen möchte), habe ich analog der Dienstregestry ebenfalls als Remote gekennzeichnet.

    Was vlt hilfreich ist: Die SimulationRegestry (Dienstregistry) war eine bestehende Klasse in meinem Projekt, die schon ein Interface hatte. Zunächst habe ich dieses unverändert gelassen und ein zweites Interface erstellt, in welches ich die beiden beim Client zu sehenden Methoden sayHello() und getSimulationElementByIDviaRMI(String s) eingefügt hatte. Da war es noch möglich die Simulationregistry als Server zu starten! Auf die Clientanfrage wurde auch "Hallo" ausgegeben, aber die zweite Methode hatte nicht Funktioniert. Dort wurde ein null-Objekt zurück geliefert. Wie ich beim Analysieren gemerkt habe, hat meine durch rmi erhaltene SimulationRegistry in ihrerer Hashmap, welche meine Simulationen/Dienste speichert keine Daten. Obwohl da welche sein müssten! Irgendwie wird also anscheinend beim remote-Zugriff nicht alles übergeben.
    Daher dachte ich, dass ich vlt ALLE Methode der SimulationRegistryklasse in das RemoteInterface packen muss, damit alle per fernaufruf nutzbar sind und somit hoffentlich alle Daten da sind. (müssen Funktionen, die von Funktionen verwendet werden, welche als Fernaufrufbar gekennzeichnet sind, ebenfalls fernaufrufbar sein?).
    Das hat aber nun dazu geführt, dass ich meine SimulationRegistry überhaupt nicht mehr als Server starten kann!

    Folgende Fehlermeldung erscheint:
    org.osgi.framework.BundleException: Exception in neo.platform.simulation.simulat
    ionregistry.impl.Activator.start() of bundle neo.platform.simulation.simulationr
    egistry.impl.
    ...
    Caused by: java.rmi.ConnectException: Connection refused to host: 10.35.12.31; n
    ested exception is:
    java.net.ConnectException: Connection refused: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEnd point.java:601)
    at sun.rmi.transport.tcp.TCPChannel.createConnection( TCPChannel.java:198
    )
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCP Channel.java:184)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java: 322)
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
    at neo.platform.simulation.simulationregistry.impl.Ac tivator.start(Activ
    ator.java:76)
    ...
    Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl .java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSoc ketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.j ava:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.j ava:366)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:189)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.cre ateSocket(RMIDirect
    SocketFactory.java:22)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.cre ateSocket(RMIMaster
    SocketFactory.java:128)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEnd point.java:595)
    ... 22 more
    ...
    Nested Exception:
    java.rmi.ConnectException: Connection refused to host: 10.35.12.31; nested excep
    tion is:
    java.net.ConnectException: Connection refused: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEnd point.java:601)
    at sun.rmi.transport.tcp.TCPChannel.createConnection( TCPChannel.java:198
    )
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCP Channel.java:184)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java: 322)
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
    at neo.platform.simulation.simulationregistry.impl.Ac tivator.start(Activ
    ator.java:76)
    ...

    Ich bin ehrlich am verweifeln. Kann mir jemand von euch sagen, was ich falsch mache? Schonmal vielen Dank!

    Viele Grüße,
    Kai
Working...
X