Remote Method Invocation : invocation de méthodes à distance.

Besoin

Standardiser la communication entre objets distants depuis Java.

Analyse

RMI est l'API de manipulation d'objets distribués (distants) en Java. Elle fournit une relative illusion de localité.

Conception

A partir de l'interface d'un objet distant à accéder sont générés :

  • une souche (stub) cliente qui codera les appels du client pour voyager sur le réseau.
  • un squelette (skeleton) serveur qui recevra et décodera les appels du client distant.

Les souches et skelettes pour accéder un tel objet sont générés par un outil.

L'objet serveur s'enregistre dans un annuaire afin d'être retrouvable par ses clients.

Les clients retrouvent l'objet distant et appellent ses méthodes via la souche installée de leur côté.

Implémentation

Tout objet Java publiant son interface pour des clients distants implémente java.rmi.Remote.

Les souches et skelettes sont générés par un compilateur RMI (rmic pour RMI Compiler) fournit dans le J2SDK.

L'objet serveur s'enregistre dans la RMI registry.

La seule différence dans les appels d'objets est que toute méthode est susceptible de lever une java.rmi.RemoteException.

RMI peut utiliser différents protocoles de transport entre des objets distants :

  • JRMP (Java Remote Method Protocol), conçu pour la communication entre objets Java uniquement et optimisé pour eux
  • IIOP (on parle alors de RMI/IIOP)
    • pour garantir l'interopérabilité avec d'autres systèmes (protocole standard)
    • communiquer avec des objets non Java (C++, etc.)
    • transporter des informations techniques telles que :
      • contexte de sécurité (identification éventuelle de l'appelant)
      • contexte transactionnel (transaction éventuellement associée à l'appel)

Notes

  • Inclus dans J2SE
  • Inclut la gestion implicitement distribuée
    • des exceptions (automatiquement propagées entre objets distants)
    • de la Garbage Collection
  • Livré avec le J2SDK et les outils :
    • rmic (RMI Compiler) pour générer les stubs et skeletons
    • rmiregistry, annuaire des objets distants publiés
    • rmid (RMI activation daemon)
  • RMI Version 1 Commentaire
    Release 1 2 3 4 5
    Domaine Technologie Fixpack 6 7 8 2
    Activation à distance Non Oui Permet de ne pas mobiliser inutilement des objets en mémoire.
    Fabrique de sockets personnalisables Non Oui Permet le changement de protocole (IIOP au lieu de JRMP, sécurisation via SSL par exemple)
    Pile d'exécution dans les RemoteExceptions Non Oui
    Envoi de chaines supérieures à 64 Ko Non Oui
    Outils rmic Oui
    -idl Non
    -iiop Non
    rmiregistry Oui
    rmid Non Oui
    java.rmi.activation.port Non Oui
    Propriétés système Standard java.rmi.dgc.leaseValue Oui
    java.rmi.server.codebase Oui
    java.rmi.server.hostname Oui
    java.rmi.server.logCalls Oui
    java.rmi.server. randomIDs Non Oui
    java.rmi.server. useCodebaseOnly Oui
    java.rmi.server. useLocalHostName Non Oui
    java.rmi.server. disableHttp Oui
    Propriétaires sun.rmi.server. suppressStackTraces Non Oui
    sun.rmi.activation. execTimeout Non Oui
    sun.rmi.activation. snapshotInterval Non Oui
    sun.rmi.log.debug Non Oui
    sun.rmi.rmid. maxstartgroup Non Oui
    sun.rmi.server.activation. debugExec Non Oui
    sun.rmi.dgc. checkInterval Oui
    sun.rmi.dgc.logLevel Oui
    sun.rmi.dgc.server. gcInterval Non Oui
    sun.rmi.loader.logLevel Non Oui
    sun.rmi.server. exceptionTrace Non Oui
    sun.rmi.transport. logLevel Oui
    sun.rmi.transport.tcp. localHostNameTimeOut Non O O O O O
    sun.rmi.transport.tcp. readTimeout Non Oui
    sun.rmi.dgc.cleanInterval Oui
    sun.rmi.dgc.client. gcInterval Non Oui
    sun.rmi.loader.logLevel Non Oui
    sun.rmi.server.logLevel Oui
    sun.rmi.transport. connectionTimeout Non Oui
    sun.rmi.transport. logLevel Oui
    sun.rmi.transport.proxy. connectTimeout Oui
    sun.rmi.transport.proxy. logLevel Oui
    sun.rmi.transport.tcp. logLevel Oui
    sun.rmi.dgc.ackTimeout Non Oui
    sun.rmi.transport.tcp. handshakeTimeout Non Oui
    Traces java.rmi.server.logCalls server-side remote calls and exceptions. Logger client sun.rmi.server.call
    sun.rmi.server.logLevel server-side remote reference activity. Logger client sun.rmi.server.ref
    sun.rmi.client.logCalls Non Oui client-side remote calls and exceptions. Logger client sun.rmi.client.call
    sun.rmi.client.logLevel client-side remote reference activity. Logger client sun.rmi.client.ref
    sun.rmi.dgc.logLevel distributed garbage collection activity. Logger client sun.rmi.dgc
    sun.rmi.loader.logLevel activity of default RMIClassLoader provider. Logger client sun.rmi.loader
    sun.rmi.transport. logLevel transport-layer activity. Logger client sun.rmi.transport
    sun.rmi.transport.tcp. logLevel TCP binding and connection activity. Logger client sun.rmi.transport.tcp
    sun.rmi.transport.proxy. logLevel HTTP tunelling activity. Logger client sun.rmi.transport.proxy

Voir