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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant. Chapitre 7 Le mode de communication en connexion est, a priori, supporté par le protocole TCP. Ce protocole fournit une communication fiable; les données sont transmises comme chaînes d octets. Avant de

Plus en détail

Diviser pour calculer plus vite Fork - Join. riveill@unice.fr h.p://www.i3s.unice.fr/~riveill

Diviser pour calculer plus vite Fork - Join. riveill@unice.fr h.p://www.i3s.unice.fr/~riveill Diviser pour calculer plus vite Fork - Join riveill@unice.fr h.p://www.i3s.unice.fr/~riveill Quelques modèles en programma>on parallèle et leur mise en œuvre en Java 2 Situa>on 1 Il existe de nombreux

Plus en détail

Intergiciel - concepts de base

Intergiciel - concepts de base Intergiciel - concepts de base Ada Diaconescu, Laurent Pautet & Bertrand Dupouy ada.diaconescu _at_ telecom-paristech.fr Rappel : système réparti Système constitué de multiples ressources informatiques

Plus en détail

EXAMEN DE JAVA 2010-2011

EXAMEN DE JAVA 2010-2011 NOM : PRÉNOM : TP : G TP EXAMEN DE JAVA 2010-2011 Consignes : avec documents, mais sans téléphone, ordinateur ou autre moyen de communication. Durée : 2h Recommandations : Le code doit être écrit en JAVA

Plus en détail

Une introduction à la technologie EJB (2/3)

Une introduction à la technologie EJB (2/3) Une introduction à la technologie EJB (2/3) 1 Les singletons des EJB 3.1 1.1 Synchronisation gérée manuellement Depuis la version 3.1, des EJB Statless à instance unique sont maintenant disponibles : ce

Plus en détail

objectif : plan : Java, CORBA et RMI A. Le Grand,1997 1 JAVA, CORBA et RMI

objectif : plan : Java, CORBA et RMI A. Le Grand,1997 1 JAVA, CORBA et RMI JAVA, CORBA et RMI objectif : développer des applications client/serveur incluant des objets répartis Java / CORBA : client/serveur hétérogènes Java / RMI : client/serveur homogènes plan : l architecture

Plus en détail

Introduction à la programmation concurrente

Introduction à la programmation concurrente Introduction à la programmation concurrente Moniteurs Yann Thoma Reconfigurable and Embedded Digital Systems Institute Haute Ecole d Ingénierie et de Gestion du Canton de Vaud This work is licensed under

Plus en détail

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Communication inter-processus (IPC) : tubes & sockets exemples en C et en Java F. Butelle F. Butelle, E. Viennet, Système GTR2 IUT Paris 3 Java : implémentation

Plus en détail

Programmer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr)

Programmer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr) Programmer en JAVA par Tama (tama@via.ecp.fr( tama@via.ecp.fr) Plan 1. Présentation de Java 2. Les bases du langage 3. Concepts avancés 4. Documentation 5. Index des mots-clés 6. Les erreurs fréquentes

Plus en détail

Dis papa, c est quoi un bus logiciel réparti?

Dis papa, c est quoi un bus logiciel réparti? Dis papa, c est quoi un bus logiciel réparti? Raphael.Marvie@lifl.fr LIFL IRCICA Equipe GOAL Octobre 2006 10. Des sockets aux bus logiciels répartis 1 0. Une application répartie 2 Objectif Découvrir la

Plus en détail

Java Naming and Directory Interface

Java Naming and Directory Interface Introduction Java Naming and Directory Interface Gaël Thomas gael.thomas@lip6.fr Université Pierre et Marie Curie Master Informatique M2 Spécialité SAR Java Naming and Directory Interface (JNDI) Java Standard

Plus en détail

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011 Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr Université de Provence 9 février 2011 Arnaud Labourel (Université de Provence) Exclusion Mutuelle 9 février 2011 1 / 53 Contexte Epistémologique

Plus en détail

ARCHITECTURES MATÉRIELLES SYSTÈMES INFORMATIQUES

ARCHITECTURES MATÉRIELLES SYSTÈMES INFORMATIQUES CENTRALISÉE RÉPARTIE mémoire locale mémoire locale mémoire locale mémoire locale mémoire locale mémoire locale processeur processeur processeur processeur processeur processeur instructions messages MÉMOIRE

Plus en détail

as Architecture des Systèmes d Information

as Architecture des Systèmes d Information Plan Plan Programmation - Introduction - Nicolas Malandain March 14, 2005 Introduction à Java 1 Introduction Présentation Caractéristiques Le langage Java 2 Types et Variables Types simples Types complexes

Plus en détail

LOG4430 : Architecture et conception avancée

LOG4430 : Architecture et conception avancée LOG4430 : Architecture et conception avancée Abdou Maiga Patrons pour la conception d applications distribuées Département de génie informatique et de génie logiciel École Polytechnique de Montréal Guéhéneuc,

Plus en détail

Java - RMI Remote Method Invocation. Java - RMI

Java - RMI Remote Method Invocation. Java - RMI Remote Method Invocation Yann Viémont Université de Versailles St-Quentin Plan 1. Introduction 2. Rappels sur les RPC 3. Le modèle objet de Java-RMI 4. Architecture générale 1. Introduction = Disponible

Plus en détail

Un chat en C# Extrait de Wikipédia

Un chat en C# Extrait de Wikipédia Un chat en C# Un chat utilise un mécanisme de communication entre deux applications distantes. Il existe plusieurs solutions pour faire communiquer deux applications ; nous allons, ici, utiliser le protocole

Plus en détail

CEG3585/CEG3555 Tutorat 2. Été 2015

CEG3585/CEG3555 Tutorat 2. Été 2015 CEG3585/CEG3555 Tutorat 2 Été 2015 Architecture TCP/IP Les applications sont développées avec le socket API (en Java les classes Socket et ServerSocket) Adresse socket: Port TCP Adresse IP Les deux adresses

Plus en détail

Développement Logiciel

Développement Logiciel Développement Logiciel Éxamen session 1-2012-2013 (Vendedi 25 mai, 9h-11h) Seuls les documents liés directement au cours sont autorisés (comme dit sur le site) : sujets de TD, notes de cours, notes personnelles

Plus en détail

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

4. Outils pour la synchronisation F. Boyer, Laboratoire Sardes Fabienne.Boyer@imag.fr 4. Outils pour la synchronisation F. Boyer, Laboratoire Sardes 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

Plan du cours. Historique du langage http://www.oracle.com/technetwork/java/index.html. Nouveautés de Java 7

Plan du cours. Historique du langage http://www.oracle.com/technetwork/java/index.html. Nouveautés de Java 7 Université Lumière Lyon 2 Faculté de Sciences Economiques et Gestion KHARKIV National University of Economic Introduction au Langage Java Master Informatique 1 ère année Julien Velcin http://mediamining.univ-lyon2.fr/velcin

Plus en détail

Projet Active Object

Projet Active Object Projet Active Object TAO Livrable de conception et validation Romain GAIDIER Enseignant : M. Noël PLOUZEAU, ISTIC / IRISA Pierre-François LEFRANC Master 2 Informatique parcours MIAGE Méthodes Informatiques

Plus en détail

CORBA avec OpenORB. Samir Torki et Patrice Torguet

CORBA avec OpenORB. Samir Torki et Patrice Torguet CORBA avec OpenORB Samir Torki et Patrice Torguet 1 Présentation de CORBA CORBA (Common Object Request Broker Architecture) est un standard décrivant une architecture pour la mise en place d objets distribués.

Plus en détail

Avant-propos 1. Avant-propos...3 2. Organisation du guide...3 3. À qui s'adresse ce guide?...4

Avant-propos 1. Avant-propos...3 2. Organisation du guide...3 3. À qui s'adresse ce guide?...4 Les exemples cités tout au long de cet ouvrage sont téléchargeables à l'adresse suivante : http://www.editions-eni.fr. Saisissez la référence ENI de l'ouvrage EP5EJAV dans la zone de recherche et validez.

Plus en détail

M2-GamaGora. Programmation Multi-Thread - partie 1. J.C. Iehl. November 13, 2008

M2-GamaGora. Programmation Multi-Thread - partie 1. J.C. Iehl. November 13, 2008 Programmation Multi-Thread - partie 1 November 13, 2008 pourquoi ça ne marche pas? et alors? introduction aux threads threads : pourquoi ça ne marche pas? et alors? un nouveau point d entrée (une fonction

Plus en détail

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique Institut Supérieure Aux Etudes Technologiques De Nabeul Département Informatique Support de Programmation Java Préparé par Mlle Imene Sghaier 2006-2007 Chapitre 1 Introduction au langage de programmation

Plus en détail

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007 NFP 121 Java et les Threads Présentation : Thierry Escalarasse Mai 2007 Plan du cour Présentation de la notion de Threads La classe Thread L interface Runnable Les états d un thread La Synchronisation

Plus en détail

TD sur JMS ---- 1) Qu est-ce qu un middleware orienté message (MOM)? Quelles différences faites-vous entre un MOM et JMS?

TD sur JMS ---- 1) Qu est-ce qu un middleware orienté message (MOM)? Quelles différences faites-vous entre un MOM et JMS? TD sur JMS ---- Questions de cours : 1) Qu est-ce qu un middleware orienté message (MOM)? Quelles différences faites-vous entre un MOM et JMS? MOM : Message Oriented Middleware Intergiciels orientés Messages

Plus en détail

Manuel d'utilisation de la console de supervision

Manuel d'utilisation de la console de supervision Manuel d'utilisation de la console de supervision Ce document décrit la mise en route et l'utilisation de la console d'administration web de PEtALS. EBM WebSourcing (MarieSauvage) - Mai 2007 - (CC) EBM

Plus en détail

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers. Programmation Orientée Objet - Licence TIS CM8/9 Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.fr Poitiers, le 13/03/2006 Rappel sur la séance précédente La fois précédente, nous avons vu : 1 UML

Plus en détail

Licence d'informatique 2004-2005 Examen Programmation orientée objet Juin 2005

Licence d'informatique 2004-2005 Examen Programmation orientée objet Juin 2005 Licence d'informatique 2004-2005 Examen Programmation orientée objet Juin 2005 Durée de l'épreuve : 2 heures TRÈS IMPORTANT : respectez l'ordre des questions. La lisibilité sera un critère important pour

Plus en détail

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

[APPLICATON REPARTIE DE VENTE AUX ENCHERES] 2012 Polytech Nice- Sophia El Hajji Khalil Yousfi Hichem SI4 - Log [APPLICATON REPARTIE DE VENTE AUX ENCHERES] Sommaire Architecture de l application... 3 Le Serveur... 3 Le Client... 4 Passage en CORBA...

Plus en détail

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés) Introduction à la POO 1. Histoire de la POO 9 2. Historique du 12 La conception orientée objet 1. Approche procédurale et décomposition fonctionnelle 13 2. La transition vers l'approche objet 14 3. Les

Plus en détail

Filière : M2 informatique Année universitaire : 2014-2015 Cours : Réutilisation et composants TP EJB 2

Filière : M2 informatique Année universitaire : 2014-2015 Cours : Réutilisation et composants TP EJB 2 Université Montpellier II Faculté des Sciences Département Informatique Filière : M2 informatique Année universitaire : 2014-2015 Cours : Réutilisation et composants TP EJB 2 Objectifs du TD Développer

Plus en détail

Projet de programmation (IK3) : TP n 1 Correction

Projet de programmation (IK3) : TP n 1 Correction Projet de programmation (IK3) : TP n 1 Correction Semaine du 20 septembre 2010 1 Entrées/sorties, types de bases et structures de contrôle Tests et types de bases Tests et types de bases (entiers) public

Plus en détail

RESEAUX. Communications dans les systèmes Centralisés vs Répartis. Le modèle OSI : 7 couches Open System Interconnexion. Plan.

RESEAUX. Communications dans les systèmes Centralisés vs Répartis. Le modèle OSI : 7 couches Open System Interconnexion. Plan. RESEAUX Communications dans les systèmes Centralisés vs Répartis Espace utilisateur P1 P2 P1 P2 Programmation par sockets Espace noyau Systèmes centralisés Systèmes répartis Nécessité d avoir une mémoire

Plus en détail

Auto-évaluation Programmation en Java

Auto-évaluation Programmation en Java Auto-évaluation Programmation en Java Document: f0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INTRODUCTION AUTO-ÉVALUATION PROGRAMMATION EN

Plus en détail

Problèmes liés à la concurrence

Problèmes liés à la concurrence ENS Cachan Problématique Difficile de gérer la concurrence : Pas toujours facile d avoir des fonctions réentrantes. Risque de race condition : ex : x :=x+1 x :=x+1 On voudrait des blocs d instructions

Plus en détail

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la

Plus en détail

Messagerie asynchrone et Services Web

Messagerie asynchrone et Services Web Article Messagerie asynchrone et Services Web 1 / 10 Messagerie asynchrone et Services Web SOAP, WSDL SONT DES STANDARDS EMERGEANT DES SERVICES WEB, LES IMPLEMENTATIONS DE CEUX-CI SONT ENCORE EN COURS

Plus en détail

On appelle variable condition une var qui peut être testée et

On appelle variable condition une var qui peut être testée et Un concept plus général: g Variables condition On appelle variable condition une var qui peut être testée et endort le thread qui la teste si la condition est fausse le réveille quand la condition devient

Plus en détail

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface

Plus en détail

Les entrées/sorties Java (sérialisation, accès aux chiers et connexion réseau)

Les entrées/sorties Java (sérialisation, accès aux chiers et connexion réseau) Année 2008-2009 Les entrées/sorties Java (sérialisation, accès aux chiers et connexion réseau) Nicolas Baudru mél : nicolas.baudru@esil.univmed.fr page web : nicolas.baudru.perso.esil.univmed.fr 1 Introduction

Plus en détail

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki Institut Supérieur de Gestion Cours pour 3 ème LFIG Java Enterprise Edition Introduction Bayoudhi Chaouki 1 Java EE - Objectifs Faciliter le développement de nouvelles applications à base de composants

Plus en détail

2 Chapitre 1 Introduction

2 Chapitre 1 Introduction 1 Introduction Ce livre présente les Enterprise JavaBeans 2.0 et 1.1 qui constituent la troisième et la deuxième version de la spécification des Enterprise JavaBeans. Tout comme la plate-forme Java a révolutionné

Plus en détail

Gestion distribuée (par sockets) de banque en Java

Gestion distribuée (par sockets) de banque en Java Gestion distribuée (par sockets) de banque en Java Université Paris Sud Rappel sur la solution locale de gestion simple de banque L objet de cet exercice était de créer une application java qui implante

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 46 NFP111 Systèmes et Applications Réparties Cours 2 - Les appels de procédure distants (Partie 1) Claude Duvallet Université du Havre UFR Sciences et Techniques

Plus en détail

Exercices INF5171 : série #3 (Automne 2012)

Exercices INF5171 : série #3 (Automne 2012) Exercices INF5171 : série #3 (Automne 2012) 1. Un moniteur pour gérer des ressources Le moniteur MPD 1 présente une première version d'un moniteur, exprimé en pseudo-mpd, pour gérer des ressources le nombre

Plus en détail

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet TP Composants Java ME - Java EE Vous allez, dans ce TP, construire une architecture client serveur, plus précisément MIDlet cliente, servlet serveur. Pour cela, on va d'abord installer la partie serveur

Plus en détail

Java Message Service TD

Java Message Service TD labo-sun@supinfo.com Java Message Service TD Auteur : Frédéric Chuong Version n 0.1 20 octobre 2004 Nombre de pages : 8 Ecole Supérieure d Informatique de Paris 23. rue Château Landon 75010 PARIS www.supinfo.com

Plus en détail

Programmation répartie RPC & RMI

Programmation répartie RPC & RMI Programmation répartie RPC & RMI Plan du cours Introduction Définitions Problématiques Architectures de distribution Distribution intra-applications Notion de processus Programmation multi-thread Distribution

Plus en détail

Conception de serveurs d'applications ouverts

Conception de serveurs d'applications ouverts Conception de serveurs d'applications ouverts Stéphane Frénot 3 Un modèle d'exécution standard Application Stéphane Frénot 4 1 Répartition "horizontale" d'une application Application de Présentation Application

Plus en détail

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp Serveur d'application Client HTML/JS Apache Thrift Bootcamp Pré-requis La liste ci-dessous de logiciels doit être installée et opérationnelle sur la machine des participants : Compilateur thrift http://thrift.apache.org/

Plus en détail

Déclaration des mouvements de main-d œuvre par échange de données informatisées. Informations de mise en œuvre

Déclaration des mouvements de main-d œuvre par échange de données informatisées. Informations de mise en œuvre Ministère du Travail, des Relations sociales, de la Famille et de la Solidarité Déclaration des mouvements de main-d œuvre par échange de données informatisées Informations de mise en œuvre Mai 2008 1/11

Plus en détail

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre 2009. Enrica.Duchi@liafa.jussieu.fr

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre 2009. Enrica.Duchi@liafa.jussieu.fr . Cours intensif Java 1er cours: de C à Java Septembre 2009 Enrica DUCHI LIAFA, Paris 7 Enrica.Duchi@liafa.jussieu.fr LANGAGES DE PROGRAMMATION Pour exécuter un algorithme sur un ordinateur il faut le

Plus en détail

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework Gaël de Chalendar CEA LIST / LIC2M Journée de Présentation des Technologies WebContent INSTN 14/12/2009 Présentation de gsoap Plan

Plus en détail

Interactions audio sur le site web du LIA Documentation Technique

Interactions audio sur le site web du LIA Documentation Technique 2007 Interactions audio sur le site web du LIA Documentation Technique Projet 13 - IUP Avignon Master1 TAIM 28/05/2007 2 Projet 13 : Interactions audio sur le site web du LIA Sommaire Composants de l'application...

Plus en détail

Initiation à JAVA et à la programmation objet. raphael.bolze@ens-lyon.fr

Initiation à JAVA et à la programmation objet. raphael.bolze@ens-lyon.fr Initiation à JAVA et à la programmation objet raphael.bolze@ens-lyon.fr O b j e c t i f s Découvrir un langage de programmation objet. Découvrir l'environnement java Découvrir les concepts de la programmation

Plus en détail

JOnAS Day 5.1. Clustering

JOnAS Day 5.1. Clustering JOnAS Day 5.1 Clustering Solution complète de clustering Répartition de charge & bascule sur échec Application Web avec mod_jk/mod_proxy Connecteur http pour md_proxy Application Ejb avec CMIv2 Réplication

Plus en détail

PIGOURIER Vincent ANNEE SPECIALE 99/00 RAPPORT DE PROJET : LES THREADS JAVA. Responsable : Serge Rouveyrol

PIGOURIER Vincent ANNEE SPECIALE 99/00 RAPPORT DE PROJET : LES THREADS JAVA. Responsable : Serge Rouveyrol PIGOURIER Vincent ANNEE SPECIALE 99/00 RAPPORT DE PROJET : LES THREADS JAVA Responsable : Serge Rouveyrol 1 I -INTRODUCTION A L'UTILISATION DES THREADS...3 1 - Géneralités et propriétés des threads...3

Plus en détail

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets. Encapsulation L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets. La visibilité dépend des membres : certains membres peuvent être visibles et d'autres

Plus en détail

Figure 1. Structure répartie

Figure 1. Structure répartie Chapitre I: Applications Réparties et Middleware 1. Définition d une application répartie Une application répartie est constituée d un ensemble de processus (d objets, d agents, d acteurs) s exécutant

Plus en détail

Introduction aux Systèmes Distribués. Introduction générale

Introduction aux Systèmes Distribués. Introduction générale Introduction aux Systèmes Distribués Licence Informatique 3 ème année Introduction générale Eric Cariou Université de Pau et des Pays de l'adour Département Informatique Eric.Cariou@univ-pau.fr 1 Plan

Plus en détail

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object) Quelques patterns pour la persistance des objets avec DAO Ce cours présente des modèles de conception utilisés pour effectuer la persistance des objets Université de Nice Sophia-Antipolis Version 1.4 30/8/07

Plus en détail

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. fortier@lipn.univ-paris13.fr A308, Université de Paris 13

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. fortier@lipn.univ-paris13.fr A308, Université de Paris 13 WEBSERVICES Michael Fortier Master Informatique 2ème année fortier@lipn.univ-paris13.fr A308, Université de Paris 13 https ://lipn.univ-paris13.fr/ fortier/enseignement/webservices/ Sommaire 1 Rappels

Plus en détail

Université de Bourgogne - UFR Sciences et Technique - Programmation objet et Internet - LPSIL

Université de Bourgogne - UFR Sciences et Technique - Programmation objet et Internet - LPSIL Nom : Prénom : Contrôle continu Programmation objet Vous devez répondre dans les cadres aux questions posées. Documents de cours et notes personnelles autorisés. Téléphones portables, ordinateurs et calculatrices

Plus en détail

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry. : Java Agent DEvelopment framework Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.fr Introduction à la plateforme JADE 1) Modèle d agent 2) Services 3) Norme FIPA

Plus en détail

Chapitre 5 CORBA (Common Object Request Broker Architecture)

Chapitre 5 CORBA (Common Object Request Broker Architecture) DÉVELOPPEMENT D APPLICATIONS RÉPARTIES CORBA (Common Object Request Broker Architecture) Amen Ben Hadj Ali amenbha@hotmail.com ISI-L3SIL 2011-2012 Plan 2 Architecture CORBA Le langage IDL CORBA en Java

Plus en détail

Programmation Internet en Java

Programmation Internet en Java Chapitre 8 Programmation Internet en Java Vous avez déjà utilisé Internet, le plus connu des inter-réseaux mondiaux d ordinateurs et quelques-uns de ses services, en particulier le web et le courrier électronique.

Plus en détail

Programmation par composants (1/3) Programmation par composants (2/3)

Programmation par composants (1/3) Programmation par composants (2/3) Programmation par composants (1/3) La programmation par composant vise le développement de logiciel par aggrégation de briques logicielles existantes est indépendante de la POO La programmation par composant

Plus en détail

Le Distributed Computing Environment de OSF

Le Distributed Computing Environment de OSF 1 sur 6 Le Distributed Computing Environment de OSF Définition L'architecture de DCE L'organisation en cellules Comment former une cellule Les RPC sous DCE Le "stub" client Le RPCRuntime Le "stub" serveur

Plus en détail

Guide Pratique EDI NetBeans

Guide Pratique EDI NetBeans Guide Pratique EDI NetBeans Copyright 2005 Sun Microsystems, Inc. All rights reserved. Table des matières Assistant type de Projet EJB...2 Structure Module EJB...5 Ajout d'ejb, Fichiers et Bibliothèques

Plus en détail

SHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5

SHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 SHERLOCK 7 Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 Cette note montre comment intégrer un script Java dans une investigation Sherlock et les différents aspects de Java script. S T E M M E R I M A G I N

Plus en détail

TD2 Programmation concurrentielle

TD2 Programmation concurrentielle TD2 Programmation concurrentielle Développement Logiciel (L2-S4) Lundi 10 février 2014 Exercice 1 (Au bar...) Trois clients se trouvent au bar. Il est tard, ils sont fatigués, et ils s endorment sur le

Plus en détail