Java RMI - UnicastRemoteObject: quelle est la différence entre UnicastRemoteObject.exportObject() et s'étend UnicastRemoteObject?
je suis en train de préparer pour un examen, et je vais avoir une question à laquelle j'espère que quelqu'un ici pourrait me répondre.
Il est sur le RMI et les objets distants. Je me demande pourquoi il y a autant de différence entre ces deux implémentations. l'un est l'extension de la UnicastRemoteObject alors que l'autre est l'exportation de l'objet comme un UnicastRemoteObject.
Je n'ai pas vraiment la différence
Interface:
public interface EchoI extends Remote {
public String echo() throws RemoteException
}
C'est le code du serveur (version 1):
public class EchoImpl extends UnicastRemoteObject implements EchoI {
public EchoImpl {
super();
}
public static void main (String[] args) {
try {
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
StoreHouse storehouseImpl = new StorehouseImpl();
Naming.rebind("//localhost/StoreHouse.SERVICE_NAME", storehouseImpl);
System.out.println("Server ready");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public String echo() {
return "echo";
}
}
et ce serait la version 2:
public class EchoImpl implements EchoI {
public static void main (String[] args) {
EchoI echoService = new EchoImpl();
EchoI stub = (EchoI) UnicastRemoteObject.exportObject(echoService, 0);
Registry registry = LocateRegistry.getRegistry();
registry.bind("echoService", stub);
...
}
}
Ma question est: quelle est la différence entre ces deux?
À apparaître les premières version de la base de registre est créée explicitement, en outre, la distance de l'objet est créée à l'intérieur d'un rebind?
Je suis vraiment curieux de savoir, pourquoi, dans la première j'ai besoin de créer le registre de moi-même, mais n'ont pas besoin d'exporter l'objet explicitement et simplement relier à l'aide de Naming
. Est que l'objet est déjà lié au registre avant, ou pourrais-je l'utiliser lier à la place? Et ce qui se passe, si l'objet n'a pas été précédemment lié et une reliaison est excecuted?
Dans la deuxième version, le registre semble être déjà créé.
Pourquoi est obligatoire de nommer la même que la liaison à un registre directement?
C'est, ce que je pense:
- la première classe directement implémente l'interface UnicastRemoteObject ce qui signifie, qu'au moment de l'exécution le registre est créé et l'objet est automatiquement exporté vers le RMI registre.
- que l'objet est déjà liée à un registre, une reliaison plutôt normal d'une liaison doit avoir lieu.
- ce dernier fait tout cela de manière explicite.
Vous devez vous connecter pour publier un commentaire.
java.rmi.server.UnicastRemoteObject
est utilisé pour l'exportation d'un objet distant avec Java Remote method protocol (Protocole JRMP) et l'obtention d'un stub qui communique à l'objet distant.Pour les constructeurs et statique
exportObject
méthodes ci-dessous, le talon pour un objet distant exporté est obtenu ...Là il faut suivre les Javadoc
Il y a deux questions ici.
Vous pouvez étendre
UnicastRemoteObject
ou appelezUnicastRemoteObject.exportObject().
Qui vous avez à faire est de vous. Le premier est simple et automatique; la seconde signifie que vous pouvez étendre une autre classe.Vous pouvez soit utiliser un externe RMI de Registre ou de créer vous-même l'intérieur de votre serveur JVM. Qui de vous n'est à vous, il y a des avantages dans les deux sens.
Ces deux questions ont pas d'interaction.
Si vous
extend UnicastRemoteObject
vous obtenez également l'avantage de la "distance sémantique" pour lehashCode()
etequals()
méthodes, telles que tous les talons semblent être identiques à l'objet distant qui l'a exporté, mais ce n'est pas une utilisation pratique sur le côté client, et il est vraiment là que pour soutenir le RMI mise en œuvre elle-même.Vous pouvez appeler la
UnicastRemoteObject.exportObject()
au lieu de prolonger leUnicastRemoteObject
dans un scénario où vous avez besoin de s'étendre à tous les autres de la classe. Effet global est le même je pense.Voir ce
Tout d'abord, la liaison & reliaison de l'objet distant à l'aide de
Naming
classe etRegistry
classe n'est pas pertinent pour les scénarios de savoir si ou non une classe est l'extension deUnicastRemoteObject
. Voir ici pour les différences.Deuxièmement, la différence entre la classe étendant
UnicastRemoteObject
est que si l'objet de ce type est utilisé comme un tampon, puis vous n'aurez pas besoin d'appelerUnicastRemoteObject.exportObject
pour obtenir le talon de plus pour la liaison avec la base de registre. Dans votre version 1, laStorehouseImpl
devez avoir étendu leUnicastRemoteObject
, et en fait, il n'y a pas besoin deEchoImpl
d'étendreUnicastRemoteObject
pour votre version 1 comme il n'existe aucune instance deEchoImpl
est enregistré comme un objet distant à la base de registre.Troisièmement, vous mentionnez est-ce qu'arriver si
rebind
est exécutée sansbind
est exécutée à l'avance. Comme expliqué dans la javadoc ici, si aucun nom de la clé a été insérée, il va se comporter de la même manière que si le temps le premierbind
est exécutée.