Announcement

Collapse
No announcement yet.

Frage zur Verteilung von .class-Dateien

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

  • Frage zur Verteilung von .class-Dateien

    Hallo zusammen,

    in einem ersten Test-Projekt mit RMI, das soweit funktioniert, bin ich auf einen Umstand gestoßen, den ich nicht verstehe. Vielleicht kann mir hier jemand helfen?

    Die verteilte Applikation ist folgendermaßen aufgebaut:

    LagerverwaltungRMIServer.class ist die Server-App und veröffentlicht mein RMI-Objekt aus der LagerverwaltungRMIObjClass.class, wofür sie das dazugehörige Interface aus LagerverwaltungRMIInterface.class braucht -> alle Dateien im classpath vorhanden - einverstanden!

    LagerverwaltungRMIClient.class ist die Client-App und benötigt ebenfalls LagerverwaltungRMIInterface.class, da ich ja damit die entsprechende Methode des Stubs aufrufe -> alle Dateien im classpath vorhanden - auch alles klar!

    Was ich nun wirklich nicht verstehe: WIESO muss in der codebase (auf einem Webserver als einzige Datei) LagerverwaltungRMIInterface.class hinterlegt sein?! Server und Client kennen sie doch? Und bevor ich den Client starte, kann ich die Datei sogar löschen, solang der Server schon läuft. Wenn die Datei LagerverwaltungRMIInterface.class nicht in der Codebase vorliegt, tritt eine Ausnahme ein -> wieso?

    In einer Java-Dokumentation stand in etwa: Die Datei muss dort liegen, damit rmiregistry sie beim Veröffentlichen des Stubs laden kann. Aber rmiregistry läuft doch sowieso immer auf dem Server und ich übergebe beim .bind doch eh den fertigen Stub, also wozu dieser Umstand?

    Für eine Klärung wäre ich SEHR!! dankbar!

    Viele Grüße
    robvs

  • #2
    http://openbook.galileocomputing.de/...35646eebfeb7f1
    Christian

    Comment


    • #3
      Hm, tut mir leid, das verstehe ich leider nicht.

      Auf dem Web-Server liegt ja nur das Interface der RMI-Klasse, nicht der Stub.

      Der Client bezieht dann also den vom RMI-Server bei der RMI-Registry angemeldeten Stub.

      Oder ist das Ganze so gemeint: Die RMI-Registry verwendet gar nicht den vom Server übergebenen Stub beim lookup des Clients, sondern generiert mithilfe des Interfaces in der Codebase einen neuen Stub für den Client? Aber wäre das nicht überflüssig?

      Mea maxima culpa, aber zu meiner Verteidigung muss ich sagen, dass ich unter Java relativ wenig praktische Erfahrung habe - gerade bei verteilten Anwendungen.

      Beste Grüße
      robvs

      Comment


      • #4
        Dachte das

        Wenn ein Client einen entfernten Aufruf startet, sucht er die Stub-Klasse. Findet er die Klasse nicht in dem eigenen Namensraum, wird die Codebase hinzugezogen. Der Client wird dann die Stub-Klasse von der angegebenen URL anfordern. Der Server überträgt anschließend die Klassendatei zum RMI-Client. Die Stub-Klasse muss dem Server also bekannt sein, da er sie ja übertragen muss.

        könnte helfen...
        Christian

        Comment


        • #5
          Das dynamic code loading mein ich soweit verstanden zu haben. Ich versteh nur nicht, wozu das Interface so nötig auf dem Server ist, hier der Quelltext
          package rmi_mobile_agent_bsp;

          import java.rmi.Remote;
          import java.rmi.RemoteException;

          public interface LagerverwaltungRMIAgentServerInterface extends Remote {
          LagerverwaltungRMIAgentInterface doTask(LagerverwaltungRMIAgentInterface lv_rmi_agent) throws RemoteException;
          }
          Auch noch ein kleines Verteilungsdiagramm:


          Wenn der RMI-Server läuft, kann ich die Interfacedatei sogar löschen, den Client starten und alles läuft.
          Das serialisierbare Objekt und seine Klasse ...FiFo-Agent werden ohne Probleme übertragen. AgentServer ist übrigens die RMI-Klasse, die über eine entfernte Methode zur Übergabe eines mobilen Agentenobjekts verfügt.

          Außerdem werden Stubs doch seit Java SE 5 dynamisch generiert und ausgeliefert. Wie soll ein Stub dann von einem dezentralen Web-Server geladen werden, wenn der RMI-Server ein anderer ist? Letzterer kann per se schließlich dorthin nichts hochladen? *confused* Ich dachte, die RMI-Registry bekommt mit Aufruf von bind das Stub-Objekt direkt vom Server übergeben, welches sie dann weiter leitet. Und dem Client ist ja zwingender Maßen das zugeh. Interface sowieso bekannt.

          Dann noch folgende unklare Aussage von http://java.sun.com/javase/6/docs/te...llo-world.html unter der Überschrift "Start the server"

          <<Setting the java.rmi.server.codebase system property ensures that the registry can load the remote interface definition (note that the trailing slash is important); for more information about using this property, see the codebase tutorial. >>

          Gut, also die registry muss die Interface-Def laden. Aber wieso nicht aus dem class path? Und wozu überhaupt? Sie bekommt den Stub in schönster Art und Weise vom RMI-Server mit dem Aufruf von bind auslieferfertig übergeben. Und ein Interface für sich genommen ist ja kein Stub.

          Horrido
          robvs
          Zuletzt editiert von robvs; 03.01.2010, 08:16.

          Comment

          Working...
          X