Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Λειτουργία RMI και Ζητήματα Σχεδίασης

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Λειτουργία RMI και Ζητήματα Σχεδίασης"— Μεταγράφημα παρουσίασης:

1 Λειτουργία RMI και Ζητήματα Σχεδίασης
Στούμπος Βασίλης Πανεπιστήμιο Αθηνών Τμήμα Πληροφορικής

2 Περίληψη Crash course σε Java. Παράδειγμα σε RMI.
Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. RMI. Σχεδιασμός.

3 Περίληψη - Java Crash course σε Java. Παράδειγμα σε RMI.
Κλάσεις και αντικείμενα. Διαφορές με τη C++. Παράδειγμα σε RMI. Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. RMI. Σχεδιασμός.

4 Κλάσεις στην Java Οι κλάσεις (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++;

5 Αντικείμενα στην 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()); “Counter b value is ” + b.getValue());

6 Πρόγραμμα Java Μία μόνο 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]); }

7 Εξαιρέσεις (Exceptions) στη 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 { }

8 Αντικειμενοστρεφές Μοντέλο στη Java
Κληρονομικότητα (inheritance) Μόνο απλή (όχι multiple inheritance από C++). Χρήση Interface: σαν κλάση χωρίς σώματα μεθόδων Πολυμορφισμός (polymorphism) Όπως στη C++. Strong-typed γλώσσα. Ενθυλάκωση (encapsulation) Τέσσερα επίπεδα περιορισμών (visibility scope): private, protected, public και package.

9 Περίληψη - RMI Crash course σε Java. Παράδειγμα σε RMI.
Απλό παράδειγμα. Εγκατάσταση συστήματος. Ειδικές περιπτώσεις. Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. RMI. Σχεδιασμός.

10 Τοπική και Απομακρυσμένη Κλήση Μεθόδου
Που βρίσκεται το αντικείμενο; Πως γίνεται η κλήση; Ποιος αναλαμβάνει τις λεπτομέρειες της κλήσης;

11 Παράδειγμα RMI Τι θα πει απομακρυσμένη κλήση;
Μια μέθοδος, κάποιου αντικειμένου, καλείται από κάποια άλλη. Διαφορετικός χώρος διευθύνσεων. Διαφορετικό μηχάνημα (δίκτυο). Τρόπος κλήσης κοινός με τοπική κλήση. Διαφοροποιούμε: Διεπαφή (interface). Υλοποίηση (implementation). Θα δούμε τον μετρητή σαν παράδειγμα.

12 Διεπαφή Μετρητή Όλες οι διεπαφές είναι εξειδικεύσεις της java.rmi.Remote διεπαφής. Όλες οι μέθοδοι μπορεί να δώσουν RemoteException. Το ίδιο interface πρέπει να χρησιμοποιεί και ο καλούμενος και ο καλών. import java.rmi.*; public interface Counter extends java.rmi.Remote { public void setValue(int v) throws RemoteException; public int getValue() public void increment() }

13 Υλοποίηση Μετρητή Η υλοποίηση επεκτείνει το 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) this.value = v; //...

14 Εξυπηρέτης Μετρητή Απαιτείται να: Ο εξυπηρέτης τρέχει συνέχεια.
Κατασκευαστεί το αντικείμενο εξυπηρέτης. Δεσμευθεί ένα «όνομα» για αυτό. Να συνδεθεί (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 = new Counter(); Naming.bind(url, counter); } catch(Exception e) { System.exit(-1); }

15 Απομακρυσμένη Κλήση Μετρητή
Απαιτείται να: Αναγνωρισθεί το «όνομα» του αντικειμένου. Αναφορά στο απομακρυσμένο αντικείμενο. Χρήση της αναφοράς. Πολλοί πελάτες εκτελούνται ταυτόχρονα. Χρειάζεται να τρέχει ο εξυπηρέτης. 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) { //... }

16 Επίτευξη Απομακρυσμένης Κλήσης
Λεπτομέρειες της κλήσης: Κώδικας που γεννιέται αυτόματα. Stubs και Skeletons. Πέρασμα παραμέτρων και αποτελεσμάτων. Οι διεπαφές έχουν όλη την πληροφορία. Marshalling/Unmarshalling. skeleton stub

17 Εγκατάσταση Συστήματος
Μεταγλωττίζουμε όλες τις κλάσεις. Χρήση javac. Κατασκευάζουμε τον αυτόματο κώδικα. Χρήση rmic. Μοιράζουμε κλάσεις στις τοποθεσίες που θα χρειαστούν jar Εκτελούμε (σε χωριστά shells): rmiregistry java gr.uoa.di. stoumpos.CounterServer Java gr.uoa.di. stoumpos.CounterClient

18 Περίληψη – Σχεδιασμός (RMI)
Crash course σε Java. Παράδειγμα σε RMI. Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. RMI. Εξαιρέσεις. Παράμετροι. Σχεδιασμός.

19 Περίληψη – Σχεδιασμός (RMI)
Crash course σε Java. Παράδειγμα σε RMI. Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. RMI. Εξαιρέσεις. Παράμετροι. Σχεδιασμός.

20 Πέρασμα Παραμέτρων στο RMI
Πρωτογενείς Τύποι: int, char, double,… Αντιγραφή των τιμών. Αντικείμενα Java. Απομακρυσμένα RMI αντικείμενα.

21 Πέρασμα Αντικειμένων στο RMI
Αντικείμενα Java: Πρέπει να είναι serializable! Υλοποιούν την διεπαφή java.io.Serializable. Μεταφορά στιγμιότυπου σε σειρά από bytes. Όλα τα μέλη ενός «σειριοποιήσιμου» αντικειμένου πρέπει να είναι «σειριοποιήσιμα». Τα πεδία των κλάσεων δεν λαμβάνονται υπόψη στη σειριοποίηση. Αντιγραφή bytes, και αναδόμηση στον προορισμό. Αντιγραφή ολόκληρων αντικειμένων.

22 Πέρασμα RMI Αντικειμένων στο RMI
Στην κατασκευή (constructor) τους τα αντικείμενα αυτά είναι έτοιμα να δεχθούν απομακρυσμένη κλήση. Δεν έχουν συνδεθεί (bind) με όνομα πιθανώς. Κατασκευή απομακρυσμένων αναφορών στα αντικείμενα. Αντιγραφή αναφοράς.

23 Διαχείριση Λαθών Κάθε φορά που κάτι πάει στραβά έχουμε εξαίρεση (exception). Δύο ειδών εξαιρέσεις: Εφαρμογής. Συστήματος. Επιτρέπεται να έχουμε στην διεπαφή και εξαιρέσεις εφαρμογής. Μήπως είναι καλύτερο να χρησιμοποιήσουμε wrappers; Η κλάση Exception υλοποιεί το Serialized. Μία εξαίρεση μπορεί να έχει εμφωλιασμένες εξαιρέσεις (nested exceptions).

24 Περίληψη – Σχεδιασμός Crash course σε Java. Παράδειγμα σε RMI.
Ζητήματα σχεδίασης (κατανεμημένων) εφαρμογών. RMI. Σχεδιασμός. Συγχρονισμός. Callbacks. Blocking/Callbacks/Polling. Push και Pull.

25 Σχεδιασμός Συγχρονισμού
Κατασκευάζουμε ένα αντικείμενο που κρατά Strings που φτάνουν σε αυτό. Ζητούμε τα strings με δείκτες. Δεν αφαιρούμε strings ποτέ. public interface List { public void addString( String s) throws ...; public String getString( int i) throws ...; public int getNumOfStrings() throws RemoteException; }

26 Σχεδιασμός Συγχρονισμού (συν.)
Στην υλοποίηση κρατούμε τα strings σε ένα πίνακα. Σίγουρα θα χάσουμε strings! //... public void addString( String s) { if (this.counter) { throw new Exception( “No space!”); } this.stringArray[ this.counter++] = s; // ...

27 Σχεδιασμός Συγχρονισμού (συν.)
Συγχρονίζουμε την πρόσβαση στον πόρο (resource). Χρησιμοποιούμε τον synchronized μηχανισμό της Java. Προσοχή στην έκταση συγχρονισμού! Προσοχή στο κοινό σημείο συγχρονισμού! //... public void addString( String s) { synchronized( this.stringArray) { if (this.counter) { throw new Exception( “No space!”); } this.stringArray[ this.counter++] = s; // ...

28 Τρόπος Κλήσης Όλες οι RMI κλήσεις είναι σύγχρονες (synchronous/blocking). Ο καλούμενος αναστέλλει την εκτέλεσή του μέχρι να εκτελεστεί η απομακρυσμένη μέθοδος. Μπορούμε να έχουμε κλήση ασύγχρονη; Σε επίπεδο σχεδίασης ναι. Δύο λύσεις: Callbacks Polling

29 Blocking Κλήση Client Stub Skeleton Server idle

30 Callback Κλήση Client Callback Server thread idle other processing
create thread idle other processing

31 Polling μετά την Κλήση Client Request Server thread other processing
create poll updte poll other processing

32 Άλλες Τεχνικές Push και Pull Thread Pools Άλλα;

33 Αναφορές Java RMI Architecture (πάρα πολλά – ένα όχι τρομερό) Άλλα
“Thinking in Java”, Bruce Eckel, διαθέσιμο από το “The Java Tutorial”, Sun, διαθέσιμο από το RMI “Fundamentals of RMI”, jGuru, διαθέσιμο (μαζί με άλλα) από το Architecture (πάρα πολλά – ένα όχι τρομερό) “Pattern-Oriented Software Architecture”, Douglas C. Schmidt, διαθέσιμο από (σύνδεσμος powerpoint slides) το Άλλα Το είχει πολύ καλά αποτελέσματα όταν έψαξα.


Κατέβασμα ppt "Λειτουργία RMI και Ζητήματα Σχεδίασης"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google