Tout sur le registre Java RMI et comment l'utiliser

Tout sur le registre Java RMI et comment l'utiliser

IRM signifie appel de méthode à distance et, comme son nom l'indique, est un protocole permettant à un programme Java d'invoquer une méthode d'un objet s'exécutant sur un autre ordinateur. Il fournit une API (Application Programming Interface) pour exporter un objet à partir d'un programme (appelé serveur) et invoquer les méthodes de cet objet à partir d'un autre programme (appelé client), éventuellement exécuté sur un autre ordinateur.





Le Java Registre RMI est un composant clé du système Java RMI et fournit un répertoire centralisé permettant aux serveurs d'enregistrer des services et aux clients de rechercher ces services. Dans cet article, nous apprenons à implémenter un serveur pour exposer un objet et un client pour appeler une méthode sur le serveur, ainsi qu'à enregistrer et rechercher le service dans le registre RMI.





comment enregistrer un appel sur votre iphone

Déclaration de l'interface serveur

Pour découvrir les subtilités du fonctionnement du système Java RMI, implémentons un objet serveur simple fournissant une méthode pour accepter un nom et renvoyer un message d'accueil. Voici la définition de l'interface objet :





import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Greeting extends Remote
{
public String greet(String name) throws RemoteException;
}

Le nom de l'interface s'appelle Salutation . Il fournit une méthode unique appelée saluer() qui accepte un nom et renvoie un message d'accueil approprié.

Pour marquer cette interface comme exportable, elle doit étendre la java.rmi.Remote interface. De plus, la méthode doit déclarer un jette liste des clauses java.rmi.RemoteException en plus de toutes les exceptions spécifiques à l'application. C'est ainsi que le code client peut gérer (ou propager) les erreurs d'appel de méthode à distance telles que Hébergeur non trouvé , Échec de connexion , etc.



Implémentation de l'objet serveur

Après avoir déclaré l'interface (qui est utilisée par les clients), nous implémentons l'objet côté serveur et fournissons le saluer() méthode comme indiqué. Il utilise une chaîne de formatage simple pour formater le message d'accueil.

public class GreetingObject implements Greeting
{
private String fmtString = 'Hello, %s';
public String greet(String name)
{
return String.format(this.fmtString, name);
}
}

La méthode principale du serveur

Rassemblons maintenant tous ces éléments et mettons en œuvre les principale() méthode du serveur. Passons en revue chacune des étapes pertinentes.





  • La première étape consiste à créer l'implémentation de l'objet serveur. |_+_|
  • Ensuite, nous obtenons un stub pour l'objet serveur à partir du runtime RMI. Le stub implémente la même interface que l'objet serveur. Cependant, le procédé implémente la communication requise avec l'objet serveur distant. Ce stub est utilisé par le client pour invoquer de manière transparente la méthode sur l'objet serveur. |_+_|
  • Une fois le stub obtenu, nous le remettons au registre RMI pour le lier à un service nommé spécifié. Lorsque le client demande une implémentation de ce service, il reçoit le stub qui sait communiquer avec l'objet serveur. Dans la suite, la méthode statique LocateRegistry.getRegistry() est utilisé pour obtenir la référence du registre local. Les relier() La méthode est ensuite utilisée pour lier le nom au stub. |_+_|

La méthode principale complète.

Greeting greeting = new GreetingObject();

Construire le serveur

Voyons maintenant la construction du serveur. Pour garder les choses simples, nous construisons en utilisant la ligne de commande sur Linux plutôt qu'en utilisant un outil de construction tel que Maven.





Ce qui suit compile les fichiers source en fichiers de classe dans un répertoire cible.

Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);

Collectez les fichiers de classe dans un fichier JAR pour exécution.

String name = 'Greeting';
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);

Nous collectons également les fichiers d'interface nécessaires à la compilation du client dans un JAR de bibliothèque.

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class Main
{
static public void main(String[] args) throws Exception
{
if ( args.length == 0 ) {
System.err.println('usage: java Main port#');
System.exit(1);
}
int index = 0;
int port = Integer.parseInt(args[index++]);
String name = 'Greeting';
Greeting greeting = new GreetingObject();
Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);
System.out.println('Greeting bound to '' + name + ''');
}
}

Implémentation du client

Voyons maintenant comment implémenter le client utilisé pour invoquer les méthodes d'objet serveur.

  • Comme pour le serveur, obtenez une référence au registre, en spécifiant le nom d'hôte sur lequel le registre s'exécute et le numéro de port. |_+_|
  • Ensuite, recherchez le service dans le registre. Les chercher() La méthode renvoie un stub qui peut être utilisé pour invoquer des services. |_+_|
  • Et invoquez la méthode en passant les arguments requis. Ici, nous obtenons le message d'accueil en passant le nom et en l'imprimant. |_+_|

Le code client complet :

rm -rf target
mkdir target
javac -d target src/server/*.java

Le Registre du RMI

Exécutons maintenant le programme serveur afin qu'il puisse commencer à traiter les requêtes.

jar cvf target/rmi-server.jar -C target server

Quel est cette exception ? Connexion rejetée .

La raison pour laquelle vous obtenez cette exception est la suivante : notez dans le code du serveur qu'il tente de se connecter au registre local sur le port 1099. Si cela échoue, vous vous retrouvez avec cette exception.

La solution consiste à exécuter le registre RMI. Le registre RMI est un programme livré avec la machine virtuelle Java et s'appelle rmiregistre . Il doit être situé dans le un m répertoire de l'installation de la machine virtuelle Java. L'exécuter est aussi simple que :

jar cvf target/rmi-lib.jar -C target server/Greeting.class

Par défaut, le registre écoute sur le port 1099. Pour qu'il écoute sur un autre port, spécifiez le numéro de port comme suit :

Registry registry = LocateRegistry.getRegistry(host, port);

Vérifiez qu'il y a bien un écouteur sur le port spécifié avec la commande netstat :

quel age a mon macbook air
Greeting greeting = (Greeting) registry.lookup(name);

Exécution du serveur

Essayons maintenant de relancer le serveur.

System.out.println(name + ' reported: ' + greeting.greet(myName));

Encore une exception ! Qu'est-ce qu'il y a cette fois?

Le serveur ne parvient pas à charger la classe d'interface serveur.Salut . Cela se produit parce que le registre RMI ne peut pas charger la classe requise. Vous devez donc spécifier l'emplacement des classes requises. Une façon de le faire est de spécifier la variable d'environnement CLASSPATH :

package client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import server.Greeting;
public class Client
{
static public void main(String[] args) throws Exception
{
if ( args.length != 3 ) {
System.err.println('usage: java Client host port myName');
System.exit(1);
}
int index = 0;
String host = args[index++];
int port = Integer.parseInt(args[index++]);
String myName = args[index++];
String name = 'Greeting';
Registry registry = LocateRegistry.getRegistry(host, port);
Greeting greeting = (Greeting) registry.lookup(name);
System.out.println(name + ' reported: ' + greeting.greet(myName));
}
}

Essayer de relancer le serveur donne :

java -cp target/rmi-server.jar server.Main 1099
# throws
Exception in thread 'main' java.rmi.ConnectException: Connection refused to host: xxx; nested exception is:
java.net.ConnectException: Connection refused

Maintenant, le serveur fonctionne.

Exécution du client

Une fois que toutes les pièces sont assemblées et exécutées, l'exécution du client est simple. Il a besoin des JAR appropriés pour l'exécution. Il s'agit notamment de la classe contenant le principale() méthode et la classe d'interface. Il accepte des arguments indiquant où le registre RMI s'exécute et un nom pour le message d'accueil.

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry

Sommaire

Java RMI fournit une API et des outils pour faciliter l'exécution de code à distance. Vous pouvez implémenter un serveur qui enregistre un objet de service auprès du registre Java RMI. Les clients peuvent interroger le registre et obtenir un stub d'objet de service pour appeler les méthodes de service. Comme l'illustre cet exemple, tout est assez simple.

Utilisez-vous Java RMI dans votre projet ? Quelle a été votre expérience? Y a-t-il des alternatives que vous avez étudiées ? Veuillez nous en informer dans les commentaires ci-dessous.

Partager Partager Tweeter E-mail Guide du débutant pour animer un discours

Animer un discours peut être un défi. Si vous êtes prêt à commencer à ajouter du dialogue à votre projet, nous allons décomposer le processus pour vous.

Lire la suite
Rubriques connexes
  • La programmation
  • Java
A propos de l'auteur Jay Sridhar(17 articles publiés) Plus de Jay Sridhar

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner