Cours: BD et Environnement Distribuées

Documents pareils
Remote Method Invocation (RMI)

RMI le langage Java XII-1 JMF

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

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Conception de serveurs d'applications ouverts

Calcul Parallèle. Cours 5 - JAVA RMI

Remote Method Invocation Les classes implémentant Serializable

Remote Method Invocation en Java (RMI)

Programmation répartie RPC & RMI

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

Généralités sur le Langage Java et éléments syntaxiques.

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Projet gestion d'objets dupliqués

Synchro et Threads Java TM

Java DataBaseConnectivity

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Chapitre 10. Les interfaces Comparable et Comparator 1

Intergiciel - concepts de base

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

INITIATION AU LANGAGE JAVA

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

TP1 : Initiation à Java et Eclipse

Programmation réseau avec Java. 3/7 RMI, un peu de sécurité et CORBA

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Java Naming and Directory Interface

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Projet de Veille Technologique

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

Chapitre 2. Classes et objets

Maîtriser le menu contextuel dans un OfficeBean

Java - RMI Remote Method Invocation. Java - RMI

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

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

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)

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Initiation à JAVA et à la programmation objet.

MOTEUR DE WORKFLOW Mise en oeuvre d'openwfe Version septembre 2006

Création d une application JEE

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Application web de gestion de comptes en banques

EXA1415 : Annotations

Programmation par les Objets en Java

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

Modèle client-serveur Plan. Modèle client-serveur. Modèle client-serveur définition. Modèle client-serveur communication par messages.

Héritage presque multiple en Java (1/2)

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmer en JAVA. par Tama

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Java 7 Les fondamentaux du langage Java

Tutoriel - flux de facturation

Programmation Par Objets

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

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

Hyper-V et SC Virtual Machine Manager sous Windows Server 2008 R2

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

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Présentation du PL/SQL

2 Grad Info Soir Langage C++ Juin Projet BANQUE

OpenPaaS Le réseau social d'entreprise

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Développement, déploiement et sécurisation d'applications JEE

Compte-rendu de projet de Système de gestion de base de données

Création d'une nouvelle base de données

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

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

Sage CRM. 7.2 Guide de Portail Client

Un ordonnanceur stupide

DirXML License Auditing Tool version Guide de l'utilisateur

Didacticiel de mise à jour Web

InfraCenter Introduction

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

AGRÉGATION «ÉCONOMIE ET GESTION»

Corrigé des exercices sur les références

Auto-évaluation Programmation en Java

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

2 Chapitre 1 Introduction

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Chapitre 5 : Les procédures stockées PL/SQL

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Architecture Orientée Service, JSON et API REST

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une application

La gestion des exceptions

Sage 100 CRM - Guide d installation Version Mise à jour : 2015 version 8

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

Projet Viticulture - TP 3 : bases de données distantes BTS Services informatiques aux organisations

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

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

1. Installation d'un serveur d'application JBoss:

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

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Activation de la licence

Notion de thread (1/2)

TP1. Outils Java Eléments de correction

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Programmation Objet - Cours II

TP Programmation Java / JDBC / Oracle

Didacticiel des serveurs de bases de données

Implementing a simple RMI Application over the Internet (using and comparing HTTP tunneling, RMI Proxy)

Transcription:

UNIVERSITÉ DE BOURGOGNE UFR Sciences et Techniques Cours: BD et Environnement Distribuées TP 1 - Illustration des concepts objets distribués avec Java-RMI Préparé par: MATTA Elie et al. Copyright 2010-2011, eliematta.com. All rights reserved

Table des matières Exercices 2: Programme de simulation de gestion de compte bancaires... 4-1 ère Question : Problème de concurrence... 4-2 ème Question : "ObjectFactory"... 5 A) Classe Interface ICompte... 5 B) Class CompteImpl... 6 C) Architecture de l'implémentation de l'objectfactory... 6 D) Class Serveur... 7 E) Class Client... 7 F) Workflow de l'implementation de l'objectfactory... 8-3 ème Question : Serveur arrêté... 9-4 ème Question : Utilisation du package "activation"... 9 A) Implementation de l'objet activable à distance... 10 B) Implémentation du programme d'enregistrement (Setup)... 10 C) Experimentation par un test sur l'activation... Error! Bookmark not defined. - 5 ème Question : Utilité des références persistantes du mécanisme d'activation... Error! Bookmark not defined. Exercice 4 : Objet Persistant... Error! Bookmark not defined. - 1 ère Question : Mise en place de la base de données... Error! Bookmark not defined. A) Création de la base de données... Error! Bookmark not defined. B) Connexion à la base de donnée... Error! Bookmark not defined. C) Interrogation de la base de donnée... Error! Bookmark not defined. D) Déconnexion à la base de donnée... Error! Bookmark not defined. - 2 ème Question : Concurrence et synchronisation... Error! Bookmark not defined. A) Exemple solution au niveau du SGBD... Error! Bookmark not defined. B) Solution au niveau java... Error! Bookmark not defined. - 3 ème Question : Règles simples avec persistance... Error! Bookmark not defined. - 4 ème Question : Autres méthodes de résolution de l'exercice 2... Error! Bookmark not defined. Annexe... Error! Bookmark not defined. Section 1... Error! Bookmark not defined. Copyright 2010-2011, eliematta.com. All rights reserved Page 2

Interface ICompteFonctions:... Error! Bookmark not defined. Classe CompteFonctionsImpl... Error! Bookmark not defined. Classe Client... Error! Bookmark not defined. Section 2... Error! Bookmark not defined. Interface ICompte... Error! Bookmark not defined. Interface ICompteFonctions... Error! Bookmark not defined. Classe CompteFonctionsImpl... Error! Bookmark not defined. Classe CompteImpl... Error! Bookmark not defined. Classe Serveur... Error! Bookmark not defined. Classe Client... Error! Bookmark not defined. Section 3 (Quelques classe/interface utilisent ceux de la Section 2)... Error! Bookmark not defined. Interface ICompteActivatableImpl... Error! Bookmark not defined. Classe SetupActivCompte... Error! Bookmark not defined. Section 4 :... Error! Bookmark not defined. Classe Compte... Error! Bookmark not defined. Create SQL... Error! Bookmark not defined. Références... Error! Bookmark not defined. Copyright 2010-2011, eliematta.com. All rights reserved Page 3

Exercices 2: Programme de simulation de gestion de compte bancaires On va développer dans cet exercice, une application qui gère la manipulation d'un compte bancaire avec plusieurs clients en même temps. Ainsi, on a diviser notre architecture en de la façon suivante: Interfaces: ICompteFonctions qui définit les fonctions que le client peut utiliser. Classes: 1. Client, qui consiste a créer un instance a l'interface et de manipuler le compte courant. 2. Serveur, qui établie la connexion pour que le client puisse se connecté. Il est utile de mentionner les package les plus utiliser dans cet exercice: java.rmi : pour accéder a des objets distants java.rmi.server : pour créer des objets distants java.rmi.registry : lié a la localisation et au nommage des objets distants On peut mentionner les classes utiles fournies par java.rmi (1) : Naming : sert de représentant local du serveur de noms. Permet d utiliser les méthodes bind(), rebind(), lookup(), unbind(), list() LocateRegistry : permet de localiser un serveur de noms (rmiregistry) et éventuellement d en créer un. - 1 ère Question : Problème de concurrence Apres avoir exécuter le programme, on a essayer de créditer le solde de 100 en utilisant le client 1, puis créditer de nouveau le solde de 50 en utilisant le client 2. On a obtenu le résultat montré ci-dessous. Figure 1 - Crediter le solde Donc on remarque que le solde courant est de 50, ce qui est faux car notre programme n'a pas pris en compte la cohérence des données. Alors le solde étant accédé simultanément par plusieurs client en même temps pose un problème de synchronisation car Java RMI ne prend pas initialement charge de la concurrence. Copyright 2010-2011, eliematta.com. All rights reserved Page 4

Une solution pour ce problème est d'ajouter "synchronized" pour permettre au client de manipuler l'état de l'objet créer par le serveur (2), alors l'objet sera verrouillé avant qu'un autre client puisse changer cet objet. Alors on ajoute "synchronized" au fonction créditer, débiter et afficher comme montré cidessous, le reste du code est inclus dans la section 1 de l'annexe: public synchronized void crediter(double newsolde) throws java.rmi.remoteexception { solde = solde + newsolde; System.out.println("Une somme de " +newsolde+ "a été credité"); } Figure 2 - Fonction crediter avec "synchronized" - 2 ème Question : "ObjectFactory" Pour réaliser une application qui gère plusieurs instances de compte en même temps, on doit trouver une solution pour la duplication pour un même objet. Une solution pour ce problème est d'utiliser le paterne de développement "ObjectFactory" qui nous permet de créer des instances d'une classe sur le serveur. Pour implémenter l'objectfactory, on doit au début créer la classe avec l'interface qui doit nous fabriqué cet objet : A) Classe Interface ICompte import java.rmi.*; public interface ICompte extends Remote{ ; public ICompteFonctions newcompte(double solde) throws RemoteException Figure 3 - Interface ICompte Copyright 2010-2011, eliematta.com. All rights reserved Page 5

B) Class CompteImpl import java.rmi.server.*; import java.rmi.*; public class CompteImpl extends UnicastRemoteObject implements ICompte { private double solde; public CompteImpl() throws RemoteException{ } public ICompteFonctions newcompte(solde) throws RemoteException{ return new CompteFonctionsImpl(solde); } } Figure 4 - Class CompteIml C'est utile de mentionner que l'utilisation de "new" n'est pas efficace chez l'utilisateur car elle crée l'instance de la classe dans la mémoire locale du client. C'est pourquoi on a explicitement créer une interface contenant la fonction newcompte et l'implémenter dans la classe CompteImpl pour l'avoir retourner une nouvelle instance (qui sera crée sur le serveur) de la class CompteFonctionsImpl qui contient les fonctions principales que le client peut utiliser, d'où l'architecture suivante: C) Architecture de l'implémentation de l'objectfactory <<interface>> Remote <<interface>> ICompte +ICompteFonctions newcompte(double solde) <<UnicastRemoteObject>> <<interface>> ICompteFonctions +crediter(double solde) +debiter(double solde) +afficher() CompteImpl +ICompteFonctions newcompte(double solde) CompteFonctionsImpl +crediter(double solde) +debiter(double solde) +afficher() Copyright 2010-2011, eliematta.com. All rights reserved Page 6

Les classes distantes CompteImpl et CompteFonctionImpl implementent les interfaces ICompte et ICompteFonctions qui étendent l'interface "Remote" distante. Les classes distantes CompteImpl et CompteFonctionsImpl doivent étendre la classe UnicastRemoteObject. Par suite il nous reste de lancer le Serveur pour faire connecter le client: D) Class Serveur import java.rmi.*; public class Serveur { public static void main (String [ ] argv) { System.setSecurityManager (new RMISecurityManager ()) ; //Initialiser SecurityManager try { String objet = "tpexdeux"; CompteImpl ci= new CompteImpl(); Naming.rebind (objet, ci) ; System.out.println ("Serveur lancé") ; } catch (Exception e) { System.out.println ("Erreur du serveur : " + e) ; } } } E) Class Client Figure 4 - Class Serveur import java.rmi.*; public class Client { public static void main (String [ ] argv) { System.setSecurityManager (new RMISecurityManager ()); //Initialiser SecurityManager try { ICompte InterfaceCompte =(ICompte) Naming.lookup("rmi://localhost/tpexdeux"); client1 = InterfaceCompte.newCompte(100); client2= InterfaceCompte.newCompte(200); client1.crediter(100); //Ajout de 100 au compte client2.debiter(50); //Retrait 50 du compte client1.afficher(); } catch (Exception e) { System.out.println ("Erreur client : " + e) ; } } } Figure 4 - Class Client Copyright 2010-2011, eliematta.com. All rights reserved Page 7

Interfaces: 1. ICompte: Définit la fonction newcompte. 2. ICompteFonctions : Définit les fonctions créditer, débiter et afficher. Classes: 1. Client : Créer des instances des comptes pour les gérer. 2. Serveur : Créer l'objet et l'enregistré dans RMIRegistry. 3. CompteFonctionsImpl : Implémente l'interface ICompteFonctions et ainsi redéfinit les fonctions que le client peut utiliser. 3. CompteImpl : Implemente l'interface ICompte et redéfinit la fonction principal newcompte. Le reste du code en mentionner dans la section 2 du l'annexe. En implémentant notre code on peut ainsi obtenir le workflow suivant (1) : F) Workflow de l'implementation de l'objectfactory Registry rebind (objet, new..) Serveur InterfaceCompte = lookup(..) Client InterfaceCompte.newCompte(..) réference de l'objet creer CompteImpl Creer InterfaceCompte en utilisant new Client 1 Client 2 clien1.crediter(..) client2.debiter(..) Figure 4 - WorkFlow de l'implementation de l'objectfactory Copyright 2010-2011, eliematta.com. All rights reserved Page 8

Donc le Client demande de creer un nouveau compte, alors une instance d'un nouveau objet sera creer et sera enregistré dans le rmiregistry, puis le client recevera la reponse par la methode de lookup. - 3 ème Question : Serveur arrêté Lors de l'arrêt du serveur, tous les instances des objets créer seront détruites alors les comptes seront mis à zéro de nouveau. Une solution pour ce problème est de lancer un trigger qui sauvegarde les changements qui sont émis par le client, et le solde courant. - 4 ème Question : Utilisation du package "activation" Le package java.rmi.activation contient les interfaces, classes, et les exceptions qui représentent le système d'activation RMI, introduites dans Java 2. Ce service RMI nous permet de définir des objets distants qui ne sont pas instanciés sur le serveur jusqu'à ce qu'une demande du client déclenche leur activation. Le système d'activation prend charge de spécifier la manière dont un objet distant est activé/désactivé et comment les objets activé sont regroupés dans les JVM. L'activation prend également en charge la persistance des références à distance, ou en d'autres termes, les références à des objets distants qui peuvent persister au-delà de la durée de vie d'un objet serveur individuel (3). D'ou l'hiérarchie suivante: Figure 5 - Activation Workflow (4) Depuis JDK1.2, le démon rmid active les objets à la demande ou au reboot de la machine. Copyright 2010-2011, eliematta.com. All rights reserved Page 9

Implementation: A) Implementation de l'objet activable à distance D'abord, on doit suivre les etapes suivantes pour l'utilisation du package java.rmi.actionation (5) : La classe d un objet activable doit dériver de Activatable. La classe doit déclarer un constructeur à 2 arguments : java.rmi.activation.activationid : C'est un identificateur pour les objets activable a distances. Lorsqu'une application enregistre un descripteur d'activation avec rmid, rmid lui attribue un ID d'activation, qui se réfère à l'information associée avec le descripteur. Cet ID d'activation même (également contenus dans stub de l'objet distant) est passée au constructeur lors de l'activation de l'objet distant java.rmi.marshalledobject : contient les données d'initialisation qui sont déjà enregistrés avec des rmid. Notre programme ne nécessite pas de données d'initialisation pour construire l'objet distant. Alors on crée une nouvelle classe "ICompteActivatableImpl" qui dérive de la classe "Activatable" et qui implémente l'interface ICompteFonctions. Puis on a créer u constructeur qui prend deux arguments, cette classe va nous aider à déclarer une nouvelle instance durant le processus de l'activation, elle vas appeler un constructeur de la superclasse (activatable) pour exporter l'objet, d'où la figure ci-dessous: import java.rmi.*; import java.rmi.activation.*; public class ICompteActivatableImpl extends Activatable implements ICompteFonctions { public ICompteActivatableImpl(ActivationID id, MarshalledObject mo) throws java.rmi.remoteexception { super(id, 0); double solde; System.out.println("ICompteActivatableImpl est activé comme ayant l'id = "+id); } } Figure 6 - Class ICompteActivatableImpl B) Implémentation du programme d'enregistrement (Setup) Le rôle du setup c'est de passer l'information nécessaire à l'activation de l'objet activable au démon rmid (qui active une JVM par groupe) puis enregistrer l'objet auprès de rmiregistry. Cette classe va aussi enregistrer un descripteur "activation descriptor" avec rmid pour permettre aux objet suivantes d'être activés en utilisant ce dernier. Après que rmid a activé une JVM, on aura intérêt a utilisé les objets suivants: Copyright 2010-2011, eliematta.com. All rights reserved Page 10

Copyright 2010-2011, eliematta.com. All rights reserved Page 11