Java avancé Objectifs. version support 1.2

Dimension: px
Commencer à balayer dès la page:

Download "Java avancé Objectifs. version support 1.2"

Transcription

1 Java avancé Objectifs version support 1.2

2 Objectifs Utiliser la programmation concurrente Utiliser quelques mécanismes de communication distante socket, RMI et JMS Savoir utiliser les mécanismes de déploiement Découvrir et utiliser la supervision via JMX antislashn.org Java avancé - Objectifs 2 / 5

3 Chapitres 0.Objectifs 1.Programmation concurrente 2.Communications distantes 3.Déploiement 4.JMX antislashn.org Java avancé - Objectifs 3 / 5

4 copyleft Support de formation créer par Franck SIMON antislashn.org Java avancé - Objectifs 4 / 5

5 copyleft Cette œuvre est mise à disposition sous licence Attribution Pas d'utilisation Commerciale Partage dans les Mêmes Conditions 3.0 France. Pour voir une copie de cette licence, visitez ou écrivez à Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. antislashn.org Java avancé - Objectifs 5 / 5

6 Programmation concurrente version 1.0

7 Les threads Java possède le concept de thread la JVM s'appuie sur les threads de l'os sous-jacent ou les simules si OS monotâche Permet de créer des applications dont certaines parties s'exécutent en parallèle La JVM possède des threads le thread principal => méthode main des threads secondaires pour la gestion de la JVM antislashn.org Java avancé - Programmation concurrente 2 / 94

8 Multitâche et threads Un thread est un flux de contrôle à l'intérieur d'une application Système d'exploitation Application A Application C Machine virtuelle Java mémoire de l'application Application B Thread 1 Thread 2 Thread 3 Variables locales Variables locales Variables locales antislashn.org Java avancé - Programmation concurrente 3 / 94

9 Les threads Chaque thread exécute son code indépendamment des autres threads les threads peuvent coopérer entre eux Les threads donnent l'illusion d'une exécution simultanée de plusieurs tâches Accès aux données par un thread les variables locales des méthodes d'un thread sont différentes pour chaque thread si deux threads exécutent la même méthode, chacun obtient un espace mémoire séparé pour les variables locales de la méthode les objets et variables d'instances peuvent être partagés entre les threads d'un même programme Java. les variables statiques sont automatiquement partagées antislashn.org Java avancé - Programmation concurrente 4 / 94

10 Les threads Un thread possède un nom un identifiant une priorité Thread.MIN_PRIORITY => 1 Thread.NORM_PRIORITY => 5 Thread.MAX_PRIORITY => 10 le status deamon ou non un groupe un code à exécuter méthode run() un état antislashn.org Java avancé - Programmation concurrente 5 / 94

11 Les threads La JVM arrête son exécution lorsque : ou la méthode System.exit() est invoquée tous les threads sont morts si le thread n'est pas un daemon les daemons n'empêchent pas la JVM de s'arrêter antislashn.org Java avancé - Programmation concurrente 6 / 94

12 Thread cycle de vie antislashn.org Java avancé - Programmation concurrente 7 / 94

13 Les thread Création d'un thread par spécialisation de la classe Thread redéfinition de la méthode run() lancement par la méthode start() sur l'instance par implémentation de l'interface Runnable codage de la méthode run() passer l'instance de la classe à une instance de Thread méthode start() sur l'instance de Thread antislashn.org Java avancé - Programmation concurrente 8 / 94

14 Spécialisation de la classe Thread public class Task extends Thread { private int delai; public Task(int delai, String nom) { this.delai = delai; setname(nom); public void run() { System.out.format(">>> DEBUT TACHE %s de %d s.\n", getname(), delai); try { this.sleep(delai * 1000); catch (InterruptedException e) { e.printstacktrace(); System.out.format(">>> FIN TACHE %s de %d s.\n", getname(), delai); antislashn.org Java avancé - Programmation concurrente 9 / 94

15 Implémentation de Runnable class MyRunnable implements public void run() { try { System.out.println("DEBUT THREAD"); Thread.sleep(1_000); System.out.println("FIN THREAD"); catch (InterruptedException e) { e.printstacktrace(); public class MainRunnable { public static void main(string[] args) throws InterruptedException { Thread t = new Thread(new MyRunnable()); t.start(); antislashn.org Java avancé - Programmation concurrente 10 / 94

16 Arrêt d'un thread Une partie des méthodes de la classe Thread sont dépréciées stop(), resume(), suspend(), destroy() Le thread s'arrête à la fin de sa méthode run() La méthode interrupt() positionne un flag demandant l'interruption si le thread n'est pas en attente utiliser alors les méthodes interrupted() : renvoie le flag et le remet à false isinterrupted() : renvoie le flag sans le remettre à false antislashn.org Java avancé - Programmation concurrente 11 / 94

17 Arrêt d'un thread Si l'état du thread est RUNNABLE interrupted() évalue le flag d'interruption et on peut stopper la méthode run() Si l'état du thread est en attente suite à sleep(), join() ou wait() il reçoit une InterruptionException suite à une attente sur une E/S il reçoit un ClosedByInterruptionException on peut alors stopper le thread dans le traitement de l'exception antislashn.org Java avancé - Programmation concurrente 12 / 94

18 Arrêt d'un thread public class ThreadInterrupt implements Runnable { private int id; public ThreadInterrupt(int id){ this.id = id; état public void run() { int i = 0; while(!thread.interrupted()){ System.out.printf("thread id : %d - valeur de la boucle %d\n",id,i++ ); //Traitement long for(long k=1 ; k< ; k++) for(long r=1; r<1000 ;r++) ; System.out.printf(">>> FIN EXECUTION thread %d - status : %b\n",id,thread.currentthread().isinterrupted()); antislashn.org Java avancé - Programmation concurrente 13 / 94

19 Arrêt d'un thread public class ThreadInterrupt implements Runnable { private int id; public ThreadInterrupt(int id){ this.id = public void run() { int i = 0; état TIMED_WAITING while(!thread.interrupted()){ System.out.printf("thread id : %d - valeur de la boucle %d\n",id,i++ ); try { Thread.sleep(1000); catch (InterruptedException e) { System.out.printf(">>> CATCH thread %d - status : %b\n",id,thread.currentthread().isinterrupted()); Thread.currentThread().interrupt(); System.out.printf(">>> FIN EXECUTION thread %d - status : %b\n",id,thread.currentthread().isinterrupted()); antislashn.org Java avancé - Programmation concurrente 14 / 94

20 Arrêt d'un thread public class ThreadInterruptMain { public static void main(string[] args) { Thread t1 = new Thread(new ThreadInterrupt(1)); Thread t2 = new Thread(new ThreadInterrupt(2)); t1.start(); t2.start(); Scanner in = new Scanner(System.in); System.out.println("Entrez le numéro du thread à arrêter : "); int num = in.nextint(); switch(num){ case 1: System.out.printf("Etat du thread t1 : %s\n",t1.getstate()); t1.interrupt(); break; case 2: System.out.printf("Etat du thread t2 : %s\n",t2.getstate()); t2.interrupt(); break; antislashn.org Java avancé - Programmation concurrente 15 / 94

21 Arrêt d'un thread Attente de l'arrêt méthode join() attend la terminaison d'un thread appel bloquant tant que le thread est en vie retourne immédiatement si le thread n'est pas en vie pas démarré, arrêté Redémarrage d'un thread un thread mort ne peut pas être redémarré une instance de Thread ne peut-être utilisée qu'une seule fois une exception IllegalThreadStateException est levée antislashn.org Java avancé - Programmation concurrente 16 / 94

22 Concurrence Dans un environnement monothread si il y a écriture d'une valeur dans une variable la lecture de la variable renverra la valeur écrite si celle-ci n'a pas été modifiée entre temps Dans un environnement multithread les lectures et écritures peuvent avoir être exécutées dans des threads différents il n'y a pas de garantie qu'un thread lise la valeur écrite par un autre thread antislashn.org Java avancé - Programmation concurrente 17 / 94

23 Concurence Deux threads incrémentent un variable au départ la variable vaut 1 la valeur attendue après les deux incrémentation est 3 Thread 1 Thread 2 A == 1 récupère A dans un registre incrémente le registre récupère A dans un registre incrémente le registre transfert du registre en mémoire transfert du registre en mémoire A == 2 antislashn.org Java avancé - Programmation concurrente 18 / 94

24 Concurrence L'accès et l'affectation est garantie en Java sur tous les types sauf long et double Il n'y a pas de garanti qu'un thread ne prenne pas le contrôle entre 2 opérations atomiques Pour que le code soit atomique, il faut que l'objet soit utilisé comme moniteur technique pour synchroniser plusieurs tâches qui utilisent des ressources partagées antislashn.org Java avancé - Programmation concurrente 19 / 94

25 Concurrence class Foo{ private int a; private int b = 2; public Foo(int val){ a=val; b=2*a; code non atomique public void changer(){ a++; b=2*a; System.out.printf("%s - a == %d, b ==%d\n", Thread.currentThread().getName(),a,b); class ThreadFoo extends Thread{ private Foo foo; public ThreadFoo(Foo foo){ this.foo = foo; public void run(){ for(int i=0 ; i<10 ; i++) foo.changer(); antislashn.org Java avancé - Programmation concurrente 20 / 94

26 Concurrence public class SynchronisationMain { public static void main(string[] args) { Foo foo = new Foo(10); ThreadFoo t0 = new ThreadFoo(foo); ThreadFoo t1 = new ThreadFoo(foo); t0.start(); t1.start(); Thread-1 - a == 12, b == 24 Thread-0 - a == 12, b == 24 Thread-1 - a == 13, b == 26 Thread-1 - a == 15, b == 30 antislashn.org Java avancé - Programmation concurrente 21 / 94

27 Concurrence Verrou d'exclusion mutuelle verrou mutex un seul thread peut acquérir un mutex si deux threads essaient d acquérir un verrou, un seul y parvient l'autre thread doit attendre que le premier thread restitue le verrou pour continuer antislashn.org Java avancé - Programmation concurrente 22 / 94

28 Concurrence Le mot clé synchronized permet d'éviter que plusieurs threads utilisent le même code en même temps Tout objet peut jour le rôle de moniteur chaque objet possède un verrou si un thread prend le verrou aucun autre ne peut utiliser le code synchronized marqué par ce verrou différentes approches d'utilisation de synchronized antislashn.org Java avancé - Programmation concurrente 23 / 94

29 Concurrence Réentrance si un thread demande un verrou déjà verrouillé par au autre thread, le thread demandeur est bloqué si un thread tente de prendre un verrou qu'il détient déjà la requête réussit les verrous sont acquis par le thread et non par un appel au verrou est associé un thread propriétaire et un compteur d'acquisition lorsque le compteur passe à zéro le verrou est libéré antislashn.org Java avancé - Programmation concurrente 24 / 94

30 Concurrence Synchronisation implicite sur this synchronized est placé en tant que modificateur de méthode efficace car toute la méthode est verrouillée peut poser un problème de performance si les traitements sont longs... public synchronized void changer(){ a++; b=2*a; System.out.printf("%s - a == %d, b == %d\n", Thread.currentThread().getName(),a,b);... Thread-0 - a == 11, b == 22 Thread-0 - a == 12, b == 24 Thread-1 - a == 13, b == 26 Thread-1 - a == 14, b == 28 Thread-1 - a == 15, b == 30 antislashn.org Java avancé - Programmation concurrente 25 / 94

31 Concurrence Synchronisation sur bloc de code on ne synchronise qu'une partie du code en le protégeant par synchronized... public void changer(){ synchronized (this) { a++; b=2*a; System.out.printf("%s - a == %d, b == %d\n",thread.currentthread().getname(),a,b);... antislashn.org Java avancé - Programmation concurrente 26 / 94

32 Concurrence Synchronisation sur un objet le moniteur est alors l'objet... private Object monitor = new Object(); le moniteur est une instance d'object... public void changer(){ synchronized (monitor) { System.out.printf("DEBUT %s - a == %d, b == %d\n", Thread.currentThread().getName(),a,b); a++; b=2*a; System.out.printf("FIN %s - a == %d, b == %d\n", Thread.currentThread().getName(),a,b);... antislashn.org Java avancé - Programmation concurrente 27 / 94

33 Concurrence Synchronisation de la classe permet de protéger les variables statiques d'une classe class Foo1 { private static int a = 0; static void seta(int a) { Foo1.a = a; static int geta() { return a; class Foo2 { void methodfoo2(int a) throws ClassNotFoundException { synchronized (Class.forName("org.antislashn.formation.Foo1")) { Foo1.setA(a); System.out.printf("%s - valeur de a : %d\n", Thread.currentThread().getName(), Foo1.getA()); antislashn.org Java avancé - Programmation concurrente 28 / 94

34 Synchronisation entre threads Pour éviter l'interblocage de threads on utilise les méthodes wait(), notify(), notifyall() si wait() est invoqué à l'intérieur d'une méthode synchronisée le thread actuel est bloqué et mis en liste d'attente le moniteur est déverrouillé le thread suspendu sera réveillé par une notification sur le moniteur notify() pour libérer un thread de la liste notifyall() pour libérer tous les threads de la liste antislashn.org Java avancé - Programmation concurrente 29 / 94

35 Concurrence Thread : méthodes d'attente et de notification wait() attend l'arrivée d'une condition le thread en cours est mis en attente le verrou est libéré, d'autres thread peuvent alors exécuter des méthodes synchronisées avec le même verrou doit être invoquée dans un bloc synchronized notify() notifie un thread en attente d'une condition doit être invoquée dans un bloc synchronized antislashn.org Java avancé - Programmation concurrente 30 / 94

36 Concurrence Thread : méthodes d'attente et de notification notifyall() notifie tous les threads en attente d'une condition doit être invoquée dans un bloc synchronized wait(int delay) attend l'arrivée d'une condition avec un timeout le verrou est libéré sleep(int delay) provoque une attente le verrou n'est pas libéré cf. aussi TimeUnit.MILLISECONDS.sleep(int ms) antislashn.org Java avancé - Programmation concurrente 31 / 94

37 Concurrence Double verrou public class DoubleLock { private final Object lock1 = new Object(); private final Object lock2 = new Object(); foo() verrouille lock1 tant que lock2.wait() n'est pas terminé public void foo() throws InterruptedException{ synchronized (lock1) { synchronized (lock2) { while(...){ lock2.wait(); public void notifier(){ lock2.notify(); antislashn.org Java avancé - Programmation concurrente 32 / 94

38 Concurrence Reportez-vous à l'atelier 1 antislashn.org Java avancé - Programmation concurrente 33 / 94

39 Concurrence et collections Parcours de collection par itérateur ou boucle type for-each les itérateurs renvoyés les collections synchronisées ne sont pas conçus pour gérer les modifications concurrentes exception ConcurrentModificationException solution : verrouiller la collection pendant le parcours certains itérateurs sont cachés exemple : appel tostring() sur une collection itération cachée pour appel de tostring() sur chaque élément antislashn.org Java avancé - Programmation concurrente 34 / 94

40 Java 5 principaux ajouts Amélioration des collections synchronisées ConcurrentHashMap CopyOnWriteArrayList Queue BlockingQueue antislashn.org Java avancé - Programmation concurrente 35 / 94

41 Java 5 principaux ajouts API de concurrence historiquement développée par Doug LEA JSR 166 Ensemble de classes et interfaces package java.util.concurrent Atomicité package java.util.concurrent.atomic AtomicBoolea, AtomicLong,... antislashn.org Java avancé - Programmation concurrente 36 / 94

42 Java 5 principaux ajouts Les loquets CountDownLatch permet à un ou plusieurs threads d'attendre qu'un ensemble d'événements se produise FutureTask utilisé par le framework Executor représente des tâches asynchrones dont on veut exploiter le résultat Semaphore contrôle le nombre d'activités pouvant simultanément accéder à une ressource ou à l'exécution d'une action gère un nombre de jetons virtuels antislashn.org Java avancé - Programmation concurrente 37 / 94

43 Java 5 principaux ajouts Les barrières permettent de bloquer un groupe de thread jusqu'à ce qu'un événement survienne les loquets ne sont pas réutilisables, les barrières le sont CyclicBarrier permet à un certains nombre de threads de ce donner rendez-vous les threads invoquent await() lorsqu'ils atteignent la barrière, la barrière s'ouvre lorsque tous les threads sont arrivés Exchanger permet à deux threads d'échanger des données antislashn.org Java avancé - Programmation concurrente 38 / 94

44 Lock interface Lock remplace le bloc synchronized peut être utilisé avec des conditions lock() : acquisition du verrou unlock() : libération du verrou idiome : unlock est invoqué dans un bloc finally lock.lock(); try{ // corps du traitement finally{ lock.unlock(); antislashn.org Java avancé - Programmation concurrente 39 / 94

45 Lock ReentrantLock verrou d'exclusion mutuel standard le verrou n'est détenu que par un seul thread ReentrantReadWriteLock expose deux objets Lock readlock() renvoie un verrou en lecture writelock() renvoie un verrou en écriture permet d'avoir plusieurs consommateurs en lecture pour un producteur en écriture optimisations sur les données accédées souvent en lecture antislashn.org Java avancé - Programmation concurrente 40 / 94

46 Condition Une condition est créée par l'instance de Lock méthode newcondition() L'utilisation des conditions remplace l'utilisation des méthodes de gestion d'un moniteur Object wait(), notify(), notifyall() await() : met le thread propriétaire du lock en attente signal() : réveille le thread en attente suite à un await() antislashn.org Java avancé - Programmation concurrente 41 / 94

47 Lock et Condition Dans l'exemple suivant si take() est invoqué sur un buffer vide, le thread est mis en attente jusqu'à ce que des items soient disponibles de même si put() est invoqué sur un buffer plein, le thread est mis en attente jusqu'à ce qu'il y ait de la place pour au moins un item antislashn.org Java avancé - Programmation concurrente 42 / 94

48 Lock et Condition class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition full = lock.newcondition(); final Condition notempty = lock.newcondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(object x) throws InterruptedException { lock.lock(); try { while (count == items.length) libère le verrou full.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notempty.signal(); finally { lock.unlock();... antislashn.org Java avancé - Programmation concurrente 43 / 94

49 Lock et Condition class BoundedBuffer {... public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) notempty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; full.signal(); return x; finally { lock.unlock(); libère le verrou antislashn.org Java avancé - Programmation concurrente 44 / 94

50 Concurrence Reportez-vous à l'atelier 2 antislashn.org Java avancé - Programmation concurrente 45 / 94

51 Volatile Chaque thread possède un cache local Le mot clé volatile permet de s'assurer qu'une variable utilisée par plusieurs thread sera toujours à jour la JVM rafraîchira le contenu de la variable à chaque fois qu'elle est utilisée la variable ne sera pas mise dans le cache local des Threads attention : voir la prise en compte de volatil par l'implémentation de la JVM antislashn.org Java avancé - Programmation concurrente 46 / 94

52 ThreadLocal Permet à des threads exécutant le même code run() de posséder leur propre variable ThreadLocal<T> est utilisé comme attribut du thread les valeurs sont accessible par get() et set() méthodes T get() retourne la valeur associé au thread, si pas de variable pour le thread initialvalue() est invoquée void set(t) met à jour la variable associée au thread T initialvalue() est invoqué au premier get() si aucun set() n'a été appelé void remove() retire la valeur associée au thread antislashn.org Java avancé - Programmation concurrente 47 / 94

53 Communication entre threads Certains flux Java permettent la communication entre threads un thread sera producteur d'octets ou de char classes PipedOutputStream et PipedWriter un thread sera consommateur d'octets ou char classes PipedInputStream et PipedReader antislashn.org Java avancé - Programmation concurrente 48 / 94

54 Communication entre threads Reportez-vous à l'atelier 3 antislashn.org Java avancé - Programmation concurrente 49 / 94

55 Tâches Planification de tâches par la classe Timer toutes les tâches tournent dans un même thread schedule() et scheduleatfixedrate() pour planifier une tâche cancel() pour supprimer les tâches non démarrées purge() pour retirer les tâches les tâches sont codées dans une classe dérivant de TimerTask run() pour le code de la tâche antislashn.org Java avancé - Programmation concurrente 50 / 94

56 CountDownLatch Permet de retarder l'exécution des threads tant qu'une opération n'est pas terminée une fois loquet dans son état terminal ouvert, il ne peut plus changer d'état exemple : garanti qu'un calcul ne sera pas lancé tant que toutes les ressources nécessaires n'auront pas étés initialisées garanti qu'un service ne sera pas lancé tant que tous les services dépendant ne sont pas activés antislashn.org Java avancé - Programmation concurrente 51 / 94

57 CountDownLatch La méthode await() permet de bloquer les threads jusqu'à ce que le loquet soit ouvert CountDownLatch(int count) : crée le loquet avec un certains nombre de tours void await() : mise en attente tant que le compteur n'est pas nul void countdown() : décrémente le compteur long getcount() : renvoie le compteur antislashn.org Java avancé - Programmation concurrente 52 / 94

58 CountDownLatch Exemple d'attente de fin de plusieurs threads class StopThread extends Thread { private final CountDownLatch latch; private long delay; public StopThread(CountDownLatch latch, long ms) { this.latch = latch; this.delay = ms; public void run() { try { System.out.printf(">>> START %s\n", Thread.currentThread().getName()); Tread.sleep(delay); catch (InterruptedException e) { e.printstacktrace(); finally { latch.countdown(); System.out.printf(">>> END %s countdown==%d\n", Thread.currentThread().getName(), latch.getcount()); antislashn.org Java avancé - Programmation concurrente 53 / 94

59 CountDownLatch Exemple d'attente de fin de plusieurs threads (suite) public class CountDownLatchTest { public static void main(string[] args) throws InterruptedException { int nbtaches = 5; CountDownLatch latch = new CountDownLatch(nbTaches); for(int i=0 ; i< nbtaches ; i++){ StopThread t = new StopThread(latch, 1000); t.start(); latch.await(); System.out.println("FIN DE TOUTES LES TACHES"); antislashn.org Java avancé - Programmation concurrente 54 / 94

60 CountDownLatch Reportez vous à l'atelier 4 antislashn.org Java avancé - Programmation concurrente 55 / 94

61 CyclicBarrier Permet de définir un point d'attente à plusieurs threads la barrière est débloquées lorsque tous les processus enregistrés ont atteint ce point par rapport au loquet le loquet est éphémère, une fois ouvert il ne peu plus être utilisé un loquet attend des événements, tandis que une barrière attends d'autres threads antislashn.org Java avancé - Programmation concurrente 56 / 94

62 CyclicBarrier CyclicBarrier(int parts) : création d'une barrière avec un certain nombre de participants CyclicBarrier(int parts, Runnable barrieraction) création d'une barrière avec un certain nombre de participants et lancement d'une action lorsque la barrière est ouverte int await() : permet au thread de s'enregistrer auprès de la barrière, l'appel est bloquant tant que les autres threads participants n'ont pas fini antislashn.org Java avancé - Programmation concurrente 57 / 94

63 CyclicBarrier Exemple d'attente avant lancement d'un autre thread chaque tâche additionne une ligne d'une matrice lorsque toutes les tâches sont finies une addition de chaque ligne est effectuée private static int matrix[][] = { { 1, { 2, 2, { 3, 3, 3, { 4, 4, 4, 4, { 5, 5, 5, 5, 5 ; antislashn.org Java avancé - Programmation concurrente 58 / 94

64 CyclicBarrier Exemple d'attente avant lancement d'un autre thread public static void main(string args[]) { final int rows = matrix.length; results = new int[rows]; Runnable merger = new Runnable() { public void run() { int sum = 0; for (int i = 0; i < rows; i++) { sum += results[i]; System.out.println("Results are: " + sum); ; CyclicBarrier barrier = new CyclicBarrier(rows, merger); for (int i = 0; i < rows; i++) { new Summer(barrier, i).start(); System.out.println("Waiting..."); thread a lancer lorsque toutes les tâches seront terminées création de la barrière avec nombre de tâches et thread à lancer lorsque la barrière sera ouverte antislashn.org Java avancé - Programmation concurrente 59 / 94

65 CyclicBarrier Exemple d'attente avant lancement d'un autre thread (suite) private static class Summer extends Thread { int row; CyclicBarrier barrier; Summer(CyclicBarrier barrier, int row) { this.barrier = barrier; this.row = row; public void run() { int columns = matrix[row].length; int sum = 0; attente des autres participants for (int i = 0; i < columns; i++) { sum += matrix[row][i]; results[row] = sum; System.out.println("Results for row " + row + " are : " + sum); try { barrier.await(); catch (InterruptedException ex) { ex.printstacktrace(); catch (BrokenBarrierException ex) { ex.printstacktrace(); antislashn.org Java avancé - Programmation concurrente 60 / 94

66 CyclicBarrier Reportez-vous à l'atelier 5 antislashn.org Java avancé - Programmation concurrente 61 / 94

67 Exchanger Exchanger<V> : forme de barrière formée de deux parties s'échangeant des données exemple : un thread remplit un buffer de données, tandis doit lire un buffer les thread échangent alors un buffer plein contre un buffer vide l'échange est provoqué dès que les deux threads appel la méthode V exchange(v x) antislashn.org Java avancé - Programmation concurrente 62 / 94

68 Exchanger Exemple d'échange de String création de l'échangeur de String public class ExchangerTest { public static void main(string[] args) { Exchanger<String> exchanger = new Exchanger<String>(); ExchangerRunnable exchangerrunnable1 = new ExchangerRunnable(exchanger, "A"); ExchangerRunnable exchangerrunnable2 = new ExchangerRunnable(exchanger, "B"); new Thread(exchangerRunnable1).start(); new Thread(exchangerRunnable2).start(); on passe l'échangeur aux 2 threads antislashn.org Java avancé - Programmation concurrente 63 / 94

69 Exchanger Exemple d'échange de String class ExchangerRunnable implements Runnable{ Exchanger exchanger = null; Object object = null; public ExchangerRunnable(Exchanger exchanger, Object object) { this.exchanger = exchanger; this.object = object; public void run() { try { Object previous = this.object; this.object = this.exchanger.exchange(this.object); appel de l'échange, bloquant jusqu'à ce que les 2 threads soient près System.out.println(Thread.currentThread().getName() + " exchanged " + previous + " for " + this.object); catch (InterruptedException e) { e.printstacktrace(); antislashn.org Java avancé - Programmation concurrente 64 / 94

70 Exchanger Reportez-vous à l'atelier 6 antislashn.org Java avancé - Programmation concurrente 65 / 94

71 Semaphore Encapsule un entier contrainte de positivité opérations d'incrémentation et de décrémentation atomiques Gère un ensemble de jetons virtuels le nombre initial de jeton est passé au constructeur de Semaphore acquire() : l'activité prend un jeton, appel bloquant release() : l'activité rend le jeton antislashn.org Java avancé - Programmation concurrente 66 / 94

72 Semaphore Constructeurs Semaphore(int permits, boolean fair) créer le sémaphore en précisant le nombre de jetons et la distribution des jetons dans l'ordre des demandes Semaphore(int permits) créer le sémaphore en précisant le nombre de jetons, sans garantie de distribution dans l'ordre des demandes équivalent à Semaphore(int permits,false) antislashn.org Java avancé - Programmation concurrente 67 / 94

73 Semaphore Permet d'implémenter des pools de ressources class BoundedList<T>{ private final List<T> liste; private final Semaphore semaphore; public BoundedList(int bound){ this.liste = Collections.synchronizedList(new ArrayList<T>()); this.semaphore = new Semaphore(bound);... public boolean add(t item) throws InterruptedException{ semaphore.acquire(); boolean ok = false; try{ ok = liste.add(item); return ok; finally{ if(!ok) semaphore.release(); tentative d acquisition d'un jeton mise en attente si pas de jeton disponible antislashn.org Java avancé - Programmation concurrente 68 / 94

74 Semaphore Permet d'implémenter des pools de ressources class BoundedList<T>{ private final List<T> liste; private final Semaphore semaphore; public BoundedList(int bound){ this.liste = Collections.synchronizedList(new ArrayList<T>()); this.semaphore = new Semaphore(bound);... public boolean add(t item) throws InterruptedException{ semaphore.acquire(); boolean ok = false; try{ ok = liste.add(item); return ok; finally{ if(!ok) semaphore.release(); tentative d acquisition d'un jeton mise en attente si pas de jeton disponible antislashn.org Java avancé - Programmation concurrente 69 / 94

75 Exécution de tâches JDK 1.5 met à disposition des exécuteurs de tâches interface Executor : découple les appels de tâche de leur exécution, en précisant l'utilisation des threads, leur ordonnancement, interface ExecutorService : gestion des tâches asynchrones permet l'utilisation de méthodes de terminaison de processus, cf. interface Future interface ScheduleExecutorService : gestion de tâches périodiques antislashn.org Java avancé - Programmation concurrente 70 / 94

76 Exécution de tâches Les exemples suivants utilisent la classe RunnableTask public class RunnableTask implements Runnable { private int nbsecondes; public RunnableTask(int nbsecondes) { this.nbsecondes = public void run() { System.out.println(">>> START "+Thread.currentThread().getName()+ " pour "+nbsecondes+" s"); try { Thread.sleep(nbSecondes*1000); catch (InterruptedException e) { e.printstacktrace(); System.out.println(">>> FIN "+Thread.currentThread().getName()); antislashn.org Java avancé - Programmation concurrente 71 / 94

77 Exécution de tâches Exemple sur un seul thread public class MonoThreadRunnableTaskExecutor { private List<Runnable> runnables = new ArrayList<>(); private ExecutorService service = Executors.newSingleThreadExecutor(); public void add(runnable runnable){runnables.add(runnable); public void start(){ for(runnable r : runnables){ service.execute(r); service.shutdown(); public static void main(string[] args) { MonoThreadRunnableTaskExecutor executor = new MonoThreadRunnableTaskExecutor(); executor.add(new RunnableTask(1)); executor.add(new RunnableTask(2)); executor.add(new RunnableTask(4)); executor.add(new RunnableTask(3)); executor.start(); System.out.println("Fin des exécutions"); antislashn.org Java avancé - Programmation concurrente 72 / 94

78 Exécution de tâches Résultat de l'exécution des tâches sur un seul thread >>> START pool-1-thread-1 pour 1 s >>> FIN pool-1-thread-1 >>> START pool-1-thread-1 pour 2 s >>> FIN pool-1-thread-1 >>> START pool-1-thread-1 pour 4 s >>> FIN pool-1-thread-1 >>> START pool-1-thread-1 pour 3 s >>> FIN pool-1-thread-1 antislashn.org Java avancé - Programmation concurrente 73 / 94

79 Exécution de tâches Exemple sur un plusieurs thread public class MultiThreadRunnableTaskExecutor { private List<Runnable> runnables = new ArrayList<>(); private ExecutorService service = Executors.newFixedThreadPool(10); public void add(runnable runnable){ runnables.add(runnable); public void start(){ for(runnable r : runnables){ service.execute(r); service.shutdown(); public static void main(string[] args) { MultiThreadRunnableTaskExecutor executor = new MultiThreadRunnableTaskExecutor(); executor.add(new RunnableTask(1)); executor.add(new RunnableTask(2)); executor.add(new RunnableTask(4)); executor.add(new RunnableTask(3)); executor.start(); System.out.println("Fin des exécutions"); antislashn.org Java avancé - Programmation concurrente 74 / 94

80 Exécution de tâches Résultat de l'exécution des tâches sur un seul thread >>> START pool-1-thread-2 pour 2 s >>> START pool-1-thread-3 pour 4 s >>> START pool-1-thread-1 pour 1 s Fin des exécutions >>> START pool-1-thread-4 pour 3 s >>> FIN pool-1-thread-1 >>> FIN pool-1-thread-2 >>> FIN pool-1-thread-4 >>> FIN pool-1-thread-3 antislashn.org Java avancé - Programmation concurrente 75 / 94

81 Tâches asynchrones Future interface représentant le traitement résultat d'un traitement asynchrone instances créées par ExecutorService Callable permet le retour d'une valeur après l'exécution d'une tâche ce que ne permet pas la méthode run() de Runnable le callable est soumis à un exécuteur, le framework retourne un Future antislashn.org Java avancé - Programmation concurrente 76 / 94

82 Tâches asynchrones Exemple de Callable public class Compteur implements Callable<Long> { private final long nb; public Compteur(long nb){ this.nb = public Long call() throws Exception { System.out.println(">>> "+Thread.currentThread().getName()); long sum = 0; for(long i=0; i<nb; i++) sum+=i; return sum; antislashn.org Java avancé - Programmation concurrente 77 / 94

83 Tâches asynchrones Exemple d'utilisation de Future public class CompteurFutureTest { private static final int NB_THREADS = 50; public static void main(string[] args) { ExecutorService executor = Executors.newFixedThreadPool(NB_THREADS); List<Future<Long>> futures = new ArrayList<Future<Long>>(); for(int i=100 ; i< 120 ; i++){ Callable<Long> callable = new Compteur(i); Future<Long> future = executor.submit(callable); futures.add(future); executor.shutdown(); long total = 0; for(future<long> f : futures){ try { total = f.get(); catch (InterruptedException e) { e.printstacktrace(); catch (ExecutionException e) { e.printstacktrace(); System.out.println("TOTAL = "+total); antislashn.org Java avancé - Programmation concurrente 78 / 94

84 Tâches asynchrones Reportez-vous à l'atelier 7 antislashn.org Java avancé - Programmation concurrente 79 / 94

85 Java 6 - ajouts Deux types de collections sont ajoutées Deque : file à double entrée garanti les insertions et suppression efficaces aux deux extrémités implémenté par ArrayDeque et LinkedBlockingDeque adaptées au pattern "Vol de tâche" le consommateur producteur utilise une seule file de tâches partagées par tous les consommateurs le vol de tâche utilise un file double par consommateur, un consommateur ayant épuisé sa file peut voler la tâche à la fin d'une file double d'un autre antislashn.org Java avancé - Programmation concurrente 80 / 94

86 Java 7 : ajouts TransferQueue interface modélisant une file d'attente bloquante le producteur attend que le consommateur prenne ce qu'il a mis dans la file ThreadLocalRandom générateur de nombres aléatoires local à un thread évite de partager une instance de Random entre plusieurs threads Phaser barrière de synchronisation réutilisable et supportant un nombre de tâches enregistrées pouvant varier durant l'exécution antislashn.org Java avancé - Programmation concurrente 81 / 94

87 Java 7 : fork/join Problème de base : traiter de grandes quantités de données paquet par paquet chaque paquet peut être traiter de manière indépendante des autres chaque paquet peut fournir un résultat partiel les résultats partiels sont ensuite fusionnés La décomposition en sous tâches peut être statique : découpage d'un tableau en sous-tableau dynamique : découverte d'une arborescence d'un système de fichier quel volume de tâches à créer? antislashn.org Java avancé - Programmation concurrente 82 / 94

88 Java 7 : fork/join Différentes approches sont envisageables traiter les paquets les uns après les autres traiter les paquets en parallèle avec un point de synchronisation type CyclicBarrier utiliser le traitement parallèle avec ForkJoinTask antislashn.org Java avancé - Programmation concurrente 83 / 94

89 Java 7 : fork/join Deux classes de base ForkJoinTask modélise une tâche unique qui sera envoyée à une réserve de threads peut générer d'autres tâches du même type qui seront envoyées à la même réserve de threads ForkJoinPool gère la réserve de threads la réserve reçoit les tâches et le dispatche aux threads réserve conçue pour qu'un grand nombre de tâches élémentaires soit traitées par un nombre restreint de threads antislashn.org Java avancé - Programmation concurrente 84 / 94

90 Java 7 : fork/join La machine qui exécute la tâche doit posséder plusieurs processeurs La tâche est récursive RecursiveTask : avec renvoi de résultat RecursiveAction : sans renvoi de résultat Algorithme de base d'utilisation du framework fork/join : if (my portion of the work is small enough) do the work directly else split my work into two pieces invoke the two pieces and wait for the results antislashn.org Java avancé - Programmation concurrente 85 / 94

91 Java 7 : fork/join La javadoc précise qu'une tâche élémentaire ne doit pas comporter de synchronisation afin d'éviter les blocages ne doivent pas partager de variables doivent pouvoir être exécutées rapidement antislashn.org Java avancé - Programmation concurrente 86 / 94

92 Java 7 : fork/join La javadoc précise qu'une tâche élémentaire ne doit pas comporter de synchronisation afin d'éviter les blocages ne doivent pas partager de variables doivent pouvoir être exécutées rapidement antislashn.org Java avancé - Programmation concurrente 87 / 94

93 Java 7 : fork/join ForkJoinPool ForkJoinPool lance la tâche fork() join() sous-tâche Tâche Tâche longue longue s'occupe du découpage s'occupe du découpage en sous tâches en sous tâches sous-tâche sous-tâche sous-tâche sous-tâche sous-tâche sous-tâche sous-tâche antislashn.org Java avancé - Programmation concurrente 88 / 94

94 Java 7 : fork/join ForkJoinTask<V> V : type résultat deux méthodes principales join() : retourne le résultat de la tâche (V) bloquante tant que que la tâche n'est pas finie fork() : lance une autre tâche dans la même réserve de pool que la tâche courante une même tâche ne doit pas appeler plus d'une fois sa méthode fork() spécialisée par RecusiveAction et RecursiveTask<V> compute() : méthode exécutée par la tâche antislashn.org Java avancé - Programmation concurrente 89 / 94

95 Java 7 : fork/join Reportez-vous à l'atelier 8 antislashn.org Java avancé - Programmation concurrente 90 / 94

96 Objets immuables La classe doit être déclarée final pour éviter la modification d'une instance par héritage Tous les champs doivent être déclarés final La référence this ne doit jamais être exportée pas de return this ; antislashn.org Java avancé - Programmation concurrente 91 / 94

97 Objets immuables Les propriétés référençant des objets non immuables doivent : être privées ne jamais être exportées représenter l'unique référence à l'objet faire des copies défensives antislashn.org Java avancé - Programmation concurrente 92 / 94

98 Objets immuables private final Date thedate; public MaClasse(Date thedate) { this.thedate = public String tostring() { return thedate.tostring(); cette propriété peut-être exportée Date d = new Date(); MaClasse c = new MaClasse(d); d.setyear(98); System.out.println(c); private final Date thedate; public MaClasse(Date thedate) { this.thedate = (Date) thedate.clone(); copie défensive antislashn.org Java avancé - Programmation concurrente 93 / 94

99 Ressources Livres Java Threads auteurs : Scott Oaks, Henry Wong éditeur : O'Reilly Programmation concurrente en Java auteur : Brian Goetz éditeur : PEARSON web antislashn.org Java avancé - Programmation concurrente 94 / 94

100 Communication distante version 1.0

101 Introduction Ce chapitre aborde la communication par socket la communication par RMI la communication par message utilisation de JMS antislashn.org Java avancé - Communication distante 2 / 57

102 Réseau Java permet les habituelles utilisation de la communication par socket application vers application interrogation de serveur HTTP création de clients et serveurs HTTP, FTP, SMTP,... de nombreux packages sont disponibles dans le commons du consortium Apache lien entre applet et servlet etc. antislashn.org Java avancé - Communication distante 3 / 57

103 Réseau Le développement d'application communiquant par réseau est grandement facilitée par Java InetAddress : une adresse IP URL : une URL HttpURLConnection : encapsule une connexion vers un serveur HTTP Socket : encapsule une socket client SocketServer : encapsule un comportement serveur par socket et bien d'autres classe... cf. la documentation antislashn.org Java avancé - Communication distante 4 / 57

104 Réseau Exemple de requête vers un serveur HTTP public class HttpConnectionTest { public static void main(string[] args) throws IOException { URL urlserver = new URL("http://www.perdu.com"); HttpURLConnection connection = (HttpURLConnection) urlserver.openconnection(); connection.setrequestmethod("get"); connection.connect(); BufferedReader reader = new BufferedReader( new InputStreamReader(connection.getInputStream())); String line; while((line = reader.readline())!= null){ System.out.println(line); connection.disconnect(); antislashn.org Java avancé - Communication distante 5 / 57

105 Réseau Exemple de récupération des adresses IP public class InetAddressTest { public static void main(string[] args) { InetAddress LocaleAdresse ; InetAddress ServeurAdresse; try { LocaleAdresse = InetAddress.getLocalHost(); System.out.println("L'adresse locale est : "+LocaleAdresse ); ServeurAdresse= InetAddress.getByName("www.perdu.com"); System.out.println("L'adresse du serveur : "+ServeurAdresse); catch (UnknownHostException e) { e.printstacktrace(); antislashn.org Java avancé - Communication distante 6 / 57

106 Socket Le socket est un point de terminaison pour les protocoles de de transmission de données sous TCP/IP lié à une adresse IP et un numéro de port Java propose deux types de sockets le socket client classe Socket ce socket se connecte à un Socket serveur le socket serveur classe ServerSocket ce socket écoute sur un port particulier et accepte des connexions provenant d'un client antislashn.org Java avancé - Communication distante 7 / 57

107 Socket Java simplifie énormément la manipulation des sockets Côté serveur instancier un ServerSocket le mettre en attente de connexion de client accepter le client et communiquer avec lui avec les flux d' E/S Côté client instancier un Socket sur l'adresse + port du serveur récupérer les flux d' E/S pour communiquer antislashn.org Java avancé - Communication distante 8 / 57

108 Socket côté serveur Exemple de serveur simple 1/3 public class TimeServer { private int port = 12345; private ServerSocket server; public TimeServer() throws IOException{ init(); public TimeServer(int port) throws IOException{ this.port = port; init(); private void init() throws IOException{ server = new ServerSocket(port);... antislashn.org Java avancé - Communication distante 9 / 57

109 Socket côté serveur Exemple de serveur simple 2/3 public class TimeServer { private void waitconnection() throws IOException{ Socket sockclient = null; InputStream in = null; OutputStream out = null; System.out.printf("Serveur démarré %s\n",server.getlocalsocketaddress()); while(true){ sockclient = server.accept(); System.out.println(">>> Connexion du client "+sockclient.getinetaddress()+ " ["+sockclient.getport()+"]"); in = sockclient.getinputstream(); out = sockclient.getoutputstream(); handleconnection(in,out); sockclient.close(); antislashn.org Java avancé - Communication distante 10 / 57

110 Socket côté serveur Exemple de serveur simple 3/3 public class TimeServer {... private void handleconnection(inputstream in, OutputStream out) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); String hello = reader.readline(); if(hello.equals("hello")) writer.write(new Date().toString()+"\n"); writer.flush(); public static void main(string[] args) throws IOException { TimeServer server = new TimeServer(); server.waitconnection(); antislashn.org Java avancé - Communication distante 11 / 57

111 Socket côté client Exemple de client - 1/2 public class TimeClient { private String hostname; private int port; private Socket client; public TimeClient(String hostname,int port){ this.hostname = hostname; this.port = port;... public void connect() throws UnknownHostException, IOException{ client = new Socket(hostName,port); System.out.println("=== Client connecté"); BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); writer.write("hello\n\n"); writer.flush(); String reponse = reader.readline(); System.out.println("=== "+reponse); client.close(); antislashn.org Java avancé - Communication distante 12 / 57

112 Socket côté client Exemple de client - 1/2 public class TimeClient {... public static void main(string[] args) throws UnknownHostException, IOException { TimeClient client = new TimeClient(" ", 12345); client.connect(); Serveur démarré / :12345 >>> Connexion du client / [49680] >>> HELLO >>> Connexion du client / [49681] >>> HELLO === Client connecté === Sat Jan 07 11:48:28 CET 2012 antislashn.org Java avancé - Communication distante 13 / 57

113 RMI RMI : Remote Method Invocation permet la construction d'application réparties en Java comparable aux solution CORBA, DCOM+ même principe que le RPC (Remote Procedure Call) Cette API a énormément évoluée JDK 1.2 le skeleton est généré dynamiquement JDK 1.3 le stub est livré dynamiquement mais le développeur doit quand même le créer JDK 1.5 élimination du stub les proxys sont créés et délivrés dynamiquement antislashn.org Java avancé - Communication distante 14 / 57

114 RMI Fonctionnement de base CLIENT 3 rechercher le stub registry Hello_Stub SERVEUR 4 télécharger le stub HelloClient 1 créer le stub 2 enregistrer le stub HelloServer Hello Hello_Stub Hello_Skel 4 appel antislashn.org Java avancé - Communication distante 15 / 57

115 RMI Nécessite un côté serveur une implémentation du service un enregistrement dans un registry un registry qui enregistre les objets et les associe avec une chaîne de caractères un côté client qui utilise l'objet distribué distant, via les couches proxy un réseau... antislashn.org Java avancé - Communication distante 16 / 57

116 RMI L'objet distribué est accédé par un proxy le proxy implémente la même interface que l'objet distribué le proxy gère les appels vers les méthodes les couches stub et skeleton sont les implémentations du proxy antislashn.org Java avancé - Communication distante 17 / 57

117 RMI Les appels de méthodes distantes implique un envoi de paramètres et un retour de résultat des objets peuvent être échangés par valeur, car les JVM sont différentes les objets échangés doivent être sérialisables interface marqueur Serializable les objets référencés dans les objets échangés doivent eux aussi être sérialisables RMI est basé sur le protocole JRMP Java Remote Method Protocole antislashn.org Java avancé - Communication distante 18 / 57

118 RMI Une classe accessible à distance doit implémenter l'interface UnicastRemoteObject package java.rmi les méthodes doivent renvoyer une exception de type RemoteException Les proxy stub et skeleton doivent être créés avec le compilateur rmic plus besoin depuis le JDK 1.5 utiliser la classe UnicastRemoteObject antislashn.org Java avancé - Communication distante 19 / 57

119 RMI Développement définir les packages créer les interfaces des services doivent étendre Remote coder les classes passées par valeur implémentent Serializable coder les implémentations des services doivent étendre UnicastRemoteObject générer les stub avec rmic pas nécessaire avec le JDK 1.5 antislashn.org Java avancé - Communication distante 20 / 57

120 RMI Développement - suite lancer le registry utilitaire rmiregistry peut être lancé par le code du serveur lancer le serveur les objets distribués sont enregistrés dans le registry coder la partie cliente coder la récupération des stub antislashn.org Java avancé - Communication distante 21 / 57

121 RMI Créer l'interface du service public interface Calcul extends Remote { int add(int a, int b) throws RemoteException; Coder l'implémentation du service public class CalculImpl extends UnicastRemoteObject implements Calcul { protected CalculImpl() throws RemoteException { public int add(int a, int b) throws RemoteException { return a + b; antislashn.org Java avancé - Communication distante 22 / 57

122 RMI Une fois les classes compilées il faut générer les stubs utilitaire rmic à lancer dans le répertoire contenant les classes compilées rmic -classpath. org.antislashn.formation.calculimpl répertoire bin si Eclipse est utilisé cette étape peut être automatisée sous Eclipse un fichier CalculImpl_Stub.class est créé antislashn.org Java avancé - Communication distante 23 / 57

123 RMI Coder le code du serveur la classe Naming gère l'enregistrement des objets dans le registry les objets sont enregistrés sous forme d'url //host:port/name par défaut le registry écoute sur le port 1099 méthodes de Naming bind(string name, Object obj) : enregistrement de l'objet rebind(string name, Object obj) : ré-enregistrement de l'objet unbind(string name, Object obj) : dés-enregistrement de l'objet antislashn.org Java avancé - Communication distante 24 / 57

124 RMI méthodes de Naming list(string name) : liste les noms des objets lookup(string name) : retourne l'objet lié au nom Pour des raison de sécurité de chargement de classe il est nécessaire de préciser le dépôt des classes à charger propriété java.rmi.server.codebase public class Server { public static void main(string[] args) throws RemoteException, MalformedURLException, AlreadyBoundException { Calcul calcul = new CalculImpl(); System.setProperty("java.rmi.server.codebase", Calcul.class.getProtectionDomain().getCodeSource().getLocation().toString()); Naming.rebind("calcul", calcul); System.out.println("Calcul est lancé"); antislashn.org Java avancé - Communication distante 25 / 57

125 RMI Coder la côté client nota : la partie cliente doit avoir dans son classpath l'interface du service la méthode lookup permet de récupérer l'objet public class TestCalculRMI { public static void main(string[] args) throws MalformedURLException, RemoteException, NotBoundException { Calcul calcul = (Calcul) Naming.lookup("rmi:// :1099/calcul"); System.out.println("Resultat = "+calcul.add(2, 2)); antislashn.org Java avancé - Communication distante 26 / 57

126 RMI Pour tester lancer le registry utilitaire rmiregistry lancer le serveur lancer la partie client antislashn.org Java avancé - Communication distante 27 / 57

127 RMI Simplification avec l'utilisation de la classe UnicastRemoteObject l'interface du service étend toujours Remote les méthodes renvoient des RemoteException l'implémentation n'a plus besoin d'étendre UnicastRemoteObject le serveur utilise la methode exportobject pour récupérer un stub le stub sera ensuite enregistré classiquement antislashn.org Java avancé - Communication distante 28 / 57

128 RMI Codage des classes devant être distribuées public interface Hello extends Remote{ String sayhello(string name) throws RemoteException; public class HelloImpl implements Hello { public HelloImpl() throws public String sayhello(string name) { return "Hello, "+name; antislashn.org Java avancé - Communication distante 29 / 57

129 RMI Codage du serveur le registry est récupéré par la classe Registry permet aussi de lancer le registry public class HelloServer { public static void main(string[] args) { try { HelloImpl impl = new HelloImpl(); System.setProperty("java.rmi.server.codebase", HelloImpl.class.getProtectionDomain().getCodeSource().getLocation().toString()); Hello stub = (Hello) UnicastRemoteObject.exportObject(impl,0); Registry registry = LocateRegistry.getRegistry(); registry.rebind("hello", stub); System.err.println("Server ready"); catch (Exception e) { System.err.println("Server exception: " + e.tostring()); antislashn.org Java avancé - Communication distante 30 / 57

130 JMS JMS : Java Messaging Service API utilisée pour l'accès à un système de messagerie d'entreprise architecture orientée MOM Message Oriented Middleware implémentations divers : MQSeries (IBM), JBoss Messaging, etc. dans les architectures JAVA EE, les EJB MDB sont utilisés comme consommateurs de messages antislashn.org Java avancé - Communication distante 31 / 57

131 JMS Les applications communiquent via des messages couplage faible la communication entre RMI, CORBA, présente un couplage fort : les différentes entités doivent être actives simultanément JMS permet aux applications de créer, envoyer, recevoir les messages pas de format de message imposé nécessité d'avoir un fournisseur de service qui gère les connexions, les sessions, destinations, routage des messages,... antislashn.org Java avancé - Communication distante 32 / 57

132 JMS file de messages Fonctionnement point à point un producteur de messages envoie un message le message est lu par un consommateur une fois lu, le message est retiré de la file d'attente Producteur A Queue A A acknowledge Consommateur A B Queue B B Consommateur B acknowledge antislashn.org Java avancé - Communication distante 33 / 57

133 JMS File de messages Exemples d'utilisation file pour stocker les commandes les commandes sont envoyées dans la file les entreprises prélève les commandes envoi des logs dans une file le temps de traitement des logs est découplé du reste de l'application antislashn.org Java avancé - Communication distante 34 / 57

134 JMS - sujets Fonctionnement par abonnement Publish Subscrite les applications consommatrices de messages s'abonnent à un sujet (topic) les messages restent dans la file d'attente jusqu'à ce que tous les abonnés aient lu le message abonnement A Topic A A Consommateur Producteur B abonnement B Topic B B Consommateur antislashn.org Java avancé - Communication distante 35 / 57

135 JMS - sujets Exemples d'utilisation la bourse propose des topics correspondants à la cotation de différentes entreprises la bourse met à jour régulièrement les cotations les clients intéressés par une entreprise souscrivent au topic et sont prévenus au fur et à mesure des publications par la bourse antislashn.org Java avancé - Communication distante 36 / 57

136 JMS Les messages peuvent être persistants ou non ils survivent à une défaillance de serveur géré par le serveur les messages sont sauvegardés : sérialisation base de données, La réception des messages peut-être synchrone : le consommateur de message appelle une méthode received qui est bloquante asynchrone : le consommateur s'enregistre en tant que listener une methode onmessage sera invoquée antislashn.org Java avancé - Communication distante 37 / 57

137 JMS Un serveur JMS est nécessaire service des serveurs Java EE JBoss, Geronimo, WebSphere, WebLogic, JoNas, service indépendant Apache ActiveMQ, OpenJMS, JORAM (OW2), JBoss Messaging, Les services sont accessibles en interrogeant un service de nommage JNDI : Java Naming and Directory Interface antislashn.org Java avancé - Communication distante 38 / 57

138 JMS Démarrage avec OpenJMS télécharger l'archive décompresser l'archive dans une console démarrer le serveur JMS vérifier la présence de la variable JAVA_HOME scripts dans le répertoire <openjms_home>/bin startup et shutdown antislashn.org Java avancé - Communication distante 39 / 57

139 JMS Recherche d'une fabrique de connexion auprès du serveur JMS le classpath doit comporter les librairies adéquates les valeurs des propriétés de connexions sont différentes d'un serveur à l'autre Hashtable<String, String> properties = new Hashtable<String, String>(); properties.put(context.initial_context_factory, "org.exolab.jms.jndi.initialcontextfactory"); properties.put(context.provider_url,"tcp://localhost:3035/"); Context ctx = new InitialContext(properties); ConnectionFactory factory = (ConnectionFactory) ctx.lookup("connectionfactory"); antislashn.org Java avancé - Communication distante 40 / 57

140 JMS La description de la connexion est en général configurée dans un fichier jndi.properties fichier mis dans le classpath de l'application java.naming.factory.initial=org.exolab.jms.jndi.initialcontextfactory java.naming.provider.url=tcp://myhost:3035 le code devient alors Context ctx = new InitialContext(); ConnectionFactory factory = (ConnectionFactory) ctx.lookup("connectionfactory"); antislashn.org Java avancé - Communication distante 41 / 57

141 JMS envoi de message Les étapes d'envoi d'un message récupérer une fabrique de connexion via JNDI classe FactoryConnexion récupérer une connexion auprès de la fabrique classe Connection créer une session auprès de la connexion méthode createsession sur la connexion récupérer une file (Queue) ou un sujet (Topic) de message via JNDI classe Destination antislashn.org Java avancé - Communication distante 42 / 57

142 JMS envoi de message Les étapes d'envoi d'un message suite sur la session récupérer un producteur de message méthode de la session createproducer(destination destination) classe MessageProducer sur la session créer un message plusieurs méthodes en fonction du format du message text, stream, object, de la forme createxxxx remplir le message envoyer le message via le producteur de message antislashn.org Java avancé - Communication distante 43 / 57

143 JMS envoi d'un message Exemple récapitulatif Hashtable<String, String> properties = new Hashtable<String, String>(); properties.put(context.initial_context_factory, "org.exolab.jms.jndi.initialcontextfactory"); properties.put(context.provider_url,"tcp://localhost:3035/"); Context ctx = new InitialContext(properties); ConnectionFactory factory = (ConnectionFactory) ctx.lookup("connectionfactory"); Connection connection = factory.createconnection(); connection.start(); Session session = connection.createsession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = (Destination) ctx.lookup("queue1"); session sans transaction et en auto-acknowledge MessageProducer producer = session.createproducer(destination); TextMessage message = session.createtextmessage(); message.settext("hello, world at "+new Date()); producer.send(message); System.out.println(">>> Message envoyé"); connection.close(); nom JNDI de la queue cf. fichier openjms.xml antislashn.org Java avancé - Communication distante 44 / 57

144 JMS réception d'un message Les étapes de réception d'un message - suite récupérer une fabrique de connexion via JNDI classe FactoryConnexion récupérer une connexion auprès de la fabrique classe Connection créer une session auprès de la connexion méthode createsession sur la connexion récupérer une file (Queue) ou un sujet (Topic) de message via JNDI classe Destination antislashn.org Java avancé - Communication distante 45 / 57

145 JMS réception de message Réception d'un message synchrone sur la session récupérer un consommateur de message méthode de la session createconsumer(destination destination) classe MessageConsumer sur le consommateur de messages invoquer la méthode receive() appel bloquant réception d'un Message, à caster dans le type concrètement attendu antislashn.org Java avancé - Communication distante 46 / 57

146 JMS réception d'un message Exemple de réception synchrone Hashtable<String, String> properties = new Hashtable<String, String>(); properties.put(context.initial_context_factory, "org.exolab.jms.jndi.initialcontextfactory"); properties.put(context.provider_url,"tcp://localhost:3035/"); Context ctx = new InitialContext(properties); ConnectionFactory factory = (ConnectionFactory) ctx.lookup("connectionfactory"); Connection connection = factory.createconnection(); connection.start(); Session session = connection.createsession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = (Destination) ctx.lookup("queue1"); MessageConsumer consumer = session.createconsumer(destination); TextMessage message = (TextMessage) consumer.receive(); System.out.println("=== Réception du message : "+message.gettext()); session.close(); connection.close(); antislashn.org Java avancé - Communication distante 47 / 57

147 JMS réception de message Réception d'un message asynchrone sur la session récupérer un consommateur de messages méthode de la session createconsumer(destination destination) classe MessageConsumer enregistrer un listener de message auprès du consommateur de messages implémentation de l'interface MessageListener une seule méthode void onmessage(message message) antislashn.org Java avancé - Communication distante 48 / 57

148 JMS réception d'un message Exemple de réception synchrone... ConnectionFactory factory = (ConnectionFactory) ctx.lookup("connectionfactory"); Connection connection = factory.createconnection(); pas de transaction connection.start(); Session session = connection.createsession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = (Destination) ctx.lookup("queue1"); MessageConsumer consumer = session.createconsumer(destination); consumer.setmessagelistener(new MessageListener() public void onmessage(message message) { TextMessage textmessage = (TextMessage) message; try { System.out.println("=== Réception message : "+textmessage.gettext()); catch (JMSException e) { e.printstacktrace(); ); antislashn.org Java avancé - Communication distante 49 / 57

149 Structure générale de JMS ConnectionFactory crée MessageProducer crée envoie à Queue ou Topic Connection crée Session crée Message crée MessageConsumer récupère auprès Queue ou Topic antislashn.org Java avancé - Communication distante 50 / 57

150 JMS classes principales Fabriques de connexion pour une file de message Context ctx = new InitialContext(); QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("queueconnectionfactory"); pour un sujet Context ctx = new InitialContext(); TopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("topicconnectionfactory"); antislashn.org Java avancé - Communication distante 51 / 57

151 JMS classes principales Destinations pour une file de message Queue destination = (Queue) ctx.lookup("queue/queuea"); pour un sujet Topic destination = (Topic) ctx.lookup("topic/topica"); antislashn.org Java avancé - Communication distante 52 / 57

152 JMS classes principales Connexions pour une file de message QueueConnection connection = factory.createqueueconnection(); connection.start();... connection.close(); pour un sujet TopicConnection connection = factory.createtopicconnection(); connection.start();... connection.close(); antislashn.org Java avancé - Communication distante 53 / 57

153 JMS classes principales Session pour une file de message QueueSession session = connection.createqueuesession(false, Session.AUTO_ACKNOWLEDGE); pour un sujet pas de transaction TopicSession session = connection.createtopicsession(false, Session.AUTO_ACKNOWLEDGE); pas de transaction antislashn.org Java avancé - Communication distante 54 / 57

154 JMS classes principales Producteur de messages pour une file de message QueueSender sender = session.createsender(destination); sender.send(message); pour un sujet TopicPublisher sender = session.createpublisher(destination); sender.publish(message); antislashn.org Java avancé - Communication distante 55 / 57

155 JMS classes principales Consommateur de messages pour une file de message QueueReicever reicever = session.createreceiver(destination); pour un sujet TopicSubscriber reicever = session.createsubscriber(destination); TopicSubscriber reicever = session.createdurablesubscriber(destination); antislashn.org Java avancé - Communication distante 56 / 57

156 Ressources Livres Web Programmation réseau avec Java auteur : Elliotte Rusty Harold éditeur : O'Reilly antislashn.org Java avancé - Communication distante 57 / 57

157 Java Web Start

158 Introduction Java Web Start permet de lancer des applications directement à partir du web l'application est lancée en un seul clic à partir d'un navigateur, en cliquant sur un lien à partir du gestionnaire d'application intégré à Java Web Start à partir d'icones sur le bureau (ou menu Démarrer de Windows) pas de procédure d'installation complexe Java Web Start est automatiquement téléchargé lors du premier emploi de cette technologie Java Web Start 2

159 Introduction Au lancement d'une application Java Web Start se connecte au serveur pour déterminer si une nouvelle version existe l'application existe en cache après le premier téléchargement garantit l'exécution de la version la plus récente pas de mise à jour complexe des applications Les applications lancées par Java Web Start sont exécutées dans un environnement sécurisé accès restreint au réseau et système de fichier l'application peut demander d'étendre ses accès au système Java Web Start 3

160 Lancement à partir d'un navigateur Le lien pointe vers un fichier de configuration jnpl Java Network Launching Protocol (JSR 56) Au premier lancement de l'application le navigateur met en cache l'application les lancements suivants sont normalement plus rapides Le type MIME jnpl est associé à Java Web Start Voir la page de démo de Sun Java Web Start 4

161 Lancement à partir du gestionnaire d'applications Le gestionnaire est intégré à Java Web Start commande javaws viewer Java Web Start 5

162 Lancement à partir du gestionnaire d'applications Il permet de gérer les applications préalablement lancées par Java Web Start ressources, historique, menu, appel de la page d'accueil de l'application Le panneau de configuration Java permet de modifier les paramètres utilisés par Java Web Start proxy HTTP, cache de applications, création de raccourcis, suppression d'application Java Web Start 6

163 Lancement à partir du gestionnaire d'applications Le panneau de configuration Java est accessible par le panneau de configuration de Windows, ou les préférences systèmes sous Ubuntu Java Web Start 7

164 Déploiement de l'application Un serveur Web est nécessaire pour le déploiement Ajouter au serveur Web le type MIME jnpl associer l'extension jnpl au contenu application/x-java-jnpl_file par ajout de la ligne dans le fichier conf/mimes.types pour Apache application/x-java-jnpl_file jnpl par ajout d'un type de fichier dans IIS Java Web Start 8

165 Déploiement de l'application Créez votre application et packagez la dans un fichier jar toutes les ressources de l'application doivent être dans le jar images, propreties, librairies, public class HelloFrame extends JFrame { public HelloFrame() { super("démo Java Web Start"); getcontentpane().add(new JLabel("Hello, world")); setdefaultcloseoperation(exit_on_close); setlocationrelativeto(null); pack(); setvisible(true); public class Main { public static void main(string[] args) { new HelloFrame(); Java Web Start 9

166 Déploiement de l'application Pour rendre l'application compatible avec Java Web Start il faut créer un fichier jnpl exemple pour notre application <?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0+" codebase="http://localhost/jaws/" href="hello.jnlp"> <information> <title>hello pour JNPL</title> <vendor>antislashn.org</vendor> </information> <resources> <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se" /> <jar href="http://localhost/jaws/hello.jar" /> </resources> <application-desc main-class="org.antislashn.formation.webstart.hello.main" /> </jnlp> Java Web Start 10

167 Déploiement de l'application Pour notre exemple, les fichiers hello.jar et hello.jnlp sont copiés dans le répertoire jaws du site web Une page html permet de charger le lien <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="pspad editor, <title>applications Java Web Start</title> </head> <body> <h2>applications Java Web Start disponibles</h2> <a href="hello.jnlp">hello world</a> </body> </html> Java Web Start 11

168 Fichier JNLP Le fichier JNPL précédent est minimaliste en voici une version plus proche de la réalité <?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0+" codebase="http://localhost/jaws/" href="hello_1.jnlp"> <information> <title>hello pour JNPL</title> <vendor>antislashn.org</vendor> <homepage href="http://localhost/jaws/" /> <description>application JNLP type "Hello, world"</description> <icon href="http://localhost/jaws/download.png" with="64" height="64" /> <offline-allowed /> </information> <security> <all-permissions/> </security> <resources> <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se" /> <jar href="hello.jar" /> </resources> <application-desc main-class="org.antislashn.formation.webstart.hello.main" /> </jnlp> Java Web Start 12

169 Fichier JNLP L'ensemble des éléments pouvant être présent dans le fichier sera présenté plus loin Ce nouveau fichier demande l'utilisation des ressources normalement protégées l'exécution est effectuée dans le sand box l'application demande ici l'accès à toutes les ressources de la machine cliente <security> <all-permissions/> </security> Java Web Start 13

170 Signature de l'application L'application ne peut pas être éxécutée car elle n'est pas signée Java Web Start 14

171 Signature de l'application La signature de l'archive permet de faire savoir qui est l'éditeur de l'application des informations seront ajoutées afin de confirmer l'identité du propriétaire de l'archive, et que celle-ci n'a pas été modifiée après l'apposition de la signature L'outil keytool livré avec le JDK permet de créer des clés dans une console lancer la commande keytool il vous sera demander deux mots de passe un pour le fichier keystore lui-même, qui est une "base de données" de clés, c'est le trousseau de clé un pour la clé elle-même qui est définie par son alias Java Web Start 15

172 Signature de l'application création de la clé javaws dans le trousseau cles.keystore mot de passe pour le trousseau, ici password Cette opération peut-être répétée pour d'autres clés keytool permet de gérer les clés, cf. la documentation du JDK mot de passe pour la clé javaws, ici javawspw Java Web Start 16

173 Signature de l'application L'utilitaire jarsigner permet de signer l'archive livré avec le JDK Java Web Start 17

174 Signature de l'application L'application peut maintenant être exécutée après acceptation de la signature la signature n'est pas validée par une autorité Java Web Start 18

175 Éléments JNLP élément <jnlp> contient les attributs spec : version de Java Web Start peut être 1.0, 1.5 ou 1.0+ codebase : url de base pour les url relatives dans le fichier jnlp href : url du fichier jnlp lui-même Java Web Start 19

176 Éléments JNLP élément <information> contient les éléments <title> : nom de l'application <vendor >: nom du vendeur <homepage> : contient un attribut href contenant la page de présentation de l'application <> : description de l'application un attribut kind précise le type de description» one-line, short ou tooltip <icon> : contient l'url de l'icône (attribut href) les attributs width et heigth Java Web Start 20

177 Éléments JNLP élément <information> contient les éléments <offline-allowed> : indique que l'application peut-être utilisée hors ligne lorsqu'une une application est lancée hors ligne Java Web Start ne garantie pas que la dernière version soit chargée <shortcut> : gestion du raccourci contient un attribut online, et deux sous éléments <menu> et <desktop> <association> : permet l'association avec un type MIME <related-content> : contenus supplémentaire comme fichier readme, d'aide, peut contenir les éléments <description> et <icon> Java Web Start 21

178 Éléments JNLP élément <security> contient l'élément <all-permission> qui précise que l'application doit accéder au système de fichier et au réseau élément <resources> permet de spécifier les ressources utilisées par l'application, peut spécifier une cible de système d'exploitation peut contenir les sous éléments <jar>, <nativelib>, <j2se> Java Web Start 22

179 Éléments JNLP élément <resources> exemples <resources os="sunos" arch="sparc"> <nativelib href="lib/solaris/corelibs.jar"/> </resource> <j2se version="1.4.2-beta" href="http://java.sun.com/products/autodl/j2se"/> élément <application-desc> précise que l'application est une application, et non une applet peut contenir des éléments <argument> élément <applet-desc> qui précise que l'application est une applet, contient la description de l'applet Java Web Start 23

180 Supervision avec JMX version 1.0

181 JMX JMX : Java Management extension Standard pour la gestion et la supervision des ressources inclus de Java SE depuis la version 5 supervision des ressources matérielles et logicielles Standard utilisé massivement dans le monde des serveurs Java EE JBoss est composé d'un serveur JMX dans lequel viennent s'agréger les différents services antislashn.org JBoss - Supervision avec JMX 2 / 125

182 JMX Le standard impose de respecter une architecture une configuration de classes avec un système de nommage le contrôle est effectué par des modules applicatifs appelés MBean (Managed Bean) Architecture en trois couches niveau clients : permet le contrôle niveau agent : serveur niveau instrumentation : les MBeans antislashn.org JBoss - Supervision avec JMX 3 / 125

183 JMX source : Oracle antislashn.org JBoss - Supervision avec JMX 4 / 125

184 JMX niveau clients Client JMX niveau agent JMX Connecteurs et adaptateurs Serveur de MBean Services : Timers Notification niveau instrumentation MBean MBean MBean antislashn.org JBoss - Supervision avec JMX 5 / 125

185 Niveau instrumentation Une ressource administrable doit tourner dans une JVM application, service, périphérique L'instrumentation de la ressource est effectuée par les MBeans l'écriture d'un MBean doit suivre un modèle de conception une ressource instrumentée par un MBean est administrable par l'agent JMX antislashn.org JBoss - Supervision avec JMX 6 / 125

186 Niveau instrumentation Plusieurs types de MBeans Standard MBean les fonctionnalités sont exposées statiquement par interface MXBean Standard MBean possédant des contraintes sur les types Dynamic MBean les fonctionnalités sont exposée dynamiquement Model MBean MBean générique et configurable Open MBean Dynamic MBean possédant des contraintes sur les types antislashn.org JBoss - Supervision avec JMX 7 / 125

187 Niveau agent Serveur de MBeans MBean Client MBean Registry MBean meta data MBean antislashn.org JBoss - Supervision avec JMX 8 / 125

188 Niveau agent L'agent JMX (ou serveur JMX) est composé de du serveur de MBean classe MBeanServer de services service de notifications : classe Notification service de timer : classe Timer des connecteurs et adaptateurs de protocoles pour dialoguer avec la couche client connecteur : permet à un client Java de se connecter au serveur utilise RMI adaptateurs de protocoles : permet au client d'utiliser d'autres protocoles que RMI antislashn.org JBoss - Supervision avec JMX 9 / 125

189 Niveau agent Le serveur de MBean joue le rôle de registre d'objets un MBean doit s'enregistrer avec un nom unique auprès du serveur le nom est de type ObjectName composé d'un domaine et de propriétés (séparateurs : et,) jboss.deployment:flavor=url,type=deploymentscanner l'enregistrement peut être effectué par l'agent lui-même un autre MBean une application distante via un service distribué antislashn.org JBoss - Supervision avec JMX 10 / 125

190 Niveau agent Une fois enregistré, un certain nombres d'opérations sont disponibles sur le MBean découverte des opérations disponibles sur le MBean lecture et écriture des attributs invocation des opérations du MBean récupération des notifications émises par le MBean antislashn.org JBoss - Supervision avec JMX 11 / 125

191 Niveau agent Les services d'agent sont généralement eux-mêmes des MBeans gèrent les opération de gestion des MBeans par défaut : service m-let (Management Applet) gestion du chargement dynamique des classes service moniteur gestion des notification service de timers déclenchements réguliers d'action sur les MBeans service de mise en relation des MBeans entre eux antislashn.org JBoss - Supervision avec JMX 12 / 125

192 Niveau client Client du niveau agent Ce niveau fournit une interface de supervision et administration Deux outils sont fournis par le JDK jconsole jvisualvm regroupe plusieurs outils la visualisation des MBeans nécessite le chargement d'un plugin Possibilité de créer son propre client antislashn.org JBoss - Supervision avec JMX 13 / 125

193 JMX Le MBean suit un modèle de conception il comporte des attributs en lecture / écriture spécification des getteur/setteur des opérations et éventuellement une description antislashn.org JBoss - Supervision avec JMX 14 / 125

194 Standard MBean Modèle de conception spécification de nommage entre l'interface qui expose les attributs et opération et la classe d'implémentation la classe d'implémentation doit posséder un constructeur par défaut les attributs sont spécifiés par les méthodes getxxx(), setxxx() et isxxx() antislashn.org JBoss - Supervision avec JMX 15 / 125

195 Standard MBean Codage simple une interface même nom que la classe d'implémentation suffixé par MBean les getteur/setteur indique si l'attribut est en lecture et/ou écriture une classe d'implémentation antislashn.org JBoss - Supervision avec JMX 16 / 125

196 Standard MBean : couche agent Le MBean est identifié dans le serveur par son nom ou ObjectName composé de deux parties le domaine les propriétés les deux sont séparés par le caractère : jboss.deployment:flavor=url,type=deploymentscanner antislashn.org JBoss - Supervision avec JMX 17 / 125

197 Standard MBean : couche agent Étapes principales récupération d'un serveur de MBeans MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); création d'un ObjectName pour l'enregistrement du MBean ObjectName mbeanname = new ObjectName("antislashn.jmx:bean=Hello,type=standard"); enregistrement du MBean auprès du serveur HelloMBean mbean = new Hello(); mbs.registermbean(mbean, mbeanname); antislashn.org JBoss - Supervision avec JMX 18 / 125

198 Standard MBean : couche agent Pour exécuter le serveur de MBean, il faut activer l'accès distant à JMX -Dcom.sun.management.jmxremote d'autres propriétés peuvent être précisées si en mode remote java -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false MonAppliJava un modèle de fichier de mot de passe est proposé dans le répertoire lib/management du JRE antislashn.org JBoss - Supervision avec JMX 19 / 125

199 Standard MBean : supervision Des utilitaires de supervisions sont livrés avec le JDK jconsole jvisualvm qui intègre les utilitaire jconsole, jstat, jinfo, jmap antislashn.org JBoss - Supervision avec JMX 20 / 125

200 Standard MBean : supervision Exemple de copie d'écran avec jvisualvm antislashn.org JBoss - Supervision avec JMX 21 / 125

201 StandardMBean : codage d'un client Pour que le client se connecte au serveur de MBean, il faut que celui ci soit lancé avec les arguments suivants -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false antislashn.org JBoss - Supervision avec JMX 22 / 125

202 StandardMBean : codage d'un client Les étapes de codage créer une URL récupérer un connecteur récupérer une connexion récupérer un proxy vers le MBean port passé en argument à la JVM du server JMXServiceURL serviceurl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxconnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverconnection = jmxconnector.getmbeanserverconnection(); ObjectName objectname = new ObjectName("antislashn.jmx:bean=Hello,type=standard"); HelloMBean mbean = JMX.newMBeanProxy(serverConnection, objectname, HelloMBean.class); System.out.println(">>> "+mbean.getname()); le client connaît la classe du MBean antislashn.org JBoss - Supervision avec JMX 23 / 125

203 Dynamic MBean Implémente l'interface DynamicMBean la lecture des attributs et opérations disponibles ne se fait plus par introspection utilisation des méthodes redéfinies bien que plus complexe à coder, ce type de bean est plus puissant exposition des attributs et opérations à l'exécution pour le Standard MBean l'exposition est effectuée à la compilation pas d'import de classes spécifique côté client antislashn.org JBoss - Supervision avec JMX 24 / 125

204 Dynamic MBean Les méthodes de DynamicMean permettent de découvrir les attributs et opérations du MBean getmbeaninfo() de retrouver la valeur d'un attribut, ou d'une liste d'attributs Object getatribute(string attribute) AttributeList getattributes(string[] attributes) mettre à jour la valeur d'un attribut, ou d'une liste d'attributs void setattribute(attribute attribute) AttributeList setattributes(attributelist attributes) d'invoquer une opération Object invoke(string action,object[] params, Object[] types) antislashn.org JBoss - Supervision avec JMX 25 / 125

205 Dynamic MBean Méta-classes de description MBeanInfo : une instance par Dynamic MBean conteneur de méta données MBeanAttributeInfo : une instance par attribut MBeanParameterInfo : une instance par paramètre MBeanConstructorInfo : une instance par constructeur contient un ou plusieurs MBeanParameterInfo MBeanOperationInfo : une instance par opération contient un ou plusieurs MBeanParameterInfo MBeanNotificationInfo : une instance par groupe de notifications antislashn.org JBoss - Supervision avec JMX 26 / 125

206 Dynamic MBean MBeanAttributeInfo description d'un attribut name : nom de l'attribut tel qu'il apparaît dans l'interface de gestion type : classe de l'attribut sous forme d'un String Integer.TYPE.getName() ou Hello.class.getName() par exemple description : description de l'attribut isreadable : indicateur de lecture iswritable : indicateur d'écriture isis : indicateur d'attribut de type booléen l'accesseur débute alors par is au lieu de get antislashn.org JBoss - Supervision avec JMX 27 / 125

207 Dynamic MBean MBeanParameterInfo description d'un paramètre de constructeur ou d'opération name : nom du paramètre tel qu'il apparaît dans l'interface de gestion type : classe du paramètre sous forme d'un String description : description du paramètre antislashn.org JBoss - Supervision avec JMX 28 / 125

208 Dynamic MBean MBeanConstructorInfo description d'un constructeur name : nom du constructeur tel qu'il apparaît dans l'interface de gestion description : description du paramètre signature : tableau de MBeanParameterInfo correspondant à la signature du constructeur antislashn.org JBoss - Supervision avec JMX 29 / 125

209 Dynamic MBean MBeanOperationInfo description d'une opération name : nom de l'opération telle qu'elle apparaît dans l'interface de gestion description : description du paramètre signature : tableau de MBeanParameterInfo correspondant à la signature du constructeur type : type du retour impact : indicateur d'impact sur l'état du bean antislashn.org JBoss - Supervision avec JMX 30 / 125

210 Dynamic MBean MBeanOperationInfo valeurs possibles pour la propriété impact INFO : état du MBean inchangé, l'opération retourne une information ACTION : l'état du MBean a changé ACTION_INFO : l'état du MBean a changé, et l'opération retourne une information UNKNOW : l'impact de l'opération sur l'état du MBean est inconnu antislashn.org JBoss - Supervision avec JMX 31 / 125

211 Dynamic MBean MBeanNotificationInfo description d'une notification name : nom de la notification telle qu'elle apparaît dans l'interface de gestion description : description du paramètre notifstype : types des notifications qui sont émises par le MBean sous forme d'un tableau de String un type de notification est du type : vendor[.application][.component][.eventgroup].event antislashn.org JBoss - Supervision avec JMX 32 / 125

212 Dynamic MBean MBeanInfo description d'un MBean classname : nom de la classe du MBean (String) description : description du paramètre attributes : tableau des MBeanAttributeInfo constructors : tableau des MBeanConstructorInfo operations : tableau des MBeanOperationInfo notifications : tableau des MBeanNotificationInfo antislashn.org JBoss - Supervision avec JMX 33 / 125

213 Dynamic MBean Codage du MBean l'exemple reprends du Standard MBean Hello public interface HelloMBean { // attributs String getname(); String getcolor(); void setcolor(string color); // opérations void sayhello(); double add(double a, double b); public class Hello implements HelloMBean { private String name ="Toto MBean"; private String color = public String getname() { return public String getcolor() { return public void setcolor(string color) { this.color = public void sayhello() { System.out.println(">>> Standard MBean "+name+" - public double add(double a, double b) { return a+b; antislashn.org JBoss - Supervision avec JMX 34 / 125

214 Dynamic MBean - codage Déclaration des attributs constructeur de la classe MBeanAttributeInfo : MBeanAttributeInfo(String name, String type, String description, boolean isreadable, boolean iswritable, boolean isis) code (extrait) MBeanAttributeInfo[] attributeinfos = new MBeanAttributeInfo[2]; attributeinfos[0] = new MBeanAttributeInfo("Name",String.class.getName(), "Nom du MBean",false,true,false); attributeinfos[1] = new MBeanAttributeInfo("Color", String.class.getName(), "Couleur du MBean", true, true, false); antislashn.org JBoss - Supervision avec JMX 35 / 125

215 Dynamic MBean - codage Déclaration des opérations constructeur de la classe MBeanOperationInfo : MBeanOperationInfo(String name, Method method) code (extrait) MBeanOperationInfo[] operationinfos = new MBeanOperationInfo[5]; MBeanParameterInfo[] parameterinfos = new MBeanParameterInfo[2]; parameterinfos[0] = new MBeanParameterInfo("a", Double.TYPE.getName(), "Paramètre a"); parameterinfos[1] = new MBeanParameterInfo("a", Double.TYPE.getName(), "Paramètre a"); operationinfos[0] = new MBeanOperationInfo("add", "addition de deux double", parameterinfos, Double.TYPE.getName(), MBeanOperationInfo.UNKNOWN); antislashn.org JBoss - Supervision avec JMX 36 / 125

216 Dynamic MBean - codage Méthode getattribute(...) public Object getattribute(string attributename) throws AttributeNotFoundException, MBeanException, ReflectionException { if(attributename.equals("color")){ return this.color; else if(attributename.equals("name")){ return this.name; else throw new AttributeNotFoundException("Can't find "+attributename); antislashn.org JBoss - Supervision avec JMX 37 / 125

217 Dynamic MBean - codage Méthode getattributes(...) retour de type AttributeList étend ArrayList, mais sans généricité sur Attribute contient des instances de type Attribute encapsule les nom et valeur d'un attribut public AttributeList getattributes(string[] attributenames) { AttributeList list = new AttributeList(); for(string name : attributenames){ try { Object value = this.getattribute(name); list.add(new Attribute(name, value)); catch (AttributeNotFoundException MBeanException ReflectionException e) { e.printstacktrace(); return list; antislashn.org JBoss - Supervision avec JMX 38 / 125

218 Dynamic MBean - codage Méthode setattribute(...) public void setattribute(attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { String name = attribute.getname(); Object value = attribute.getvalue(); if(name.equals("color") && (value instanceof String)){ this.setcolor((string) value); else { new AttributeNotFoundException("Attribut "+name+" inconnu ou en lecture seule"); antislashn.org JBoss - Supervision avec JMX 39 / 125

219 Dynamic MBean - codage Méthode setattributes(...) public AttributeList setattributes(attributelist attributes) { AttributeList list = new AttributeList(); for(int i=0 ; i<attributes.size() ; i++){ try{ Attribute attribute = (Attribute) attributes.get(i); this.setattribute(attribute); String name = attribute.getname(); Object value = attribute.getvalue(); list.add(new Attribute(name, value)); catch(exception e){ e.printstacktrace(); return list; antislashn.org JBoss - Supervision avec JMX 40 / 125

220 Dynamic MBean - codage Méthode invoke(...) est invoquée pour chaque opération pas pour les accesseurs/mutateurs des attributs il faut vérifier que le nom de la méthode et la signature soient adéquats sinon il faut lever une ReflectionException il faut aussi vérifier le tableau des paramètres les types des paramètres correspondent-ils à la signature antislashn.org JBoss - Supervision avec JMX 41 / 125

221 Dynamic MBean - codage Méthode invoke(...) public Object invoke(string operationname, Object[] params, String[] signature) throws MBeanException, ReflectionException { Object retour = null; if(operationname.equals("sayhello")){ this.sayhello(); retour = Void.TYPE; else if(operationname.equals("add")){ if(signature[0].equals(double.type.getname()) && signature[1].equals(double.type.getname())){ if(params[0] instanceof Double && params[1] instanceof Double){ double a = ((Double)params[0]).doubleValue(); double b = ((Double)params[1]).doubleValue(); retour = new Double(a+b); else new ReflectionException(new NoSuchMethodException("Unknow operation : "+operationname)); return retour; antislashn.org JBoss - Supervision avec JMX 42 / 125

222 Dynamic MBean Plus complexe à coder, mais... les opérations et attributs peuvent évoluer durant le cycle de vie du bean les méthodes de description du MBean sont appelées tout au long de l'utilisation du MBean pour un Standard MBean, l'exposition des attributs et des méthodes passe par une interface antislashn.org JBoss - Supervision avec JMX 43 / 125

223 Dynamic MBean : codage d'un client Étapes de codage construction de l'url récupération d'un connecteur récupération d'une connexion au serveur JMX utilisation de la connexion au serveur pour récupérer les méta-données du MBean utiliser les attributs invoquer les opérations antislashn.org JBoss - Supervision avec JMX 44 / 125

224 Dynamic MBean : coadeg d'un client Exemple de code JMXServiceURL serviceurl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxconnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverconnection = jmxconnector.getmbeanserverconnection(); ObjectName objectname = new ObjectName("antislashn.jmx:bean=Hello,type=dynamic"); MBeanInfo beaninfo = serverconnection.getmbeaninfo(objectname); MBeanAttributeInfo[] attributeinfos = beaninfo.getattributes(); MBeanOperationInfo[] operationinfos = beaninfo.getoperations(); for(mbeanattributeinfo att : attributeinfos){ le client ne connaît pas la classe du MBean System.out.println(">>> Attribut : "+att.getname()+" == "+ serverconnection.getattribute(objectname, att.getname())); for(mbeanoperationinfo op : operationinfos){ System.out.println(">>> Opération : "+op.getname()); if(op.getname().equals("sayhello")) System.out.println("=> sayhello() returns "+ serverconnection.invoke(objectname, op.getname(), new Object[0], new String[0])); antislashn.org JBoss - Supervision avec JMX 45 / 125

225 Model MBean Type de MBean dynamique n'implémente aucune interface Le MBean n'a pas besoin de détenir une référence vers la ressource à gérer Utilise la classe RequiredModelBean pour associer une description de MBean à la ressource à superviser antislashn.org JBoss - Supervision avec JMX 46 / 125

226 Model MBean Pour résoudre l'interface du Model MBean, on utilise une classe de méta-données Descriptor interface implémentée par DescriptionSupport collection de paires nom/valeur (String/Object) une paire représente un attribut, un constructeur, une opération ou une notification il y a un descripteur par type de champ le descripteur décrit complètement le champ par la paire nom/valeur les noms utilisés sont liés à la spécification antislashn.org JBoss - Supervision avec JMX 47 / 125

227 Model MBean Interface Descriptor permet la résolution des champs les noms de champs sont spécifiés par JMX des noms personnalisés peuevent être ajoutés méthodes Object getfieldvalue(string fieldname) void setfield(string fieldname, Object fieldvalue) String[] getfields() String[] getfieldnames() void removefield(string fieldname) void setfields(string[] fieldnames, Object[] fieldvalues) antislashn.org JBoss - Supervision avec JMX 48 / 125

228 Model MBean Champs utilisés par la spécification name (obligatoire) : nom utilisé par le champ descriptortype (obligatoire) : description du type de champ, valeurs possibles MBean, attribute, operation, notification displayname : nom utilisé pour l'affichage dans le client getmethod : nom du getteur si le type est un attribut doit être déclaré dans les opérations setmethod : nom du setteur si le type est un attribut doit être déclaré dans les opérations antislashn.org JBoss - Supervision avec JMX 49 / 125

229 Model MBean Champs utilisés par la spécification currencytimelimit : utilisé sur les attributs (getteur) et retour d'opérations pour estimer sa validité une marque lastupdatetimestamp est déposée sur chaque valeur retournée unité : ms log : sur les notification, indicateur booléen logfile : obligatoire si log est utilisé, contient le chemin d'un fichier de log antislashn.org JBoss - Supervision avec JMX 50 / 125

230 Model MBean Champs utilisés par la spécification default : valeur par défaut d'un attribut utilise le setteur export : indicateur booléen utilisé pour la distribution du MBean dans un environnement distribué role: utilisé sur les opération, sa valeur peut être operation, constructor, getter, setter persistperiod : période de persistance en s, si une persitpolicy a été déclarée avec la valeur NoMoreOftenThan ou OnTimer antislashn.org JBoss - Supervision avec JMX 51 / 125

231 Model MBean Champs utilisés par la spécification persistpolicy : stratégie de persistance, valeurs possibles Never, OnTimer, OnUpdate, NoMoreOftenThan severity : degrès de sévérité d'une notification 0 : indéterminé et de 1 (NonRecoverable) à 6 (informative) value : utilisé comme cache sur les valeur d'attribut en conjonction avec le champ currencytimelimit antislashn.org JBoss - Supervision avec JMX 52 / 125

232 Model MBean Codage d'un descripteur Descriptor attrdescriptor = new DescriptorSupport(); attrdescriptor.setfield("name", "Name"); attrdescriptor.setfield("descriptortype", "attribute"); attrdescriptor.setfield("displayname", "Nom du Model MBean"); attrdescriptor.setfield("getmethod", "getname"); Le descripteur peut être une chaîne XML <descriptor> <field name="name" value="name" /> <field name="descriptortype" value="attribute"/> <field name="displayname" value="nom du Model MBean"/> <field name="getmethod" value="getname"/> </descriptor> Descriptor attrdescriptor = new DescriptorSupport(descriptorXML) ; Peut aussi être un tableau de String, String + Object antislashn.org JBoss - Supervision avec JMX 53 / 125

233 Model MBean Description de l'interface du MBean comme pour le Dynamic MBean il y a un ensemble de classes pour les méta-données ModelMBeanAttributeInfo : une instance par attribut ModelMBeanConstructorInfo : une instance par constructeur ModelMBeanOperationInfo : une instance par opération ModelMBeanNotificationInfo : une instance par groupe de notifications ModelMBeanInfoSupport : une instance pour le MBean conteneur des méta-données antislashn.org JBoss - Supervision avec JMX 54 / 125

234 Model MBean Constructeurs des classes méta-données sauf pour ModelMBeanInfo plusieurs constructeurs cf. documentation certains ne prennent pas d'instance de Descriptor il y a alors création d'une instance de Descriptor par défaut, avec les champs nécessaires l'utilisation d'un Descriptor permet d'ajouter les champs non prévus par les constructeurs antislashn.org JBoss - Supervision avec JMX 55 / 125

235 Model MBean Méta-données pour les attributs attributeinfos = new ModelMBeanAttributeInfo[2]; Descriptor namedescriptor = new DescriptorSupport(); namedescriptor.setfield("name", "Name"); namedescriptor.setfield("descriptortype", "attribute"); namedescriptor.setfield("displayname", "Nom du ModelMBean Hello"); namedescriptor.setfield("getmethod", "getname"); Descriptor colordescriptor = new DescriptorSupport(); colordescriptor.setfield("name", "Color"); colordescriptor.setfield("descriptortype", "attribute"); colordescriptor.setfield("displayname", "Couleur ModelMBean Hello"); colordescriptor.setfield("currencytimelimit", -1); colordescriptor.setfield("getmethod", "getcolor"); colordescriptor.setfield("setmethod", "setcolor"); attributeinfos[0] = new ModelMBeanAttributeInfo("Name", String.class.getName(), "Nom du Model MBean", true, false,false, namedescriptor); attributeinfos[1] = new ModelMBeanAttributeInfo("Color",String.class.getName(), "Couleur du Model MBean", true,true,false,colordescriptor); antislashn.org JBoss - Supervision avec JMX 56 / 125

236 Model MBean Méta-données pour les opérations operationinfos = new ModelMBeanOperationInfo[5]; MBeanParameterInfo a = new MBeanParameterInfo("a", Integer.TYPE.getName(), "Premier paramètre de l'addition"); MBeanParameterInfo b = new MBeanParameterInfo("b", Integer.TYPE.getName(), "Second paramètre de l'addition"); MBeanParameterInfo color = new MBeanParameterInfo("colorr", String.class.getName(), "Couleur du bean"); operationinfos[0] = new ModelMBeanOperationInfo("add","Addition entre deux entiers", new MBeanParameterInfo[]{a,b, Integer.TYPE.getName(),ModelMBeanOperationInfo.INFO); operationinfos[1] = new ModelMBeanOperationInfo("sayHello","Juste un Hello, world", null, Void.TYPE.getName(),ModelMBeanOperationInfo.INFO); operationinfos[2] = new ModelMBeanOperationInfo("getName","getName()", null, String.class.getName(),ModelMBeanOperationInfo.INFO); operationinfos[3] = new ModelMBeanOperationInfo("getColor","getColor()", null, String.class.getName(),ModelMBeanOperationInfo.INFO); operationinfos[4] = new ModelMBeanOperationInfo("setColor","setColor()", new MBeanParameterInfo[]{color, Void.TYPE.getName(),ModelMBeanOperationInfo.INFO); antislashn.org JBoss - Supervision avec JMX 57 / 125

237 Model MBean Méta-données pour le Model MBean mbeaninfo = new ModelMBeanInfoSupport("ModelMBeanHello", "Exemple de Model MBean", attributeinfos, null, operationinfos, null); Association avec la ressource MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName mbeanname = new ObjectName("antislashn.jmx:bean=Hello,type=model"); ModelMBeanHelloFactory factory = new ModelMBeanHelloFactory(); Hello hello = new Hello(); RequiredModelMBean mbean = new RequiredModelMBean(factory.getModelMBeanInfo()); mbean.setmanagedresource(hello,"objectreference"); mbs.registermbean(mbean, mbeanname); antislashn.org JBoss - Supervision avec JMX 58 / 125

238 Model MBean Exemple de construction des méta-données extrait ModelMBeanAttributeInfo(String name, String type, String description, boolean isreadable, boolean iswritable, boolean Descriptor descriptor) Descriptor attrdescriptor = new DescriptorSupport(); attrdescriptor.setfield("name", "Name"); attrdescriptor.setfield("descriptortype", "attribute"); attrdescriptor.setfield("displayname", "Nom du Model MBean"); attrdescriptor.setfield("getmethod", "getname"); attributeinfos[0] = new ModelMBeanAttributeInfo("Name", String.class.getName(), "Nom du Model MBean", true, false,false, attrdescriptor); attributeinfos[1] = new ModelMBeanAttributeInfo("Color",String.class.getName(), "Couleur du Model MBean", true,true,false); mbeaninfo = new ModelMBeanInfoSupport("ModelMBeanHello", "Exemple de Model MBean", attributeinfos, null, operationinfos, null); antislashn.org JBoss - Supervision avec JMX 59 / 125

239 Model MBean Récupération du Descriptor auprès des classes de méta-données méthode Descriptor getdescriptor() il est ainsi possible de gérer le descripteur lister les champs ajouter des champs... antislashn.org JBoss - Supervision avec JMX 60 / 125

240 Model MBean Mise en relation de la ressource à gérer avec la description du MBean classe utilitaire construisant les descripteur ObjectName mbeanname = new ObjectName("antislashn.jmx:bean=Hello,type=model"); ModelMBeanHelloFactory factory = new ModelMBeanHelloFactory(); Hello hello = new Hello(); RequiredModelMBean mbean = new RequiredModelMBean(factory.getModelMBeanInfo()); mbean.setmanagedresource(hello,"objectreference"); mbs.registermbean(mbean, mbeanname); association du descripteur et de la ressource antislashn.org JBoss - Supervision avec JMX 61 / 125

241 Model MBean Association entre la ressource et le descripteur de MBean type de référence ObjectReference : seul supporté par défaut dans le JDK Handle IOR EJBHandle RMIReference antislashn.org JBoss - Supervision avec JMX 62 / 125

242 Model MBean Résumé des étapes d'instrumentation d'une ressource instancier la ressource à gérer instancier la classe RequiredModelBean créer les classes de méta-données nécessaires créer la méta-donnée pour la ressource ModelMBeanInfo ajouter à l'instance de RequiredModelBean la métadonnée de type ModelMBeanInfo associer la ressource antislashn.org JBoss - Supervision avec JMX 63 / 125

243 MBean - comparaison type de MBean connaissance du MBean par le client complexité de codage utilisation des Open Type Standard MBean oui simple non Dynamic MBean non tout doit être codé non Model MBean non implémentation par défaut fournie non MXBean oui simple oui Open MBean non complexe oui Les Model MBean et Dynamic MBean sont mis en relation avec la ressource à surveiller ils ne possèdent pas de référence vers cette ressource ils n'encapsulent pas cette ressource antislashn.org JBoss - Supervision avec JMX 64 / 125

244 Notification d'événements Le changement d'état d'une ressource peut-être notifiée par programmation par utilisation du service de monitoring La notification est une information envoyée par un émetteur vers un listener via l'infrastructure JMX contient au minimum le type de la notification String du type vendor[.application][.component][.eventgroup].event une référence vers l'émetteur un numéro de séquence qui identifie l'occurrence de la notification antislashn.org JBoss - Supervision avec JMX 65 / 125

245 Notification d'événements Classes et interfaces principales classe Notification : représente une notification envoyée par un émetteur (broadcaster) vers un récepteur (listener) interface NotificationFilter : permet au listener de ne recevoir qu'une partie des notifications implémentée par NotificationFilterSupport interface NotificationBroadcaster : implémentée par tous les émetteurs implémentée par NotificationBroadcastSupport interface NotificationListener : implémentée par les récepteurs de notification antislashn.org JBoss - Supervision avec JMX 66 / 125

246 Notification d'événements Un émetteur : implémente l'interface NotificationBroadcaster ou étend NotificationBroadcasterSupport fournir à l'infrastructure JMX les notifications susceptibles d'être émises méthode MBeanNotificationInfo[] getnotificationinfo() Un récepteur étends l'interface NotificationListener le listener peut recevoir un sous-ensemble des notifications en fournissant une filtre le filtre implémente NotificationFilter antislashn.org JBoss - Supervision avec JMX 67 / 125

247 Notification d'événements - exemple Une classe Compteur fait évoluer régulièrement une valeur interne une notification sera émise à chaque changement de cette valeur La classe Compteur implémente CompteurMBean étend NotificationBroadcastSupport redéfinition de la méthode getnotificationinfo() maintient un numéro de séquence de notification envoie une notification sur sa méthode setvalue(...) antislashn.org JBoss - Supervision avec JMX 68 / 125

248 Notification d'événements - exemple Redéfinition de la méthode public MBeanNotificationInfo[] getnotificationinfo(){ MBeanNotificationInfo[] infos = new MBeanNotificationInfo[1]; String[] types = new String[]{"antislashn.compteur.value"; String name = AttributeChangeNotification.class.getName(); String description = "Un attribut de Compteur a changé"; MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description);... infos[0] = info; return infos; antislashn.org JBoss - Supervision avec JMX 69 / 125

249 Notification d'événements - exemple Envoi de la notification la notification comporte au moins le type de notification String une référence vers l'émetteur de la notification le numéro de séquence plusieurs constructeurs permettent d'ajouter un horodatage un message une référence vers un Object permet le passage d informations supplémentaires entre l'émetteur et le récepteur méthode setuserdata(object userdata) antislashn.org JBoss - Supervision avec JMX 70 / 125

250 Notification d'événements - exemple Envoi de la notification Notification notification = new Notification("antislashn.compteur.value", this, sequencenumber++); sendnotification(notification); Nota : la classe AttributeChangeNotification aurait pu être utilisée permet d'ajouter des informations sur la valeur de l'attribut ancienne valeur et nouvelle valeur antislashn.org JBoss - Supervision avec JMX 71 / 125

251 Notification d'événements - exemple Pour suivre les notification dans jconsole ou jvisualvm, il faut d'abord souscrire antislashn.org JBoss - Supervision avec JMX 72 / 125

252 Notification d'événements - exemple Et de voir les changements antislashn.org JBoss - Supervision avec JMX 73 / 125

253 Notification d'événements - exemple L'implémentation de NotificationListener permet de suivre les notifications avec son propre client le client doit auparavant se connecter sur notre serveur JMX via un adaptateur RMI l'url comporte le port d'écoute du serveur argument com.sun.management.jmxremote.port JMXServiceURL serviceurl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxconnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverconnection = jmxconnector.getmbeanserverconnection(); antislashn.org JBoss - Supervision avec JMX 74 / 125

254 Notification d'événements - exemple Le client doit ensuite retrouver le MBean pour s'enregistrer en tant que listener le MBean peut envoyer des notifications ObjectName objectname = new ObjectName("antislashn.jmx:type=Compteur,subtype=Notification"); CompteurMBean compteurmbean = JMX.newMBeanProxy(serverConnection, objectname, CompteurMBean.class, true); serverconnection.addnotificationlistener(objectname, new CompteurListener(), null, null); pas de filtre pas d'objet handback antislashn.org JBoss - Supervision avec JMX 75 / 125

255 Notification d'événements - exemple Le listener n'a qu'une méthode à implémenter handlenotification() premier paramètre : la notification seconde paramètre : l'objet handback class CompteurListener implements public void handlenotification(notification notification, Object handback) { System.out.println(">>> Notification "+notification.getsource()); renvoie l'ojectname du MBeanc antislashn.org JBoss - Supervision avec JMX 76 / 125

256 Notification d'événements - exemple Utilisation d'une donnée utilisateur les ancienne et nouvelle valeurs du compteur sont encapsulées dans une classe public class UserData implements Serializable{ private int oldvalue; private int newvalue; public UserData(int oldvalue, int newvalue) { this.oldvalue = oldvalue; this.newvalue = newvalue; public int getoldvalue() { return oldvalue; public int getnewvalue() { return newvalue; antislashn.org JBoss - Supervision avec JMX 77 / 125

257 Notification d'événements - exemple Utilisation d'une donnée utilisateur mise en place de la donnée utilisateur côté MBean private void sendnotification() { Notification notification = new Notification("antislashn.compteur.value", this, sequencenumber++); UserData userdata = new UserData(value-1, value); notification.setuserdata(userdata); sendnotification(notification); récupération dans le listener (côté client) class CompteurListener implements public void handlenotification(notification notification, Object handback) { System.out.println(">>> Notification "+notification.getsource()); if(notification.getuserdata()!=null){ UserData userdata = (UserData) notification.getuserdata(); System.out.println("\t oldvalue == "+userdata.getoldvalue()+ " - newvalue == "+userdata.getnewvalue()); antislashn.org JBoss - Supervision avec JMX 78 / 125

258 Notification d'événements - exemple Utilisation de l'objet de retour objet créé par le listener passé à l'émetteur de notification via la méthode addnotificationlistener() retourné à la méthode handlenotification() du listener Permet de créer des contextes propres aux listeners antislashn.org JBoss - Supervision avec JMX 79 / 125

259 Notification d'événements - exemple Mise en place du handback lors de l'ajout du listener l'objet peut-être évidemment de tout type String typelog = " "; serverconnection.addnotificationlistener(objectname, new CompteurListener(), null, typelog); Récupération du handback class CompteurListener implements public void handlenotification(notification notification, Object handback) { String typelog = (String) handback; if(typelog.equals("console")){ System.out.println(">>> Notification sur la console "+notification.getsource()); else if(typelog.equals(" ")){ send (); antislashn.org JBoss - Supervision avec JMX 80 / 125

260 Notification d'événements - exemple Filtrer les notifications par implémentation de NotificationFilter encapsule la liste des types de notifications permis définit la méthode isnotificationenabled() qui renvoie un booléen indiquant la prise en charge ou non de l'envoi de la notification au listener par utilisation de la classe NotificationFilterSupport la méthode enabletype() permet d'enregistrer les types de notifications permis l'enregistrement du filtre est effectué lors de l'ajout du listener méthode addnotificationlistener(...) antislashn.org JBoss - Supervision avec JMX 81 / 125

261 Notification d'événements - exemple Filtrer les notifications par implémentation de NotificationFilter class CompteurNotificationFilter implements NotificationFilter { String[] types = { "antislashn.counter.down" public boolean isnotificationenabled(notification notification) { for (String type : types) { if (type.equals(notification.gettype())) return true; return false; antislashn.org JBoss - Supervision avec JMX 82 / 125

262 Notification d'événements - exemple Filtrer les notifications par utilisation de NotificationFilterSupport NotificationFilterSupport filter = new NotificationFilterSupport(); filter.enabletype("antislashn.counter.down"); serverconnection.addnotificationlistener(objectname, new CompteurListener(), filter, null); antislashn.org JBoss - Supervision avec JMX 83 / 125

263 MXBean Le MXBean est un Standard MBean avec des restrictions sur les types pas d'utilisation de types personnalisés utilisation de OpenType<T> et de ses types dérivés le client de MXBean n'a pas besoin de connaître la classe métier utilisée le codage de la partie cliente est moins directe mais plus générique cf. antislashn.org JBoss - Supervision avec JMX 84 / 125

264 MXBean Exemple de Standard MBean exposant une classe métier Contact public interface ContactServiceMBean { void addcontact(contact contact); List<Contact> getallcontacts(); Contact getcontact(int id); Utilisation par le client... JMXServiceURL serviceurl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxconnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverconnection = jmxconnector.getmbeanserverconnection(); ObjectName objectname = new ObjectName("antislashn.jmx:type=ContactService"); ContactServiceMBean contactservice = JMX.newMBeanProxy(serverConnection, objectname, ContactServiceMBean.class); Contact c1 = contactservice.getcontact(1);... La classe Contact est importée antislashn.org JBoss - Supervision avec JMX 85 / 125

265 MXBean Pour transformer le Standard MBean en XMBean, il faut implémenter une interface postfixée par MXBean au lieu de MBean public interface ContactServiceMBean { void addcontact(contact contact); List<Contact> getallcontacts(); Contact getcontact(int id); public interface ContactServiceMXBean { void addcontact(contact contact); List<Contact> getallcontacts(); Contact getcontact(int id); antislashn.org JBoss - Supervision avec JMX 86 / 125

266 MXBean Le client ne récupère plus une classe métier mais un CompositeType on interroge alors le CompositeType par le nom des propriétés du type métier les collections sont transformées en tableaux JMXServiceURL serviceurl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxconnector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverconnection = jmxconnector.getmbeanserverconnection(); ObjectName objectname = new ObjectName("antislashn.jmx:type=MXContactService"); CompositeData[] liste = (CompositeData[]) serverconnection.getattribute(objectname, "AllContacts"); for(compositedata data : liste){ String name = (String) data.get("name"); int age = (int) data.get("age"); System.out.println("Contact : "+name+ " - "+age); interrogation de l'attribut AllContacts du XMBean récupération des propriétés de l'objet métier par leur nom antislashn.org JBoss - Supervision avec JMX 87 / 125

267 Services de monitoring Permet d'observer les valeurs des attributs d'un MBean le MBean est l'objet observé le moniteur observe le MBean à intervalle régulier en ms (granularity period) une notification est envoyée lorsqu'une condition est satisfaite la condition varie en fonction du type de moniteur le moniteur peut calculer une valeur par différence (derived gauge) pour les attributs numériques non activé par défaut cf. méthode setdifferencemode(boolean value) antislashn.org JBoss - Supervision avec JMX 88 / 125

268 Services de monitoring Trois moniteurs de surveillance sont fournis par défaut dans l'implémentation JMX antislashn.org JBoss - Supervision avec JMX 89 / 125

269 Services de monitoring Surveillance de comptage CounterMonitor observe l'augmentation d'un attribut entier d'un MBean byte, short, int, long et classes associées envoie une notification si la valeur de l'attribut observé dépasse une certaine valeur (threshold) possibilité de relancer la notification setoffset(number value) mode de calcul par différence if (counter[t] - counter[t-gp]) is positive then V[t] = counter[t] - counter[t-gp] if (counter[t] - counter[t-gp]) is negative then V[t] = counter[t] - counter[t-gp] + MODULUS GP => garnularity period antislashn.org JBoss - Supervision avec JMX 90 / 125

270 Services de monitoring Surveillance d'évolution GaugeMonitor observe un changement arbitraire d'un attribut numérique d'un MBean int, long, float, double et classes associées envoie une notification si la valeur dérivée passe au-dessus d'une limite haute (high threshold) passe en-dessous d'une limite basse (low threshold) antislashn.org JBoss - Supervision avec JMX 91 / 125

271 Services de monitoring Surveillance de chaîne de caractères StringMonitor observe un changement sur attribut de type String d'un MBean envoie une notification lorsque la valeur dérivée est égale à une chaîne de caractère précise diffère d'une chaîne de caractère précise antislashn.org JBoss - Supervision avec JMX 92 / 125

272 CounterMonitor - exemple Un MBean compteur change sa propre valeur sur un thread attribut Value Un CounterMonitor surveille se MBean Mise en place de la surveillance MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName compteurobjectname = new ObjectName("antislashn.jmx:type=Compteur"); CompteurMBean compteurmbean = new Compteur(); server.registermbean(compteurmbean, compteurobjectname); enregistrement du MBean Compteur ObjectName monitorobjectname = new ObjectName("antislashn.jmx:type=Monitor"); CounterMonitor monitor = new CounterMonitor(); monitor.addobservedobject(compteurobjectname); monitor.setobservedattribute("value"); server.registermbean(monitor, monitorobjectname); objet et attribut observé enregistrement du CounterMonitor antislashn.org JBoss - Supervision avec JMX 93 / 125

273 CounterMonitor - exemple Signal généré par le CompteurMBean 100 Stratégie mise en place 0 10 s période de surveillance : toute les secondes une notification est lancée si l'attribut est supérieur à 7 monitor.setgranularityperiod(1000); monitor.setinitthreshold(7); monitor.setnotify(true); antislashn.org JBoss - Supervision avec JMX 94 / 125

274 CounterMonitor - exemple Signal généré par le CompteurMBean Integer.MAX_VALUE Stratégie mise en place 0 incrément de 1 toutes les 100 ms période de surveillance : toute les secondes une notification est lancée si la valeur de l'attribut surveillé est supérieur à 7 monitor.setgranularityperiod(1000); monitor.setinitthreshold(7); monitor.setnotify(true); antislashn.org JBoss - Supervision avec JMX 95 / 125

275 CounterMonitor - exemple Signal généré par le CompteurMBean Integer.MAX_VALUE Stratégie mise en place 0 incrément de 1 toutes les 100 ms période de surveillance : toute les secondes une notification est lancée si la valeur de l'attribut surveillé est supérieur à 7 monitor.setgranularityperiod(1000); monitor.setinitthreshold(7); monitor.setnotify(true); antislashn.org JBoss - Supervision avec JMX 96 / 125

276 CounterMonitor - exemple Signal généré par le CompteurMBean Integer.MAX_VALUE Stratégie mise en place 0 incrément de 1 toutes les 100 ms période de surveillance : toute les secondes une notification est lancée si l'attribut est supérieur à 7 l'offset ajouté au threshold a chaque fois que la valeur sous surveillance est supérieure au threshold permet de lancer plusieurs notifications monitor.setgranularityperiod(1000); monitor.setinitthreshold(7); monitor.setoffset(5); monitor.setnotify(true); antislashn.org JBoss - Supervision avec JMX 97 / 125

277 GaugeMonitor - exemple Signal généré par le CompteurMBean s GaugeMonitor monitor = new GaugeMonitor(); monitor.addobservedobject(compteurobjectname); monitor.setobservedattribute("value"); monitor.setgranularityperiod(10); monitor.setthresholds(7, 3); monitor.setnotifyhigh(true); monitor.setnotifylow(true); antislashn.org JBoss - Supervision avec JMX 98 / 125

278 Timer Service Émetteur de notifications programmable intervalle fixe date donnée etc. Structure du service le service émet des TimerNotification antislashn.org JBoss - Supervision avec JMX 99 / 125

279 Timer Service Classe Timer utilise un thread secondaire méthode addnotification(...) ajoute une notification à la file des notifications à envoyer plusieurs signatures envoi d'une notification envoi période de notification envoi d'un nombre prédéfini de notification antislashn.org JBoss - Supervision avec JMX 100 / 125

280 Timer Service Utilisation du timer création d'une instance de Timer ajout d'une notification ajout d'un listener démarrage du timer une notification sera envoyée à la date programmée Timer mbean = new Timer(); Date date = new Date(new Date().getTime()+Timer.ONE_SECOND*2); mbean.addnotification("antislashn.timer.test", "test 1", null, date); mbean.addnotification("antislashn.timer.test", "test 2", null, date,1000,10); mbean.addnotificationlistener(new TimerNotificationListener(), null, null); mbean.start(); 10 notifications seront envoyées, toutes les secondes, à partir de la date programmée antislashn.org JBoss - Supervision avec JMX 101 / 125

281 Monitoring de la JVM Plusieurs fonctionnalités ont été ajoutées depuis le JDK 1.5 la JVM est instrumentée avec des MBean existence d'une API de monitoring permet d'obtenir des informations sur l'état de la JVM durant son exécution mémoire, threads, garbage collector, utilisable sous forme de MBean de type MXBean chaque MBean est identifié par son ObjectName ils implémentent l'interface PlatformManagedObject des méthodes la classe ManagementFactory permettent de récupérer directement les MXBeans antislashn.org JBoss - Supervision avec JMX 102 / 125

282 Monitoring de la JVM Exemple sur OperatingSystemMXBean OperatingSystemMXBean mxbean = ManagementFactory.getOperatingSystemMXBean(); System.out.println("Architecture : "+mxbean.getarch()); System.out.println("Nb de processeurs : "+mxbean.getavailableprocessors()); System.out.println("Système d'exploitation : "+mxbean.getname()+" "+mxbean.getversion()); System.out.println("Charge du système : "+mxbean.getsystemloadaverage()); Architecture : x86 Nb de processeurs : 8 Systeème d'exploitation : Windows Charge du système : -1.0 la charge n'a pas pu être calculée antislashn.org JBoss - Supervision avec JMX 103 / 125

283 Monitoring de la JVM Exemple sur RuntimeMXBean RuntimeMXBean rbean = ManagementFactory.getRuntimeMXBean(); System.out.printf("Boot classpath : %s\n", rbean.getbootclasspath()); System.out.printf("classpath : %s\n", rbean.getclasspath()); System.out.println("Input argument :"); List<String> arguments = rbean.getinputarguments(); for (String arg : arguments) { System.out.println(" " + arg); System.out.printf("Library path : %s\n", rbean.getlibrarypath()); System.out.printf("Management spec version : %s\n", rbean.getmanagementspecversion()); System.out.printf("Name : %s\n", rbean.getname()); System.out.printf("Spec name : %s\n", rbean.getspecname()); System.out.printf("Vendor : %s\n", rbean.getspecvendor()); System.out.printf("Spec version : %s\n", rbean.getspecversion()); System.out.printf("StartTime : %d ms\n", rbean.getstarttime()); antislashn.org JBoss - Supervision avec JMX 104 / 125

284 Service JBoss jusqu'à version 6 Les services sont des archives SAR déployés dans le répertoire de déploiement l'archive contient un fichier de description du service META-INF/jboss-service.xml Le service créé doit utiliser les classes JBoss interface org.jboss.system.servicembean classe org.jboss.system.servicembeansupport fournit des méthodes de gestion du cycle de vie du service antislashn.org JBoss - Supervision avec JMX 105 / 125

285 Service JBoss jusqu'à version 6 Diagramme de classe de l'exemple HelloService antislashn.org JBoss - Supervision avec JMX 106 / 125

286 Service JBoss jusqu'à version 6 Code de l'exemple (extraits) public interface HelloServiceMBean extends ServiceMBean{ void setmessage(string message); String getmessage(); void sayhello(); public class HelloService extends ServiceMBeanSupport implements HelloServiceMBean { private String public void setmessage(string message) { this.message = public String getmessage() { return message; antislashn.org JBoss - Supervision avec JMX 107 / 125

287 Service JBoss jusqu'à version 6 Contenu du fichier de déploiement META-INF/jboss-service.xml cf. la DTD jboss-service_x_y.dtd (version x, release y) classe d'implémentation <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE server> <server> <mbean code="org.antislashn.jmx.helloservice" name="antislashn.service:service=helloservice"> <attribute name="message">bonjour tout le monde</attribute> ObjectName du service </mbean> </server> initialisation de l'attribut Message antislashn.org JBoss - Supervision avec JMX 108 / 125

288 Service JBoss jusqu'à version 6 Attributs les plus courants pour <mbean> : <code> (obligatoire) : classe d'implémentation <name> (obligatoire) : JMX ObjectName du MBean <interface> : nom qualifié de l'interface, par défaut le nom de cette interface suit la spécification MBean antislashn.org JBoss - Supervision avec JMX 109 / 125

289 Service JBoss jusqu'à version 6 Éléments fils les plus courants pour <mbean> : <constructor (args*)> : spécifie un constructeur, si le constructeur par défaut n'est pas utilisé <arg> : argument du constructeur, possède les attributs type et value <attribute> : permet l'initialisation d'un attribut du MBean <depends> : spécifie une dépendance vers un autre MBean Cf. la DTD pour une documentation exhaustive antislashn.org JBoss - Supervision avec JMX 110 / 125

290 Service JBoss jusqu'à version 6 La console JMX de JBoss permet de vérifier la prise en compte du déploiement du service antislashn.org JBoss - Supervision avec JMX 111 / 125

291 Service JBoss version 7 Deux stratégies de mise en place d'un service service JMX MBean plus simple qu'avec les versions précédentes pas besoin d'étendre les classes et interfaces JBoss les méthode start() et stop() seront automatiquement appelées le fichier META-INF/jboss-service.xml référencie un schéma XML au lieu d'une DTD service EJB ce n'est pas un service JMX avec les antislashn.org JBoss - Supervision avec JMX 112 / 125

292 Service JBoss version 7 Exemple de service JMX public interface HelloServiceMBean { void setmessage(string message); String getmessage(); void sayhello(); public class HelloService implements HelloServiceMBean { private String public void setmessage(string message) {this.message = public String getmessage() {return public void sayhello() {System.out.println(">>> HelloService : "+message); public void start() throws Exception {System.out.println(">>> CYCLE DE VIE HelloService start"); public void stop() {System.out.println(">>> CYCLE DE VIE HelloService stop"); antislashn.org JBoss - Supervision avec JMX 113 / 125

293 Service JBoss version 7 Exemple de fichier de déploiement META-INF/jboss-service.xml cf. le schéma pour plus de détails <?xml version="1.0" encoding="utf-8"?> <server xmlns="urn:jboss:service:7.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="urn:jboss:service:7.0 jboss-service_7_0.xsd"> <mbean code="org.antislashn.jmx.helloservice" name="antislashn.service:service=hello,type=test"> <attribute name="message">hello, world</attribute> </mbean> </server> antislashn.org JBoss - Supervision avec JMX 114 / 125

294 Service JBoss version 7 Le service est disponible dans la console JBoss, ainsi que par jconsole ou jvisualvm antislashn.org JBoss - Supervision avec JMX 115 / 125

295 Console en mode distant jconsole ou jvisualvm peuvent se connecter en mode distant côté serveur JMX il faut au moins lancer l'application Java avec l'indication du port utilisé -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false lancer alors la console en mode "Remote Process" antislashn.org JBoss - Supervision avec JMX 116 / 125

296 Console en mode distant Activation du fichier des mots de passe deux fichiers sont nécessaires fichier des droits d'accès par défaut : JRE_HOME/lib/management/jmxremote.acces définit les droits d'accès fichier des mots de passe par défaut : JRE_HOME/lib/management/jmxremote.password définit les mots de passe le fichier modèle doit être renommé les fichiers doivent être en lecture seule attention à l'héritage des droits sous Windows antislashn.org JBoss - Supervision avec JMX 117 / 125

297 Console en mode distant Activation du fichier des mots de passe si les fichiers utilisé ne sont pas sous JRE_HOME/lib/management il faut ajouter les arguments suivant à la JVM ici les fichiers sont recherché dans le répertoire du projet -Dcom.sun.management.jmxremote.access.file=jmxremote.access -Dcom.sun.management.jmxremote.password.file=jmxremote.password En production il est préférable d'activer SSL d'utiliser JAAS pour l'authentification antislashn.org JBoss - Supervision avec JMX 118 / 125

298 Client personnalisé en mode distant Si le mode distant est sécurisé, il faut passer le rôle et le mot de passe au moment de la connexion extrait de code String[] credential = {"controlrole","titi"; Map<String,String[]> env = new HashMap<String,String[]>(); env.put(jmxconnector.credentials, credential); JMXServiceURL serviceurl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3333/jmxrmi"); JMXConnector jmxconnector = JMXConnectorFactory.connect(serviceURL,env); MBeanServerConnection serverconnection = jmxconnector.getmbeanserverconnection(); ObjectName objectname = new ObjectName("antislashn.jmx:bean=Hello,type=standard"); HelloMBean mbean = JMX.newMBeanProxy(serverConnection, objectname, HelloMBean.class); antislashn.org JBoss - Supervision avec JMX 119 / 125

299 Console en mode distant problèmes potentiels Gestion des droits sous Windows au lancement du serveur JMX l'erreur suivante apparaît Erreur: L'accès en lecture au fichier de mots de passe doit être limité: jmxremote.password il faut modifier les droits (click droit sur le fichier) cf page suivante antislashn.org JBoss - Supervision avec JMX 120 / 125

300 Console en mode distant problèmes potentiels Gestion des droits sous Windows (suite) décocher cf page suivante antislashn.org JBoss - Supervision avec JMX 121 / 125

301 Console en mode distant problèmes potentiels Gestion des droits sous Windows (suite) supprimer tous les utilisateurs sauf l'administrateur OK OK antislashn.org JBoss - Supervision avec JMX 122 / 125

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants. RMI Remote Method Invocation: permet d'invoquer des méthodes d'objets distants. Méthode proche de RPC. Outils et classes qui rendent l'implantation d'appels de méthodes d'objets distants aussi simples

Plus en détail

Les tâches et la synchronisation en langage Java

Les tâches et la synchronisation en langage Java Les tâches et la synchronisation en langage Java Les threads, les verrous, les sémaphores et les moniteurs en Java D après les cours de D. Genthial et B. Caylux Langage Java Threads et synchronisation

Plus en détail

Modèle client-serveur

Modèle client-serveur Modèle client-serveur Daniel Hagimont IRIT/ENSEEIHT 2 rue Charles Camichel - BP 7122 31071 TOULOUSE CEDEX 7 Daniel.Hagimont@enseeiht.fr http://hagimont.perso.enseeiht.fr 1 Plan Principes généraux Modèle

Plus en détail

Plan. Environnement Client/Serveur. Cours 6 Rappels Java (suite) Appel de méthode à distance. Utilité. static

Plan. Environnement Client/Serveur. Cours 6 Rappels Java (suite) Appel de méthode à distance. Utilité. static Plan Environnement Client/Serveur Cours 6 Rappels Java (suite) Appel de méthode à distance kn@lri.fr http://www.lri.fr/~kn 1 Rappels sur les systèmes d'exploitations / Communication par mémoire partagée

Plus en détail

Java RMI. Programmation des applications réparties. Olivier Flauzac URCA. Master EEAMI-Informatique première année

Java RMI. Programmation des applications réparties. Olivier Flauzac URCA. Master EEAMI-Informatique première année Java RMI Programmation des applications réparties Olivier Flauzac URCA Master EEAMI-Informatique première année Olivier Flauzac (URCA) PAR : Java RMI MSTIC-INFO 1 1 / 30 1 RMI 2 Architecture 3 Développement

Plus en détail

Remote Method Invocation (RMI)

Remote Method Invocation (RMI) Remote Method Invocation (RMI) TP Réseau Université Paul Sabatier Master Informatique 1 ère Année Année 2006/2007 Plan Objectifs et Inconvénients de RMI Fonctionnement Définitions Architecture et principe

Plus en détail

Modèle client-serveur

Modèle client-serveur Modèle client-serveur Daniel Hagimont IRIT/ENSEEIHT 2 rue Charles Camichel - BP 7122 31071 TOULOUSE CEDEX 7 Daniel.Hagimont@enseeiht.fr http://hagimont.perso.enseeiht.fr Remerciements Michel Riveill 1

Plus en détail

TP Java RMI. Alexandre Denis Alexandre.Denis@inria.fr. Inria Bordeaux Sud-Ouest France ENSEIRB PG306

TP Java RMI. Alexandre Denis Alexandre.Denis@inria.fr. Inria Bordeaux Sud-Ouest France ENSEIRB PG306 TP Java RMI Alexandre Denis Alexandre.Denis@inria.fr Inria Bordeaux Sud-Ouest France ENSEIRB PG306 Paradigme RMI RMI (Remote Method Invocation) RPC orientés objet (encapsulation, héritage,...) objet :

Plus en détail

Synchro et Threads Java TM

Synchro et Threads Java TM Synchro et Threads Java TM NICOD JEAN-MARC Master 2 Informatique Université de Franche-Comté UFR des Sciences et Techniques septembre 2008 NICOD JEAN-MARC Synchro et Threads avec Java TM 1 / 32 Sommaire

Plus en détail

Java Remote Method Invocation

Java Remote Method Invocation Java Remote Method Invocation Ce support est très largement inspiré du livre et du cours de S. Krakowiak S. Krakowiak Java Remote Method Invocation 1 / 25 Intérêt des objets pour la construction d applications

Plus en détail

JAVA - Compléments du cours 9

JAVA - Compléments du cours 9 JAVA - Compléments du cours 9 Nicolas Baudru Année 2008-2009 Exercice 1 (Création de threads) En Java, il existe deux méthodes pour créer des threads. La première étend la classe Thread : class MonThread

Plus en détail

Cours client-serveur Web : Java et RMI (Remote Method Invocation)

Cours client-serveur Web : Java et RMI (Remote Method Invocation) Cours client-serveur Web : Java et RMI (Remote Method Invocation) 1 Java: Rappel sur les threads Cycle de vie d un thread (1) Né -> prêt appel de la méthode start du thread Prêt Exécution Distribution

Plus en détail

Systèmes Distribués Des protocoles client serveur au paradigme objets distribués avec Java

Systèmes Distribués Des protocoles client serveur au paradigme objets distribués avec Java Systèmes Distribués Des protocoles client serveur au paradigme objets distribués avec Java (application avec Java RMI) Éric Leclercq Département IEM / Laboratoire LE2i Décembre 2010 émail : Eric.Leclercq@u-bourgogne.fr

Plus en détail

Systèmes distribués. Les Sockets

Systèmes distribués. Les Sockets Systèmes distribués Plusieurs technologies existent : Les sockets Les remote procedure call (RPC) Remote Method Invocation (RMI) Les Sockets L'utilisation des Sockets nécessite De gérer le codage et le

Plus en détail

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java Info0604 Programmation multi-threadée Cours 5 Programmation multi-threadée en Java Pierre Delisle Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique 18 février 2015 Plan

Plus en détail

1 Questions de cours (4,5 points) 2 Multiplication avec des PRAM (4 points)

1 Questions de cours (4,5 points) 2 Multiplication avec des PRAM (4 points) Université de Provence MASTER INFORMATIQUE Programmation Parallèle et Distribuée 2010-2011 Programmation Parallèle et Distribuée Partiel jeudi 10 mars 2011 2h00 Aucun document autorisé. Les réponses doivent

Plus en détail

Programmation par RPC et Java-RMI :

Programmation par RPC et Java-RMI : 2A-SI 3 Prog. réseau et systèmes distribués 3.2 et JavaRMI Stéphane Vialle Stephane.Vialle@supelec.fr http://www.metz.supelec.fr/~vialle Support de cours élaboré avec l aide de l équipe pédagogique du

Plus en détail

RMI (Remote Method Invocation) Client serveur, situation traditionnelle. Client serveur, situation traditionnelle.

RMI (Remote Method Invocation) Client serveur, situation traditionnelle. Client serveur, situation traditionnelle. RMI (Remote Method Invocation) Présentation de RMI Université Française d Egypte Richard Grin Version 0.6 10/10/12 R. Grin RMI page 2 Client serveur, situation traditionnelle Sur la machine A un client

Plus en détail

Programmation Réseau RMI. Jean-Baptiste.Yunes@univ-paris-diderot.fr armand@informatique.univ-paris-diderot.fr. ! UFR Informatique

Programmation Réseau RMI. Jean-Baptiste.Yunes@univ-paris-diderot.fr armand@informatique.univ-paris-diderot.fr. ! UFR Informatique Programmation Réseau RMI Jean-Baptiste.Yunes@univ-paris-diderot.fr armand@informatique.univ-paris-diderot.fr UFR Informatique 2014 Les RMI de Java Les applications RMI sont des applications bâties sur

Plus en détail

Introduction : les processus. Introduction : les threads. Plan

Introduction : les processus. Introduction : les threads. Plan IN328 Programmation distribuée avec Java et J2EE 2 - Threads en Java Introduction : les processus Un processus est un ensemble d instructions à exécuter, un espace mémoire réservé et éventuellement d autres

Plus en détail

RMI le langage Java XII-1 JMF

RMI le langage Java XII-1 JMF Remote Method Invocation (RMI) XII-1 Introduction RMI est un ensemble de classes permettant de manipuler des objets sur des machines distantes (objets distants) de manière similaire aux objets sur la machine

Plus en détail

Programmation multitâches avec les Threads

Programmation multitâches avec les Threads Programmation multitâches avec les Threads A. Introduction A.1. Programmation multitâche Tous les systèmes d'exploitation actuels ont la possibilité d'effectuer plusieurs tâches en simultané. En effet,

Plus en détail

Objets distribués et Appel de Méthodes à Distance 2009-2010

Objets distribués et Appel de Méthodes à Distance 2009-2010 Objets distribués et Appel de Méthodes à Distance 2009-2010 1 Objectif : construire une application où différents modules peuvent être situés sur des machines différentes, en utilisant un modèle à objets

Plus en détail

JVM. RMI - couche de référence. RMI - couche de transport TCP/IP

JVM. RMI - couche de référence. RMI - couche de transport TCP/IP Chapitre 9 Dans ce chapitre nous abordons le mécanisme RMI (Remote Method Invocation) permettant le développe ment des systèmes répartis. Nous expliquerons comment les classes d un serveur peuvent être

Plus en détail

Remote Method Invocation Les classes implémentant Serializable

Remote Method Invocation Les classes implémentant Serializable Parallélisme Architecture Eric Goubault Commissariat à l Energie Atomique Saclay Classe qui implémente la méthode distante (serveur): - dont les méthodes renvoient un objet serializable - ou plus généralement

Plus en détail

La programmation réseau. Java

La programmation réseau. Java Chapitre 7 : Java et les réseaux La programmation réseau Java Rémy Courdier 1996-2003 - Java Réseau - Version du cours 3.0 1 Sommaire La programmation réseau La classe URL Les Sockets TCP/IP et les principaux

Plus en détail

Exclusion mutuelle Synchronisation avancée. Programmation parallèle et concurrente

Exclusion mutuelle Synchronisation avancée. Programmation parallèle et concurrente Exclusion mutuelle Synchronisation avancée Programmation parallèle et concurrente Problématique Synchronisation = essentielle si utilisation de plusieurs threads Développement d'applications robustes 2

Plus en détail

La plate-forme Java RMI

La plate-forme Java RMI La plate-forme Java RMI Frank Singhoff Bureau C-202 Université de Brest, France Lab-STICC/UMR 3192 singhoff@univ-brest.fr UE systèmes à objets répartis, Université de Brest Page 1/25 Sommaire 1. Le modèle

Plus en détail

Sensibilisation à RMI (Remote Method Invocation)

Sensibilisation à RMI (Remote Method Invocation) Jini Sensibilisation à RMI (Remote Method Invocation) Le rêve de tout système distribué L idéal serait d avoir un système distribué utilisant la technologie objet et permettant : 1) d invoquer une méthode

Plus en détail

Etude de cas PLM. Patrice TORGUET IRIT Université Paul Sabatier

Etude de cas PLM. Patrice TORGUET IRIT Université Paul Sabatier Etude de cas PLM Patrice TORGUET IRIT Université Paul Sabatier Plan Exemple PLM Répartition avec Sockets Répartition avec RMI Répartition avec CORBA Répartition avec JMS Répartition avec Java EE Améliorations

Plus en détail

Dr. M.W. Youssef Systèmes d exploitation Avancées 1ING ISI - 2009

Dr. M.W. Youssef Systèmes d exploitation Avancées 1ING ISI - 2009 Institut Supérieur d Informatique Chapitre 02 Synchronisation des processus Dr. Mohamed-Wassim YOUSSEF 2009 [www.wassimyoussef.info] Systèmes d exploitation avancées 1 ING ISI 1 ére année Ingénieur en

Plus en détail

Programmation réseau en Java : les threads

Programmation réseau en Java : les threads Programmation réseau en Java : les threads Michel Chilowicz Transparents de cours sous licence Creative Commons By-NC-SA Master 2 TTT Université Paris-Est Marne-la-Vallée Version du 28/02/2013 chilowi

Plus en détail

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation Cycle Ingénierie 2e année SIGL Dernière mise à jour : 19/10/2006 Christophe Porteneuve Threads Principes Cycle de vie Création java.lang.thread

Plus en détail

Notion de thread (1/2)

Notion de thread (1/2) Notion de thread (1/2) La machine virtuelle java (JVM) permet d'exécuter plusieurs traitements en parallèle (en pratique, ils s'exécutent par tranche et en alternance sur le processeur). Ces traitements

Plus en détail

as Architecture des Systèmes d Information

as Architecture des Systèmes d Information Gestion des threads Gestion des timers Gestion des threads Gestion des timers Programmation - Threads - Nicolas Malandain 1 Gestion des threads Principe Création Cycle Synchronisation Collections May 1,

Plus en détail

Programmation concurrente en java

Programmation concurrente en java Programmation concurrente en java M. Belguidoum Université Mentouri de Constantine Département Informatique M. Belguidoum (UMC) Programmation concurrente 1 / 29 Plan 1 Introduction 2 Création d'un thread

Plus en détail

Programmation concurrente Problématiques associées. Chap #3.2

Programmation concurrente Problématiques associées. Chap #3.2 Programmation concurrente Problématiques associées Chap #3.2 1 Introduction L exécution simultanée de plusieurs tâches concurrentes ne s effectue pas sans difficultés. Plusieurs threads peuvent accéder

Plus en détail

Cours 3: Coopération entre processus: Synchronisation + Communication

Cours 3: Coopération entre processus: Synchronisation + Communication Cours 3: Coopération entre processus: Synchronisation + Communication Coopération entre processus & Synchronisation + Communication 1. Introduction 2. Rendez-vous de N entités 3. Producteur(s) / Consommateur(s)

Plus en détail

RMI : Remote Method Invocation Appel de méthodes à distance TD/TP

RMI : Remote Method Invocation Appel de méthodes à distance TD/TP RMI : Remote Method Invocation Appel de méthodes à distance TD/TP Patrice Torguet torguet@irit.fr Université Paul Sabatier But l But du TD/TP : application répartie permettant de gérer des comptes bancaires.

Plus en détail

Le réseau est l ordinateur

Le réseau est l ordinateur Le réseau est l ordinateur (Bill Joy) Les applets 1 Les applets : principe Les applets sont des programme Java téléchargés à partir d un serveur WEB et qui s exécutent dans le browser d un client : Fichier.html

Plus en détail

Cours 3: Coopération entre processus: Synchronisation + Communication

Cours 3: Coopération entre processus: Synchronisation + Communication Cours 3: Coopération entre processus: Synchronisation + Communication Coopération entre processus & Synchronisation + Communication 1. Introduction 2. Rendez-vous de N entités 3. Producteur(s) / Consommateur(s)

Plus en détail

Programmation Socket en Java

Programmation Socket en Java Programmation Socket en Java Cours sockets Université Paul Sabatier Plan Un bon réflexe Les adresses IP en Java Sockets en mode flot La classe Socket La classe ServerSocket Communication via les Sockets

Plus en détail

Programmation orientée objet en langage JAVA

Programmation orientée objet en langage JAVA Programmation orientée objet en langage JAVA Java RMI : Techniques et utilisations avancées de RMI Claude Duvallet Université du Havre UFR Sciences et Techniques 25 rue Philippe Lebon - BP 540 76058 LE

Plus en détail

RMI : Remote Method Invocation Appel de méthodes à distance

RMI : Remote Method Invocation Appel de méthodes à distance RMI : Remote Method Invocation Appel de méthodes à distance Patrice Torguet torguet@irit.fr Université Paul Sabatier Plan du cours l Les RPC l Architecture et fonctionnement de RMI l Etapes de développement

Plus en détail

Les Systèmes et Applications Réparties et leur Programmation

Les Systèmes et Applications Réparties et leur Programmation Les Systèmes et Applications Réparties et leur Programmation Samia Bouzefrane Maître de Conférences Laboratoire CEDRIC Conservatoire National des Arts et Métiers 292 rue Saint Martin 75141 Paris Cédex

Plus en détail

Java Avancé - Cours 2

Java Avancé - Cours 2 Java avancé - cours 2 1/8 Java Avancé - Cours 2 Plan 1 Communication entre objets 1 1.1 Motivation....................................................... 1 1.2 Relations entre le panier et le rayon.........................................

Plus en détail

Threads Java 1.5 Synchronisation

Threads Java 1.5 Synchronisation Threads Java 1.5 Synchronisation Avancée Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr Université de Provence 23 février 2012 Arnaud Labourel (Université de Provence) Threads Java Synchronisation

Plus en détail

Moniteurs, Java, Threads et Processus

Moniteurs, Java, Threads et Processus Moniteurs, Java, Threads et Processus 1 Une vue orientée-objet de la mémoire partagée On peut voir un sémaphore comme un objet partagé accessible par deux méthodes : wait et signal. L idée du concept de

Plus en détail

Programmation avancée et répartie en Java : les processus légers

Programmation avancée et répartie en Java : les processus légers Programmation avancée et répartie en Java : les processus légers Frédéric Gava L.A.C.L Laboratoire d Algorithmique, Complexité et Logique Cours de M1 MIAGE (d après les notes de cours de Fabrice Mourlin)

Plus en détail

Calcul Parallèle. Cours 5 - JAVA RMI

Calcul Parallèle. Cours 5 - JAVA RMI Calcul Parallèle Cours 5 - JAVA RMI Eric Goubault Commissariat à l Energie Atomique & Chaire Ecole Polytechnique/Thalès Saclay Le 28 février 2012 Eric Goubault 1 28 février 2012 Remote Method Invocation

Plus en détail

Threads. Threads. USTL http://www.lifl.fr/ routier 1

Threads. Threads. USTL http://www.lifl.fr/ routier 1 Threads USTL http://www.lifl.fr/ routier 1 Rappels - Définitions un Process est un programme qui tourne et dispose de ses propres ressources mémoire. OS multi-tâche plusieurs process en concurrence un

Plus en détail

Etat de l art de Java temps réel Ecole d été Temps Réel Nancy 2005 Marc richard-foy

Etat de l art de Java temps réel Ecole d été Temps Réel Nancy 2005 Marc richard-foy Etat de l art de Java temps réel Ecole d été Temps Réel Nancy 2005 Marc richard-foy Le langage Java - Copyright 2004 - AONIX. Tous droits réservés. Page 1 Plan 1. Concepts et exemples de la concurrence

Plus en détail

TP d initiation aux systèmes et applications répartis

TP d initiation aux systèmes et applications répartis TP d initiation aux systèmes et applications répartis Grégory Mounié, Simon Nieuviarts, Sébastien Viardot Au début de l informatique, on exploitait simplement des ordinateurs. Maintenant, on construit

Plus en détail

Les tâches et la synchronisation en langage Java

Les tâches et la synchronisation en langage Java Les tâches et la synchronisation en langage Java Les threads, les verrous, les sémaphores et les moniteurs en Java D après les cours de D. Genthial et B. Caylux Langage Java Threads et synchronisation

Plus en détail

SOA et Services Web. 23 octobre 2011. Evolution des Systèmes d Information

SOA et Services Web. 23 octobre 2011. Evolution des Systèmes d Information SOA et Services Web 23 octobre 2011 1 Evolution des Systèmes d Information 2 Qu est ce qu une application répartie? Il s agit d une application découpée en plusieurs unités Chaque unité peut être placée

Plus en détail

Sockets. Karima Boudaoud IUT- R&T

Sockets. Karima Boudaoud IUT- R&T Sockets Karima Boudaoud IUT- R&T Rappels sur les sockets Qu est ce qu un socket? Point d entrée entre 2 appli. du réseau Permet l échange de donnée entre elles à l aide des mécanismes d E/S (java.io) Différents

Plus en détail

Année 2008-2009. Les threads Java. Nicolas Baudru mél : nicolas.baudru@esil.univmed.fr page web : nicolas.baudru.perso.esil.univmed.

Année 2008-2009. Les threads Java. Nicolas Baudru mél : nicolas.baudru@esil.univmed.fr page web : nicolas.baudru.perso.esil.univmed. Année 2008-2009 Les threads Java Nicolas Baudru mél : nicolas.baudru@esil.univmed.fr page web : nicolas.baudru.perso.esil.univmed.fr 1 Présentation du problème Revenons quelques instants à nos animaux.

Plus en détail

Remote Method Invocation en Java (RMI)

Remote Method Invocation en Java (RMI) Remote Method Invocation en Java (RMI) Modélisation et construction des applications réparties (Module M-4102C) J. Christian Attiogbé Fevrier 2015 J. Christian Attiogbé (Fevrier 2015) Remote Method Invocation

Plus en détail

1. QCM (40 points) (1h)

1. QCM (40 points) (1h) Examen 1ère session 2012-2013 page 1 NSY 102 - AISL IPST-CNAM Intranet et Designs patterns NSY 102 Vendredi 26 Avril 2013 Durée : 3 heures Enseignants : LAFORGUE Jacques 1. QCM (40 points) (1h) Mode d'emploi

Plus en détail

Concurrence API Concurrente. Rémi Forax

Concurrence API Concurrente. Rémi Forax Concurrence API Concurrente Rémi Forax ThreadLocal Permet de déclarer des variables qui seront locales à une thread Une instance gère les différentes valeurs d'une même variable (une valeur par thread)

Plus en détail

La programmation concurrente

La programmation concurrente La programmation concurrente Jean-Ferdy Susini Maître de Conférences - CNAM Département Informatique Sources : Android Developpers, Wikipedia Paris, 06/05/2015 Architecture matérielle 2 Considérons l architecture

Plus en détail

Programmation Java Avancée

Programmation Java Avancée Programmation Java Avancée Module RPCI01 Département R&T IUT de Villetaneuse 2 novembre 2015 Département R&T Programmation Java Avancée 2 novembre 2015 1 / 74 Plan du cours 1 La gestion des exceptions

Plus en détail

INITIATION AU LANGAGE JAVA

INITIATION AU LANGAGE JAVA INITIATION AU LANGAGE JAVA I. Présentation 1.1 Historique : Au début des années 90, Sun travaillait sur un projet visant à concevoir des logiciels simples et performants exécutés dans des PDA (Personnal

Plus en détail

Introduction à JAVA RMI

Introduction à JAVA RMI Introduction à JAVA RMI Plan Introduction Architecture logique Principe de programmation Un exemple Fabrique d'objets Appels en retour 2 Bibliographie Documentation Sun : http://java.sun.com/javase/technologies/core/basic/rmi/

Plus en détail

NFP111 Systèmes et Applications Réparties

NFP111 Systèmes et Applications Réparties NFP111 Systèmes et Applications Réparties 1 de 38 NFP111 Systèmes et Applications Réparties Cours 11 - Les Enterprise Java Beans (Introduction aux Enterprise Claude Duvallet Université du Havre UFR Sciences

Plus en détail

Java - RMI Remote Method Invocation. Stéphane Frénot -MID - V.0.2.0 Part I - RMI 1

Java - RMI Remote Method Invocation. Stéphane Frénot -MID - V.0.2.0 Part I - RMI 1 Java - RMI Remote Method Invocation Stéphane Frénot -MID - V.0.2.0 Part I - RMI 1 Répartition d'une application Application de Présentation Middleware Implicite Application de traitement Application de

Plus en détail

Java - RMI Remote Method Invocation

Java - RMI Remote Method Invocation Java - RMI Remote Method Invocation Stéphane Frénot -MID - V.0.2.0 Part I - RMI 1 Répartition d'une application Application de Présentation Système d'exploitation Middleware Implicite Application de traitement

Plus en détail

Programmation Multi-Threading en Java

Programmation Multi-Threading en Java Programmation Multi-Threading en Java Christophe Gravier, Frédérique Laforest, Julien Subercaze Télécom Saint-Étienne Université Jean Monnet {prénom.nom}@univ-st-etienne.fr FI2_INFO4 2012 2013 1 / 35 Plan

Plus en détail

Parallélisme en Java. Patrice Torguet

Parallélisme en Java. Patrice Torguet Parallélisme en Java Patrice Torguet Plan Introduction Notion de processus Notion de thread Créations de threads Synchronisation entre threads wait et notify Les différents états d un thread Difficultés

Plus en détail

Java RMI. Arnaud Labourel Courriel: arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 8 mars 2011

Java RMI. Arnaud Labourel Courriel: arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 8 mars 2011 Java RMI Arnaud Labourel Courriel: arnaud.labourel@lif.univ-mrs.fr Université de Provence 8 mars 2011 Arnaud Labourel (Université de Provence) Java RMI 8 mars 2011 1 / 58 Web services Services par le réseau

Plus en détail

Données et communications en Java

Données et communications en Java Données et communications en Java Programmation des applications réparties Olivier Flauzac Master EEAMI-Informatique première année Olivier Flauzac (URCA) Données et communications en Java EEAMI-INFO 1

Plus en détail

Communications et synchronisations. Système L3, 2014-2015 1/21

Communications et synchronisations. Système L3, 2014-2015 1/21 Communications et synchronisations Système L3, 2014-2015 1/21 Le problème des philosophes (Dijkstra 1965) Cinq philosophes sont assis autour d une table ronde Chaque philosophe a devant lui un plat de

Plus en détail

Plan Rappels sur les patrons de conception Contexte Annuaire JNDI Conception d Applications Hétérogènes Distribuées

Plan Rappels sur les patrons de conception Contexte Annuaire JNDI Conception d Applications Hétérogènes Distribuées Conception d Applications Hétérogènes Distribuées Master 2 Traitement de l Information Lionel Médini Septembre-novembre 2015 du cours Outils de programmation avancés Retour sur les patrons de conception

Plus en détail

Serveurs réseau. 2011 Pearson Education France Java, mise à jour pour Java 7 Timothy Fisher

Serveurs réseau. 2011 Pearson Education France Java, mise à jour pour Java 7 Timothy Fisher 11 Serveurs réseau En pratique, il y a bien plus de chances que vous écriviez du code de client réseau que du code de serveur réseau. Toutefois, bon nombre d applications intègrent à la fois des fonctionnalités

Plus en détail

Servlets (fin) Accès aux paramètres. GET différend de POST GET : Paramètres dans l'url POST : Paramètres dans l'header

Servlets (fin) Accès aux paramètres. GET différend de POST GET : Paramètres dans l'url POST : Paramètres dans l'header Servlets (fin) Accès aux paramètres GET différend de POST GET : Paramètres dans l'url POST : Paramètres dans l'header Masqué par l'api Méthode getparameter(), getparametervalues() [page de forumulaire]

Plus en détail

DUT Informatique Module JAVA Apprentis Département Informatique 2008 / 2009. Travaux Pratiques n o 7 : RMI

DUT Informatique Module JAVA Apprentis Département Informatique 2008 / 2009. Travaux Pratiques n o 7 : RMI iut ORSAY DUT Informatique Département Informatique 2008 / 2009 Travaux Pratiques n o 7 : RMI Nom(s) : Groupe : Date : Objectifs : savoir créer des applications client-serveur mettant en jeu des machines

Plus en détail

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf Introduction à Java Matthieu Herrb CNRS-LAAS http://homepages.laas.fr/matthieu/cours/java/java.pdf Mars 2014 Plan 1 Concepts 2 Éléments du langage 3 Classes et objets 4 Packages 2/28 Histoire et motivations

Plus en détail

Plan du cours 5:Threads

Plan du cours 5:Threads Plan du cours 5:Threads introduction Définition Création des Threads Gestion des priorités Synchronisation Page : 1 Introduction(1) Les structure de contrôle: If.. Else.. While Switch. Try..catch.. Offrent

Plus en détail

Synchronisation par. Rappels. Plan. Conditions et moniteurs (1/7) Inf 431 Cours 11. jeanjacqueslevy.net

Synchronisation par. Rappels. Plan. Conditions et moniteurs (1/7) Inf 431 Cours 11. jeanjacqueslevy.net Rappels Inf 431 Cours 11 un processus t (Thread) est un programme qui s exécute Synchronisation par mémoire partagée tstart lance l exécution concurrente de la méthode trun de t tinterrupt signale qu on

Plus en détail

Projet M1 : Application P2P Hybride avec RMI

Projet M1 : Application P2P Hybride avec RMI Projet M1 : Application P2P Hybride avec RMI Applications Réparties 2008-2009 Université Paris VIII / Parcours SRM / M1 Sujet : Le but de ce projet est d'implémenter une application de partage de fichiers

Plus en détail

Programmation - Java - Fiches du Langage. Marie Beurton-Aimar

Programmation - Java - Fiches du Langage. Marie Beurton-Aimar Programmation - Java - Fiches du Langage Marie Beurton-Aimar Fiche Numéro 1 1.1 Structure d un programme Java Toutes les instructions se terminent par un ; Le nom du fichier qui contient une classe doit

Plus en détail

La programmation réseau. Java

La programmation réseau. Java Chapitre 7 : Java et les réseaux La programmation réseau Java Rémy Courdier 1996-2009 - Java Réseau - Version du cours 3.0 1 Sommaire La programmation réseau Rappel Réseau Couches réseau et TCP-IP Notion

Plus en détail

Plan. Les objets répartis. Sources. Cours. Introduction. Pierre Courtieu. Remote method invocation (JAVA/RMI)

Plan. Les objets répartis. Sources. Cours. Introduction. Pierre Courtieu. Remote method invocation (JAVA/RMI) Les objets répartis Pierre Courtieu Plan Introduction Les applications distribuées Introduction Les applications distribuées Remote method invocation (JAVA/RMI) Exemple 1: Compte en banque Exemple complet:

Plus en détail

Un ordonnanceur stupide

Un ordonnanceur stupide Un ordonnanceur simple Université Paris Sud L objet des exercices qui suivent est de créer un ordonanceur implantant l algorithme du tourniquet ( round-robin scheduler ). La technique utilisée pour élire

Plus en détail

Cours 4. - Créer des animations : la classe Thread et l'interface Runnable - Quelques composants supplémentaires : le choix dans une liste

Cours 4. - Créer des animations : la classe Thread et l'interface Runnable - Quelques composants supplémentaires : le choix dans une liste Cours 4 - Créer des animations : la classe Thread et l'interface Runnable - Quelques composants supplémentaires : le choix dans une liste JComboBox et JList F. Gayral 1 Rappel : multi-tâches multi-tâches

Plus en détail

Package java.net. Interfaces Interface ContentHandlerFactory Interface SocketImplFactory Interface URLStreamHandlerFactory

Package java.net. Interfaces Interface ContentHandlerFactory Interface SocketImplFactory Interface URLStreamHandlerFactory Package java.net Classes class ContentHandler class DatagramPacket class DatagramSocket class InetAddress final class ServerSocket final class Socket class SocketImpl final class URL abstract class URLConnection

Plus en détail

Projet gestion d'objets dupliqués

Projet gestion d'objets dupliqués Projet gestion d'objets dupliqués Daniel Hagimont Daniel.Hagimont@enseeiht.fr 1 Projet Service de gestion d'objets dupliqués Mise en cohérence lors de la prise d'un verrou sur un objet Pas de verrous imbriqués

Plus en détail

PROGRAMMATION DISTRIBUÉE TUTORIEL RMI

PROGRAMMATION DISTRIBUÉE TUTORIEL RMI PROGRAMMATION DISTRIBUÉE TUTORIEL RMI PUBLIC CONCERNÉ : formation initiale, 2 e année. NOM DE L AUTEUR : V. Thomas DATE 2012/2013 UNIVERSITÉ DE LORRAINE IUT NANCY CHARLEMAGNE 2 ter boulevard Charlemagne

Plus en détail

Programmation réseaux avec le langage Java

Programmation réseaux avec le langage Java Programmation réseaux avec le langage Java Février 2015 Ivan Madjarov Partie I Introduction à la programmation Java réseau 2 Introduction Le modèle OSI (Open System Interconnexion) 3 Routage et Passerelle

Plus en détail

16/03/2015. Diviser pour calculer plus vite Fork - Join. Quelques modèles en programmacon parallèle et leur mise en œuvre en Java.

16/03/2015. Diviser pour calculer plus vite Fork - Join. Quelques modèles en programmacon parallèle et leur mise en œuvre en Java. Diviser pour calculer plus vite Fork - Join riveill@unice.fr h5p://www.i3s.unice.fr/~riveill Quelques modèles en programmacon parallèle et leur mise en œuvre en Java 2 SituaCon 1 Synchroniser un ensemble

Plus en détail

Programmation Concurrente, Réactive et Répartie

Programmation Concurrente, Réactive et Répartie Programmation Concurrente, Réactive et Répartie Cours N 3 Emmanuel Chailloux Master d Informatique Université Pierre et Marie Curie année 2012-2013 Cours 3 - Programmation Concurrente, Réactive et Répartie

Plus en détail

Systèmes répartis : Remote Method Invocation p.1/74

Systèmes répartis : Remote Method Invocation p.1/74 Systèmes répartis : Remote Method Invocation Fabrice Rossi http://apiacoa.org/contact.html. Université Paris-IX Dauphine Systèmes répartis : Remote Method Invocation p.1/74 Plan 1. Introduction 2. JRMP

Plus en détail

Le Langage Java et le Monde des Objets

Le Langage Java et le Monde des Objets . p.1 Le Langage Java et le Monde des Objets Les principes de la modélisation Orientée Objet. Qu est-ce qu une classe?. Les types de base. Utiliser les classes. Les tentacules de Java. . p.2 Bibliographie

Plus en détail

Communications et synchronisations

Communications et synchronisations Communications et synchronisations Polytech Paris-Sud Cycle ingénieur de la filière étudiant Louis Mandel Université Paris-Sud 11 Louis.Mandel@lri.fr année 2012/2013 Le problème des philosophes (Dijkstra

Plus en détail

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig Fabienne.Boyer@imag.fr

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig Fabienne.Boyer@imag.fr 4. Outils pour la synchronisation F. Boyer, Laboratoire Lig Fabienne.Boyer@imag.fr Le problème Insuffisance des solutions de base (verrous) Les solutions de plus haut niveau Les Sémaphores Les Moniteurs

Plus en détail

Programmation orientée objet appliquée avec le langage Java Réseaux

Programmation orientée objet appliquée avec le langage Java Réseaux Programmation orientée objet appliquée avec le langage Java Réseaux IUT d'aix en Provence Réseaux et Télécommunications Décembre 2013 Ivan Madjarov Partie XIII Programmation en Java par Socket en mode

Plus en détail

Collection Concurrente

Collection Concurrente Java Avancé Collection Concurrente Rémi Forax forax@univ-mlv.fr 1 java.util.concurrent Deux sortes de classes Des classes utilitaires Sémaphore CountDownLatch CyclicBarrier Exchanger Des collections concurrentes

Plus en détail

Implementing a simple RMI Application over the. Internet. (using. and

Implementing a simple RMI Application over the. Internet. (using. and Implementing a simple RMI Application over the (using and Internet and comparing HTTP tunneling,, RMI Proxy) Plan de l exposé Introduction Problématique HTTP tunneling Comment RMI «tunnelle» des messages

Plus en détail

TP 3 Programmation client/serveur

TP 3 Programmation client/serveur PhL - 20/03/2007 - Page 1 / 5 TP 3 Programmation client/serveur 1. Modèle de programmation 1. Introduction Au-dessus des protocoles de transmission, on peut construire des applications réparties reposant

Plus en détail

1 Le Parking revisité

1 Le Parking revisité Module I6 - Manipulation de threads II 13 décembre 2012 1 Le Parking revisité Une société de gestion de parkings de voitures souhaite mettre en place un système automatique d affichage en temps réel de

Plus en détail