DSLAB 2 Online

  • Ich finde die Aufgabe angenehmer als die erste (und eigentlich auch nicht schwerer). Der große Vorteil ist, dass man viel weniger Netzwerkfehler selbst abdecken muss - vieles darf ja gar nicht ausfallen. Man kann sich, wenn man sich mal RMI angeschaut hat, einfach auf die Programmlogik konzentrieren.
    Zusätzlich finde ich auch die Angabe wesentlich klarer als die erste; da musste ich mein halbes Programm umschreiben, weil ich ein paar Dinge anders ausgelegt hatte.

  • Die Kopfschmerzen verschwinden ziemlich schnell glaub mir. Meine ersten Schritte in Sachen RMI, Middlewares und Co waren auch mehr als mühsam. Wenn mans aber mal hat gehts echt leicht von der Hand.


    Die Angabe find ich auch sehr ausführlich, wobei die Fragen für gewöhnlich ja erst beim umsetzen entstehen :-)

  • hi! eine frage zu den nameservern


    hier seht ja man soll mehrere interfaces implementieren
    (nameverver - client,
    namesever - nameserver,
    und nameserver - fileserver)


    nun stellt sich für mich die frage, welche methoden im interface nameserver-fileserver vom nameserver angeboten werden sollen? mir fällt da keine ein, weil ein nameserver soll ja net direkt mit dem fileserver kommunizieren und bei mir ist es zb. so dass ich in einem nameserver eine liste von fileservern gespeichert habe.
    aus der liste kann ich ja dann vom entsprechenden nameserver den jeweiligen fileserver an den client liefern.
    mir fällt nur das unten gesagte ein, wo der fileserver auf den nameserver zugreifen würde?!!?!


    edit:
    vielleicht dass der nameserver die register-fileserver-methode und eben die unregisterfileserver-methode anbietet (=wenn am fileserver enter zum shut down gedrückt wurde..)?

  • Hallo,


    Ich habe die Aufgabe und den ersten Tutorial einmal durchgelesen, aber mir wird es nicht ganz klar, womit und wie ich beginnen soll :confused:
    .)Sollen wir jetzt einen Root-Server implementieren, die neue Nameservers erstellt ( z.B: mit "new Server(example.at)") und sie hierarchisch strukturiert ?
    .)Wie kann der Fileserver entscheiden, unter welcher Name er stehen wird ? Wenn es der Root-Server handelt, wie handelt er es :) ?
    .)Was soll genau die Propertiesdatei machen? (Ich hab es nicht ganz gut verstanden.)


    Danke im Voraus!

    Edited once, last by taboo: Fragen.. ().


  • .)Sollen wir jetzt einen Root-Server implementieren, die neue Nameservers erstellt ( z.B: mit "new Server(example.at)") und sie hierarchisch strukturiert ?


    der root ist ein nameserver (der halt ohne argumente angestartet wird), der als besonderheit das RMI registry erstellt (mit dem port aus der properties datei) und sich binded (mit dem namen aus der properties datei)


    bsp:
    java nameserver (jetzt gibt es ein root nameserver, der das registry erstellt halt und sich selber als root-ns binded)


    java nameserver at (jetzt gibt es die at domain, er greift über rmi auf den root-ns zu und sagt ihm "ich (der grad angestartete server) bin jetzt für at zuständig, falls dich jemand danach fragt")


    root->at


    java nameserver example.at (jetzt gibt es die example.at, er greift über rmi auf den root-ns zu und der reicht die anfrage auf den "at" server weiter und sagt ihm "ich (der grad angestartete server) bin jetzt für "example" zuständig, falls dich jemand danach fragt")


    root->at->example


    java nameserver example.de (geht nicht, weil kein nameserver bis jetzt beim root-ns registriert hat für die "de" domain)


    root->(gibt kein "de")



    .)Wie kann der Fileserver entscheiden, unter welcher Name er stehen wird ? Wenn es der Root-Server handelt, wie handelt er es :) ?


    genauso wie ein nameserver sich registriert ... er schnappt sich die properties datei ... benützt rmi um auf das interface vom root nameserver zuzugreifen ... handelt sich jetzt entlang der subdomains der nameserver und ruft beim letzten halt "registrier mich für die subdomain)


    ex:
    fileserver will sich auf "download.example.at" registrieren: (java fileserver download.example.at /downloaddir/)


    properties datei lesen um rmi parameter zu bekommen
    rmi benützen um mit dem root NS zuzugreifen..
    root-NS nachfragen wer für "at" zuständig ist
    "at" nachfragen wer für "example" zuständig ist
    "example" sagen das man für "download" zuständig ist und ein fileserver ist


    .)Was soll genau die Propertiesdatei machen? (Ich hab es nicht ganz gut verstanden.)


    sie auslesen um die rmi parameter zu bekommen (um aufs rmi registry zuzugreifen (um dann auf den root-ns zuzugreifen) bzw. der root-ns mit welchen parametern er dieses registry erstellen soll)

  • Danke vielmals für deine Antwort!


    Ich muss dann eine Nameserverklasse, eine Fileserverklasse und eine Clientklasse implementieren (natürlich mit Interfaces usw..), dabei die Serverklassen untereinander kommunizieren können und Client nur mit der Rootserverklasse kommunizieren soll, oder ?


    Und noch eine kurze Frage:
    Müssen die Servers multithreaded sein? Bei der Aufgabenbeschreibung steht darüber nichts. (oder ich habe es übersehen)

  • Zu aller erst danke an samyjr für die tolle Erklärung.


    Nun zu meiner Frage: Ich weiß nicht was ich mit den dingen aus dem properties file anfangen soll.
    Wenn ich z.B. folgenden Code vom verlinkten Tutorial ansehe:

    Wenn man sich dann das properties file anschaut:

    Code
    1. # the host name of the registry server
    2. registry.host = localhost
    3. # the port where the registry service is listening, replace it with a real value such as 12500
    4. registry.port = 10000 + dslabXXX * 10
    5. # the name to be used for binding the nameserver object
    6. ro_id = root_Ns

    Wäre nun im oben geposteten Codes localhost der registry.host, 1099 der registry.port und
    CalculatorService ro_id?

  • Hi,


    Ich habe wieder einige Fragen. Falls jemand mir einige Tipps geben kann, waere ich sehr dankbar.


    Zuerst konnte ich nicht herausfinden, wie ich mehrere Nameservern laufen lassen kann, wenn alle den selben Port verwenden. Ich habe derzeit keine Ahnung, wie ich es implementieren kann.
    Außerdem wollte ich noch fragen, wie ich die hierarchische Struktur von Nameservern tun soll. Gibt es bereits Methoden dafür in der Registry oder Namingklassen, oder soll ich es mit z.B: HashMaps machen?
    Eine letzte Frage noch; Was tut genau das Befehl "UnicastRemoteObject.exportObject"? So wird ein Stub von einem Objekt erstellt, aber ist das alles?


    Vielen Dank im Voraus!

  • wo soll das problem sein wenn mehrere name server laufen? jeder erstellt ein remote objekt und exportiert es. du brauchst überhaupt nichts mit irgendwelchen ports machen.
    UnicastRemoteObject.exportObject() will als Parameter zwar einen Port, aber da kannst du einfach 0 reinschicken, dann sucht er sich einen freien Port. Das steht zwar nicht in der API, dafür aber in der Angabe:

    Quote from Angabe

    To make your object remotely available you have to export it. This can either be accomplished by extending java.rmi.server.UnicastRemoteObject or by directly exporting it using the static method java.rmi.server.UnicastRemoteObject.exportObject(Remote obj, int port). Use 0 as port, so any available port is selected by the operating system


    mfg poseidon

  • steht zwar nicht in der API


    doch

    Quote from http://java.sun.com/javase/6/docs/api/java/rmi/server/UnicastRemoteObject.html#UnicastRemoteObject(int)


    Parameters:
    port - the port number on which the remote object receives calls (if port is zero, an anonymous port is chosen)

    "All through my life I've had this strange unaccountable feeling that something was going on in the world, something big, even sinister, and no one would tell me what it was."
    "No," said the old man, "that's just perfectly normal paranoia. Everyone in the Universe has that."

    😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏😐😒😓😔😖😘😚😜😞😠😡😢😣😥😨😩😪😫😭😰😱😲😳😵😶😷

  • ok ja beim konstruktor stehts, aber nicht bei der statischen methode. Wer kommt schon auf die idee die doku von einem konstruktor zu lesen wenn man eine statische methode verwenden will.

  • In jedem Tutorial welches verlinkt ist steht ich muss rmiregistry starten. In der Angabe, wo eigentlich jeder Furz beschrieben ist steht aber nichts davon. Muss ich das jetzt irgendwie so programmiern dass man das nicht braucht?

  • In jedem Tutorial welches verlinkt ist steht ich muss rmiregistry starten. In der Angabe, wo eigentlich jeder Furz beschrieben ist steht aber nichts davon. Muss ich das jetzt irgendwie so programmiern dass man das nicht braucht?

    Die Angabe schwafelt davon, dass der Rootserver eine Registry startet:

    Quote

    In our case, the root nameserver starts a registry using the LocateRegistry.createRegistry(int port) method.

  • wo soll das problem sein wenn mehrere name server laufen? jeder erstellt ein remote objekt und exportiert es. du brauchst überhaupt nichts mit irgendwelchen ports machen.


    Brauchen wir für den Registry keinen Port?

    Code
    1. LocateRegistry.createRegistry(Registry.REGISTRY_PORT);


    Ich glaube, mein Problem ist mit dem Kommunakation zwischen den Nameservern. Wenn der Rootserver einen Registry erstellt, muss der diesen Registry zu den anderen Nameservern weiterleiten, oder ?
    Aber wie kann man kontrollieren, wie oft eine Klasse aufgerufen wird, wenn es der Benutzer selbst macht.


    z.B: Ich will, dass der Rootserver eine Liste hat, die alle Nameservern beinhaltet. Aber jedesmal, wenn der Benutzer einen Nameserver startet, wird der als Rootserver mit einer leeren Liste gestartet.


    Vielleicht klingt meine Frage dumm, aber ich kann die Lösung dafür nicht finden :shiner:

  • Die Registry soll natürlich auf einem definierten Port laufen. Vielleicht solltest du mal ein paar von den RMI Tutorials und die Angabe lesen. Aber ich erklärs halt.


    Dein Rootserver (von dems nur einen einzigen gibt) startet die Registry und bindet sein Remote Object in der Registy. Das ist das einzige Objekt das jemals in der Registry gebindet werden soll (laut Angabe).


    Jeder weitere Server der gestartet wird ist entweder ein Nameserver oder ein Fileserver (kein weiterer Rootserver). Diese zwei starten keine Registry, sondern holen sich das remote object des root servers aus der registry und registrieren sich direkt bei diesem (das heißt diesen registrierungsvorgang musst du selbst implementieren, was aber in der Angabe genau beschrieben ist).


    Wenn du kontrollieren willst, dass nur ein Root server gestartet werden kann, fällt das hier praktisch gratis ab, weil du beim starten eines root servers ja versuchst eine registry auf einem bestimmten port zu starten, was fehlschlagen wird wenn dort schon eine Registry läuft. Das heißt du musst diesen Fehlerfall kontrolliert abfangen, dann kann es immer nur einen Root Server geben.


    mfg

  • Root-Sever ... Das ist das einzige Objekt das jemals in der Registry gebindet werden soll (laut Angabe).


    Damit bin ich nicht so ganz einverstanden. Ich verstehe die Angabe so, dass nur der Root-Server eine Registry startet. Die anderen Server binden schon ihr Objekt auch an die Registry, oder?