330 likes | 505 Views
Λειτουργία RMI και Ζητήματα Σχεδίασης. Στούμπος Βασίλης stoumpos@di.uoa.gr Πανεπιστήμιο Αθηνών Τμήμα Πληροφορικής. Περίληψη. Crash course σε Java. Παράδειγμα σε RMI. Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. RMI . Σχεδιασμός. Περίληψη - Java. Crash course σε Java.
E N D
Λειτουργία RMI καιΖητήματα Σχεδίασης Στούμπος Βασίλης stoumpos@di.uoa.gr Πανεπιστήμιο Αθηνών Τμήμα Πληροφορικής
Περίληψη • Crash course σε Java. • Παράδειγμα σε RMI. • Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. • RMI. • Σχεδιασμός.
Περίληψη - Java • Crash course σε Java. • Κλάσεις και αντικείμενα. • Διαφορές με τη C++. • Παράδειγμα σε RMI. • Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. • RMI. • Σχεδιασμός.
Οι κλάσεις (classes) ορίζουν τύπους αντικειμένων. Τα αντικείμενα (objects)είναι στιγμιότυπα (instances)των κλάσεων. Οι κλάσεις ομαδοποιούνται σε μια ιεραρχία πακέτων (packages). package gr.uoa.di.stoumpos; public class Counter { private int value; public Counter(int v) { this.value = v; } public int getValue() { return this.value; } public void increment() { this.value++; } } Κλάσεις στην Java
Τα αντικείμενα (objects)είναι στιγμιότυπα (instances)των κλάσεων. Πρόσβαση στα αντικείμενα μόνο μέσω αναφορών(references). Πεδία αντικειμένων και πεδία κλάσεων (class/object fields). Garbage collecting. Counter a = new Counter(12); Counter b = new Counter(-12); for (int i=0; i< 10; i++) { a.increment(); } b.increment(); System.out.println( “Counter a value is ” + a.getValue()); System.out.println( “Counter b value is ” + b.getValue()); Αντικείμενα στην Java
Μία μόνο publicκλάση σε κάθε αρχείο. Όνομα του αρχείου όπως η publicκλάση. Μεταγλώττιση με javac. Εκτέλεση με java. Υπάρχει mainμέθοδος κλάσης. Ιδεατή Μηχανή (VM-Virtual Machine) /* Αρχείο: TestProg.java */ import gr.uoa.di.stoumpos; public class TestProg { public static void main( String[] args) { for(i=0; i<args.length; i++){ System.out.println( “arg[” + i + “]=” + args[i]); } } Πρόγραμμα Java
Η εξαίρεση είναι ένα αντικείμενομιας κλάσης. Εξαιρέσεις χρησιμοποιούνται σε εξαιρετικές περιπτώσεις. Η δυνατότητα εξαίρεσης (throw exception)δηλώνεται στις μεθόδους. Διαχείριση λαθών με try-catchμπλοκ. Εξαιρέσεις: Runtime Error Άλλες try { FileInputStream stream = new FileInputStream( new File(“foo.dat”)); } catch(FileNotFoundException fnfe) { // ... } catch(SecurityException se) { // ... } catch(IOException ioe) { // ... } catch(Throwable) { throw new MyException(); } finally { // ... } Εξαιρέσεις (Exceptions) στη Java
Αντικειμενοστρεφές Μοντέλοστη Java • Κληρονομικότητα (inheritance) • Μόνο απλή (όχι multiple inheritance από C++). • Χρήση Interface: σαν κλάση χωρίς σώματα μεθόδων • Πολυμορφισμός(polymorphism) • Όπως στη C++. • Strong-typed γλώσσα. • Ενθυλάκωση(encapsulation) • Τέσσερα επίπεδα περιορισμών (visibility scope): private, protected, public και package.
Περίληψη - RMI • Crash course σε Java. • Παράδειγμα σε RMI. • Απλό παράδειγμα. • Εγκατάσταση συστήματος. • Ειδικές περιπτώσεις. • Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. • RMI. • Σχεδιασμός.
Τοπική και Απομακρυσμένη ΚλήσηΜεθόδου • Πουβρίσκεται το αντικείμενο; • Πωςγίνεται η κλήση; • Ποιος αναλαμβάνει τις λεπτομέρειες της κλήσης;
Παράδειγμα RMI • Τι θα πει απομακρυσμένη κλήση; • Μια μέθοδος, κάποιου αντικειμένου, καλείται από κάποια άλλη. • Διαφορετικός χώρος διευθύνσεων. • Διαφορετικό μηχάνημα (δίκτυο). • Τρόπος κλήσης κοινός με τοπική κλήση. • Διαφοροποιούμε: • Διεπαφή (interface). • Υλοποίηση (implementation). • Θα δούμε τον μετρητή σαν παράδειγμα.
Όλες οι διεπαφές είναι εξειδικεύσεις της java.rmi.Remoteδιεπαφής. Όλες οι μέθοδοι μπορεί να δώσουν RemoteException. Το ίδιο interface πρέπει να χρησιμοποιεί και ο καλούμενος και ο καλών. import java.rmi.*; public interface Counterextends java.rmi.Remote { public void setValue(int v) throws RemoteException; public int getValue() throws RemoteException; public void increment() throws RemoteException; } Διεπαφή Μετρητή
Η υλοποίηση επεκτείνει το java.rmi.UnicastRemoteObject και υλοποιεί τοCounter. Μπορούν να οριστούν πεδία της υλοποίησης. Απαραίτητος default constructor. Οι υλοποιήσεις δεν επηρεάζονται από το είδος κλήσης. import java.rmi.*; public class CounterImpl extends java.rmi.UnicastRemoteObject implements Counter { int value = 0; public Counter() throws RemoteException { super(); } public void setValue(int v) throws RemoteException { this.value = v; } //... } Υλοποίηση Μετρητή
Απαιτείται να: Κατασκευαστεί το αντικείμενο εξυπηρέτης. Δεσμευθεί ένα «όνομα» για αυτό. Να συνδεθεί (bind) με μια διεύθυνση. Ο εξυπηρέτης τρέχει συνέχεια. Χρειάζεται να τρέχει το rmiregistry. import java.rmi.*; public class CounterServer { public static void main( String[] args) { Counter counter = null; String url = “rmi://localhost” + “:1099/MyNiceCounter”; try { counter = newCounter(); Naming.bind(url, counter); } catch(Exception e) { System.exit(-1); } } Εξυπηρέτης Μετρητή
Απαιτείται να: Αναγνωρισθεί το «όνομα» του αντικειμένου. Αναφορά στο απομακρυσμένο αντικείμενο. Χρήση της αναφοράς. Πολλοί πελάτες εκτελούνται ταυτόχρονα. Χρειάζεται να τρέχει ο εξυπηρέτης. Counter counter = null; String url = “rmi://localhost” + ":1099/MyNiceCounter”; try { counter = Naming.lookup(url); counter.increment(); System.out.println( “Counter a value is ” + counter.getValue()); } catch(Exception e) { //... } Απομακρυσμένη Κλήση Μετρητή
stub skeleton Επίτευξη Απομακρυσμένης Κλήσης • Λεπτομέρειες της κλήσης: • Κώδικας που γεννιέται αυτόματα. • Stubsκαι Skeletons. • Πέρασμα παραμέτρων και αποτελεσμάτων. • Οι διεπαφές έχουν όλη την πληροφορία. • Marshalling/Unmarshalling.
Μεταγλωττίζουμε όλες τις κλάσεις. Χρήση javac. Κατασκευάζουμε τον αυτόματο κώδικα. Χρήση rmic. Μοιράζουμε κλάσεις στις τοποθεσίες που θα χρειαστούν jar Εκτελούμε (σε χωριστά shells): rmiregistry java gr.uoa.di. stoumpos.CounterServer Java gr.uoa.di. stoumpos.CounterClient Εγκατάσταση Συστήματος
Περίληψη – Σχεδιασμός (RMI) • Crash course σε Java. • Παράδειγμα σε RMI. • Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. • RMI. • Εξαιρέσεις. • Παράμετροι. • Σχεδιασμός.
Περίληψη – Σχεδιασμός (RMI) • Crash course σε Java. • Παράδειγμα σε RMI. • Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. • RMI. • Εξαιρέσεις. • Παράμετροι. • Σχεδιασμός.
Πέρασμα Παραμέτρων στο RMI • Πρωτογενείς Τύποι: • int,char,double,… • Αντιγραφή των τιμών. • Αντικείμενα Java. • Απομακρυσμένα RMI αντικείμενα.
Πέρασμα Αντικειμένων στο RMI • Αντικείμενα Java: • Πρέπει να είναι serializable! • Υλοποιούν την διεπαφή java.io.Serializable. • Μεταφορά στιγμιότυπου σε σειρά από bytes. • Όλα τα μέλη ενός «σειριοποιήσιμου» αντικειμένου πρέπει να είναι «σειριοποιήσιμα». • Τα πεδία των κλάσεων δεν λαμβάνονται υπόψη στη σειριοποίηση. • Αντιγραφή bytes, και αναδόμηση στον προορισμό. • Αντιγραφή ολόκληρων αντικειμένων.
Πέρασμα RMI Αντικειμένωνστο RMI • Αντικείμενα RMI: • Στην κατασκευή (constructor) τους τα αντικείμενα αυτά είναι έτοιμα να δεχθούν απομακρυσμένη κλήση. • Δεν έχουν συνδεθεί (bind) με όνομα πιθανώς. • Κατασκευή απομακρυσμένων αναφορών στα αντικείμενα. • Αντιγραφή αναφοράς.
Διαχείριση Λαθών • Κάθε φορά που κάτι πάει στραβά έχουμε εξαίρεση (exception). • Δύο ειδών εξαιρέσεις: • Εφαρμογής. • Συστήματος. • Επιτρέπεται να έχουμε στην διεπαφή και εξαιρέσεις εφαρμογής. • Μήπως είναι καλύτερο να χρησιμοποιήσουμε wrappers; • Η κλάση Exception υλοποιεί το Serialized. • Μία εξαίρεση μπορεί να έχει εμφωλιασμένες εξαιρέσεις (nested exceptions).
Περίληψη – Σχεδιασμός • Crash course σε Java. • Παράδειγμα σε RMI. • Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. • RMI. • Σχεδιασμός. • Συγχρονισμός. • Callbacks. • Blocking/Callbacks/Polling. • Push και Pull.
Κατασκευάζουμε ένα αντικείμενο που κρατά Strings που φτάνουν σε αυτό. Ζητούμε τα strings με δείκτες. Δεν αφαιρούμε strings ποτέ. public interface List { public void addString( String s) throws ...; public String getString( int i) throws ...; public int getNumOfStrings() throws RemoteException; } Σχεδιασμός Συγχρονισμού
Στην υλοποίηση κρατούμε τα strings σε ένα πίνακα. Σίγουρα θα χάσουμε strings! //... public void addString( String s) { if (this.counter) { throw new Exception( “No space!”); } this.stringArray[ this.counter++] = s; } // ... Σχεδιασμός Συγχρονισμού (συν.)
Συγχρονίζουμε την πρόσβαση στον πόρο (resource). Χρησιμοποιούμε τον synchronized μηχανισμό της Java. Προσοχή στην έκταση συγχρονισμού! Προσοχή στο κοινό σημείο συγχρονισμού! //... public void addString( String s) { synchronized( this.stringArray) { if (this.counter) { throw new Exception( “No space!”); } this.stringArray[ this.counter++] = s; } } // ... Σχεδιασμός Συγχρονισμού (συν.)
Τρόπος Κλήσης • Όλες οι RMI κλήσεις είναι σύγχρονες (synchronous/blocking). • Ο καλούμενος αναστέλλει την εκτέλεσή του μέχρι να εκτελεστεί η απομακρυσμένη μέθοδος. • Μπορούμε να έχουμε κλήση ασύγχρονη; • Σε επίπεδο σχεδίασης ναι. • Δύο λύσεις: • Callbacks • Polling
Blocking Κλήση Client Stub Skeleton Server idle
Callback Κλήση Client Callback Server create thread idle other processing
Polling μετά τηνΚλήση Client Request Server thread create poll updte poll other processing
Άλλες Τεχνικές • Push και Pull • Thread Pools • Άλλα;
Αναφορές • Java • “Thinking in Java”, Bruce Eckel, διαθέσιμο από το www.bruceeckel.com. • “The Java Tutorial”, Sun, διαθέσιμο από το http://java.sun.com/docs/books/tutorial/index.html. • RMI • “Fundamentals of RMI”, jGuru, διαθέσιμο (μαζί με άλλα) από το http://developer.java.sun.com/developer/onlineTraining/. • Architecture (πάρα πολλά – ένα όχι τρομερό) • “Pattern-Oriented Software Architecture”, Douglas C. Schmidt, διαθέσιμο από (σύνδεσμος powerpoint slides) το http://www.cs.wustl.edu/~schmidt/POSA/. • Άλλα • Το www.google.comείχει πολύ καλά αποτελέσματα όταν έψαξα.