1 Présentation de RMI

Documents pareils
Remote Method Invocation (RMI)

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

RMI le langage Java XII-1 JMF

Calcul Parallèle. Cours 5 - JAVA RMI

Remote Method Invocation en Java (RMI)

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

Conception de serveurs d'applications ouverts

Intergiciel - concepts de base

Remote Method Invocation Les classes implémentant Serializable

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

Java Naming and Directory Interface

Programmation répartie RPC & RMI

Java - RMI Remote Method Invocation. Java - RMI

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

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

Java DataBaseConnectivity

Programmer en JAVA. par Tama

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

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

TP1 : Initiation à Java et Eclipse

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

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

Projet de programmation (IK3) : TP n 1 Correction

Auto-évaluation Programmation en Java

Threads. Threads. USTL routier 1

2 Chapitre 1 Introduction

Programmation Objet Java Correction

Applet pour visualiser les variables «automate» notifiées

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Premiers Pas en Programmation Objet : les Classes et les Objets

Projet gestion d'objets dupliqués

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

JOnAS Day 5.1. Clustering

Synchro et Threads Java TM

Création d une application JEE

as Architecture des Systèmes d Information

Développement Logiciel

Corrigé des exercices sur les références

Package Java.util Classe générique

Initiation à JAVA et à la programmation objet.

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

Derrière toi Une machine virtuelle!

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

Architecture applicative et Cartographie

Urbanisation des SI Conduite du changement IT 20/03/09. Patrick CHAMBET

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Présentation de Java. Olivier de Pertat IT GROUP

Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

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 )

J2EE - Introduction. Développement web - Java. Plan du chapitre

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

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

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Environnements de développement (intégrés)

OpenPaaS Le réseau social d'entreprise

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

Création d un service web avec NetBeans 5.5 et SJAS 9

Web Tier : déploiement de servlets

La JVM. La machine virtuelle Java. La JVM. La JVM

Programmation Par Objets

Programmation par les Objets en Java

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)

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Bases Java - Eclipse / Netbeans

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

Plan. Department of Informatics

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

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

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

Java Licence Professionnelle CISII,

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

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

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

Java 1.5 : principales nouveautés

Java c est quoi? Java pourquoi?

ACTIVITÉ DE PROGRAMMATION

Systèmes répartis. Fabrice Rossi Université Paris-IX Dauphine. Systèmes répartis p.1/49

Chapitre 10. Les interfaces Comparable et Comparator 1

INITIATION AU LANGAGE JAVA

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Plan du cours. Historique du langage Nouveautés de Java 7

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

Manuel d implémentation des Web Services Sous Axis1 et Axis2/Tomcat/linux. Par Pr Bouabid EL OUAHIDI

TP Programmation Java / JDBC / Oracle

Introduction au langage Java

JAVA. Introduction à la programmation objet avec java 1/4. Nadir BOUSSOUKAIA

Corrigés des premiers exercices sur les classes

JOnAS 5. Serveur d application d

Java avancé Objectifs. version support 1.2

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

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

Etude critique de mécanismes de sécurité pour l architecture Jini

Composants Logiciels. Le modèle de composant de CORBA. Plan

Transcription:

La technologie RMI Table des matières 1 Présentation de RMI 1 2 Déployer des objets serveurs 2 2.1 Spécification de la couche métier................................... 2 2.2 Fourniture d une implantation..................................... 3 2.3 La classe UnicastRemoteObject................................... 3 2.4 Architecture client/serveur...................................... 4 2.5 Génération des classes d interface................................... 4 2.6 Registre d inscription RMI....................................... 5 2.6.1 Nommage des objets distribués................................ 5 2.6.2 La classe java.rmi.naming................................. 6 3 Accès aux objets distribués 6 3.1 Architecture des serveurs RMI.................................... 7 3.2 Passage de paramètres........................................ 7 3.3 Création de nouveaux objets..................................... 8 4 Aller plus loin 8 4.1 Le ramasse miettes distribué..................................... 8 4.2 Chargement dynamique de classes.................................. 9 4.3 Implanter une politique de sécurité.................................. 9 4.4 Autres fonctions des RMI....................................... 9 1 Présentation de RMI RMI = Remote Method Invocation (appel de procédures à distance). RMI est basé sur IP, TCP, JRMP (pour Java Sun), RMI-IIOP (interopérabilité CORBA), Objectifs : Simple (les aspects réseau sont transparents), Développement d une couche métier, Architecture n-tiers, Mise en place de bus logiciels, Note : La technologie RMI est une solution simple pour implanter un bus logiciel. Il existe néanmoins deux inconvénients : 1

Le premier est lié au fait que cette technologie n est supportée que par Java. Elle ne peut donc pas être utilisée pour réaliser un serveur métier multi-plateforme. Les différents ponts logiciels vers CORBA ou DCOM réduisent un peu cet inconvénient. Le second est lié à la lenteur relative de cette technologie due notamment à la sérialisation des paramètres. 2 Déployer des objets serveurs Le déploiement d un objet serveur est réalisé en cinq étapes : Spécification de l interface du service distant. Rédaction d un implantation. Préparation d un annuaire RMI. Création d une instance de l objet serveur. Inscription de cette instance dans l annuaire RMI. 2.1 Spécification de la couche métier Spécification du javabean permettant de représenter une voiture : package car.service; import java.io.serializable; public class Car implements Serializable { private static final long serialversionuid = 1L; private int number; private String model; public int getnumber() { return number; public void setnumber(int number) { this.number = number; public String getmodel() { return model; public void setmodel(string model) { this.model = model; et la spécification d une usine à voiture : package car.service; import java.rmi.remote; import java.rmi.remoteexception; public interface ICarFactory extends Remote { Car newcar() throws RemoteException; int carcounter() throws RemoteException; 2

Note : La définition d un objet serveur se fait en deux temps. On commence par définir l interface accessible au client puis on passe à la réalisation. Les interfaces RMI ont une seule contrainte à respecter : les méthodes doivent pouvoir générer une erreur réseau. En effet, personne ne peut garantir l absence d erreur quand on passe par une couche réseau. 2.2 Fourniture d une implantation Contraintes : étendre la classe UnicastRemoteObject traiter les erreurs d exécution, package car.server; import java.rmi.remoteexception; import java.rmi.server.unicastremoteobject; import java.rmi.server.unreferenced; import car.service.car; import car.service.icarfactory; public class CarFactoryImpl extends UnicastRemoteObject implements ICarFactory { private static final long serialversionuid = 1L; private final String model; private int counter = 0; public CarFactoryImpl(String model) throws RemoteException { super(); this.model = model; public Car newcar() { Car c = new Car(); c.setmodel(model); c.setnumber(++counter); return c; public int carcounter() { return counter; 2.3 La classe UnicastRemoteObject Quelques méthodes de java.rmi.server.unicastremoteobject 1 : UnicastRemoteObject() Exportation de l objet this. exportobject(remote obj) Exporter un objet distant. exportobject(remote obj, int port) Exporter un objet distant sur un port spécifié. unexportobject(remote obj, boolean force) 3

défaire une exportation. getclienthost() pour obtenir le nom du client. getlog()/setlog(outputstream out) générer une trace de l utilisation de l objet. Note : Il est fortement conseillé de lire attentivement la JavaDoc de cette classe. 2.4 Architecture client/serveur Organisation des JVM clients et serveur : JVM Client stub JVM Serveur skel clt 1 srv 1 stub clt 2 skel srv 2 JVM Client clt 3 stub Note : Dans une application RMI les objets clients accèdent aux méthodes des objets serveurs de manière tout à fait naturelle. Les objets clients travaillent comme si les objets serveurs étaient dans la même JVM. De la même manière, les objets serveur ont l impression d être utilisés par des clients situés dans la même JVM. Dans la pratique, les objets clients dialoguent avec des objets «stub» qui se chargent des transmissions réseau. De l autre coté les «skel» reçoivent les requêtes et les retransmettent vers les objets serveur. Moralité : les classes serveurs et clients sont débarrassés de la tâche réseau. Leur travail est donc plus simple. 2.5 Génération des classes d interface Génération automatique des «stub» et «skel» avec $ rmic nom_de_la_classe_d implantation exemple : $ rmic -classpath classes/ -d classes/ rmisample.carfactoryimpl Production des classes : 4

rmisample/carfactoryimpl Stub.class rmisample/carfactoryimpl Skel.class Note : Le compilateur RMI ( rmic ) se charge de générer automatiquement les classes stub et skel à partir de la définition des classes serveur. N oubliez pas de lire le manuel de rmic (http://docs.oracle.com/javase/8/docs/technotes/tools/solaris/rmic.html). Important : depuis la version 1.4 la création des classes skel n est plus nécessaire. Depuis la version 1.5 la création des classes skel et stub n est plus nécessaire. Des Proxies assurent automatiquement l envoie et la réception des requêtes. 2.6 Registre d inscription RMI Le lancement des serveurs doit être précédé par la mise en place d un registre RMI. Le but d un registre RMI est d offrir un annuaire des objets serveurs disponibles en associant, à chaque objet serveur, un nom. $ rmiregistry & Autre solution, le code de lancement des serveurs assure la mise en place d un registre : java.rmi.registry.locateregistry.createregistry(1099);... code de lancement des serveurs... Un registre est un objet distant qui peut être récupéré via la classe LocateRegistry et interrogé : java.rmi.registry.registry r = LocateRegistry.getRegistry("monserveur", 1099) ; String[] name = r.list(); Note : N oubliez pas de lire le manuel d utilisation de la commande rmiregistry. (http://docs.oracle.com/javase/8/docs/technotes/tools/solaris/rmiregistry.html) 2.6.1 Nommage des objets distribués Code du lancement du serveur RMI : 5

package car.server; import java.rmi.registry.locateregistry; import java.rmi.registry.registry; public class CarFactoryServer { public static void main(string[] args) { try { // create a RMI registry Registry r = LocateRegistry.createRegistry(1099); // create and publish car factory server object CarFactoryImpl meganefactory = new CarFactoryImpl("Megane"); r.rebind("carfactory", meganefactory); System.err.println("CarFactoryServer is running."); catch (Exception e) { e.printstacktrace(); Pour publier un service RMI sur un annuaire indépendant situé sur une autre machine vous pouvez utiliser : java.rmi.naming.bind("rmi://nom-de-l-annuaire-rmi/carfactory", meganefactory); L URL est de la forme (le port est optionnel) : rmi://nom_du_serveur_rmi:numéro_de_port/nom_d_objet Le port par défaut est 1099. Note : Pour que les objets serveur soient utilisables, nous devons les créer et les publier en leur donnant un nom. Les clients pourront ensuite utiliser ce nom pour retrouver ces objets. Ce nom va être déposé dans un annuaire. 2.6.2 La classe java.rmi.naming Quelques méthodes de java.rmi.naming 2 : bind(string name, Remote obj) Nommage de l objet distant et introduction dans le registre RMI. rebind(string name, Remote obj) Remplacement d objet dans le registre RMI. Remote lookup(string name) Recherche un objet distant dans le registre RMI. unbind(string name) Supprimer l association. 3 Accès aux objets distribués Le code est indépendant de la nature et de la localisation des objets : 6

package car.client; import java.rmi.naming; import java.rmi.registry.locateregistry; import java.rmi.registry.registry; import car.service.car; import car.service.icarfactory; public class Client { public static void main(string[] args) throws Exception { String url = "rmi://annuaire-rmi/carfactory"; ICarFactory carfactory = (ICarFactory) Naming.lookup(url); Car c = carfactory.newcar(); System.out.println("car model : " + c.getmodel()); System.out.println("car number : " + c.getnumber()); System.out.println("cars counter : " + carfactory.carcounter()); 3.1 Architecture des serveurs RMI Pour résumer, il existe trois types de machines : les registres RMI : ils sont connus des serveurs et des clients, les serveurs RMI : ils ne sont connus de personne et ils se déclarent auprès du registre (méthode bind ), les clients RMI : ils recherchent les objets distants auprès du registre (méthode lookup ). machine "annu rmi" Annuaire RMI lookup("rmi://annu rmi/voiture") bind("rmi://annu rmi/voiture", voiture) JVM Client protocole RMI Serveur "voiture" 3.2 Passage de paramètres Étude de cas : Les types primitifs sont passés par valeur. Les objets non distants sont passés par valeur. Ils doivent donc être sérialisables (implanter l interface java.io.serializable ). Pour les objets distants, une référence est passée vers le «skel» distant ( java.rmi.server.remoteref ). Le code utilisateur récupère une référence vers la classe «stub» qui implante l interface initiale. Note : Bien entendu, la JavaDoc 3 reste indispensable. 3. http://docs.oracle.com/javase/8/docs/api/java/rmi/server/remoteref.html 7

3.3 Création de nouveaux objets Un client ne peut créer un nouvel objet distant. Par contre un serveur peut créér un nouvel objet et renvoyer sa référence distante au client :... public class CarFactoryImpl extends UnicastRemoteObject implements ICarFactory {... public ICarFactory newfactory(string model) throws RemoteException { CarFactoryImpl v = new CarFactoryImpl(model); return v; Note : Il faut remarquer que cette nouvelle usine n a pas d URL. Ou, en d autres termes, elle n est pas inscrite dans un annuaire RMI. En fait, cette usine est uniquement accessible via la référence distante renvoyée par la méthode newfactory. 4 Aller plus loin 4.1 Le ramasse miettes distribué Les objets distants non référencés sont automatiquement supprimés du serveur. Ils peuvent en être informé par : package car.server; import java.rmi.remoteexception; import java.rmi.server.unicastremoteobject; import java.rmi.server.unreferenced; import car.service.car; import car.service.icarfactory; public class CarFactoryImpl extends UnicastRemoteObject implements ICarFactory, Unreferenced {... public void unreferenced() { System.out.println("plus de référence pour l usine de " + model); Les objets placés dans un registre RMI sont toujours référencés. La fréquence de nettoyage du DGC est réglable via une propriété : java -Djava.rmi.dgc.leaseValue=10000 fr.monserveur 8

Note : Comme dans le cas de l usine précédente, il arrive qu un objet serveur devienne inutile. C est le cas quand aucun client ne possède de référence distante vers ce serveur. 4.2 Chargement dynamique de classes Partons du principe que le code Java est rangé sur un serveur WEB à l adresse http://monserveur.fr/test/ Le lancement du serveur devient : java -Djava.rmi.server.codebase=http://monserveur.fr/test/ fr.monserveur Attention : le / à la fin est important. Note : Ce mécanisme est très important car, dans les exemples précédents, nous sommes partis du principe que le client a accès aux classes Car et ICarFactory. Si tel n est pas le cas, alors le client peut automatiquement télécharger le code Java de ces classes. 4.3 Implanter une politique de sécurité Pour empêcher les chargements de code dangereux en provenance de machine inconnue : System.setSecurityManager(new SecurityManager()); java.rmi.naming.bind("rmi://localhost/carfactory", new CarFactoryImpl());... ou bien : java -Djava.security.policy=./java.policy fr.monserveur Note : Vous devez lire la Javadoc 4 de la classe RMISecurityManager qui implante la stratégie de sécurité. Note : Pour rédiger le fichier java.policy, vous devez lire le document de description des permissions : http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html 4.4 Autres fonctions des RMI Quelques possibilités : Les «callbacks» distants. L utilisation d annuaire JNDI pour associer des noms à des objets. L interopérabilité avec CORBA, c est à dire la mise en place d une passerelle pour appeler des objets CORBA à partir de client Java ; appeler des objets RMI à partir de client CORBA. 4. http://docs.oracle.com/javase/8/docs/api/java/rmi/rmisecuritymanager.html 9

L encapsulation du protocole RMI dans des connexions HTTP et/ou SSL. L activation dynamique d objets. 10