Mise en route de Java RMI

Premiers pas avec Java RMI

1. Vue d'ensemble

Lorsque deux machines virtuelles doivent communiquer, Java RMI est une option que nous devons faire pour que cela se produise. Dans cet article, nous allons démarrer un exemple simple présentant la technologie Java RMI.

2. Création du serveur

Il existe deux étapes pour créer un serveur RMI:

  1. Créez une interface définissant le contrat client / serveur.

  2. Créez une implémentation de cette interface.

2.1. Définition du contrat

Tout d’abord, créons l’interface de l’objet distant. Cette interface étend l'interface du marqueur dejava.rmi.Remote.

De plus, chaque méthode déclarée dans l'interface lève lesjava.rmi.RemoteException:

public interface MessengerService extends Remote {
    String sendMessage(String clientMessage) throws RemoteException;
}

Notez, cependant, que RMI prend en charge la spécification Java complète pour les signatures de méthode, tant que les types Java implémententjava.io.Serializable.

Nous verrons dans les prochaines sections comment le client et le serveur utiliseront cette interface.

Pour le serveur, nous allons créer l'implémentation, souvent appeléeRemote Object.

Pour le client,the RMI library will dynamically create an implementation called a Stub.

2.2. la mise en oeuvre

De plus, implémentons l’interface distante, appelée à nouveauRemote Object:

public class MessengerServiceImpl implements MessengerService {

    @Override
    public String sendMessage(String clientMessage) {
        return "Client Message".equals(clientMessage) ? "Server Message" : null;
    }

    public String unexposedMethod() { /* code */ }
}

Notez que nous avons laissé de côté la clausethrowsRemoteException de la définition de la méthode.

Il serait inhabituel que notre objet distant lève unRemoteException car cette exception est généralement réservée à la bibliothèque RMI afin de générer des erreurs de communication avec le client.

L'abandonner a également l'avantage de garder notre implémentation RMI-agnostique.

Aussi,any additional methods defined in the remote object, but not in the interface, remain invisible for the client.

3. Enregistrement du service

Une fois que nous avons créé l'implémentation distante, nous devons lier l'objet distant à un registre RMI.

3.1. Créer un stub

Premièrement, nous devons créer un stub de notre objet distant:

MessengerService server = new MessengerServiceImpl();
MessengerService stub = (MessengerService) UnicastRemoteObject
  .exportObject((MessengerService) server, 0);

Nous utilisons la méthode statiqueUnicastRemoteObject.exportObject pour créer notre implémentation de stub. The stub is what does the magic of communicating with the server over the underlying RMI protocol.

Le premier argument deexportObject est l'objet serveur distant.

Le deuxième argument est le port queexportObject utilise pour exporter l'objet distant vers le registre.

Donner une valeur de zéro indique que nous ne nous soucions pas du port utilisé parexportObject, qui est typique et donc choisi dynamiquement.

Malheureusement, la méthodeexportObject() sans numéro de port est obsolète.

3.2 Creating a Registry

Nous pouvons créer un registre local sur notre serveur ou en tant que service autonome distinct.

Pour plus de simplicité, nous allons en créer un qui soit local sur notre serveur:

Registry registry = LocateRegistry.createRegistry(1099);

Cela crée un registre auquel les stubs peuvent être liés par les serveurs et découverts par les clients.

De plus, nous avons utilisé la méthodecreateRegistry, car nous créons le registre local sur le serveur.

Par défaut, un registre RMI s'exécute sur le port 1099. Au contraire, un port différent peut également être spécifié dans la méthode d'usinecreateRegistry.

Mais dans le cas autonome, nous appellerionsgetRegistry, en passant le nom d'hôte et le numéro de port comme paramètres.

3.3 Binding the Stub

Par conséquent, lions notre stub au registre. Un registre RMI est une fonction de nommage telle que JNDI, etc. Nous pouvons suivre un modèle similaire ici, en liant notre souche à une clé unique:

registry.rebind("MessengerService", stub);

En conséquence, l'objet distant est maintenant disponible pour tout client capable de localiser le registre.

4. Création du client

Enfin, écrivons au client pour appeler les méthodes distantes.

Pour ce faire, nous allons d'abord localiser le registre RMI. En outre, nous rechercherons le stub d'objet distant à l'aide de la clé unique délimitée.

Et enfin, nous allons appeler la méthodesendMessage:

Registry registry = LocateRegistry.getRegistry();
MessengerService server = (MessengerService) registry
  .lookup("MessengerService");
String responseMessage = server.sendMessage("Client Message");
String expectedMessage = "Server Message";

assertEquals(expectedMessage, responseMessage);

Étant donné que nous exécutons le registre RMI sur la machine locale et le port par défaut 1099, nous ne transmettons aucun paramètre àgetRegistry.

En effet, si le registre est plutôt sur un hôte ou un port différent, nous pouvons fournir ces paramètres.

Une fois que nous avons recherché l'objet stub à l'aide du registre, nous pouvons appeler les méthodes sur le serveur distant.

5. Conclusion

Dans ce tutoriel, nous avons une brève introduction à Java RMI et à la manière dont il peut constituer le fondement des applications client-serveur. Restez à l'écoute pour des articles supplémentaires sur certaines des fonctionnalités uniques de RMI!

Le code source de ce didacticiel se trouve suron GitHub.