Java RMI - UnicastRemoteObject: в чем разница между UnicastRemoteObject.exportObject() и расширяет UnicastRemoteObject()?
Я готовлюсь к экзамену, и у меня возникает вопрос, что я надеюсь, что кто-то здесь сможет ответить мне.
Его о RMI и удаленных объектах. Интересно, почему так много различий между этими двумя реализациями. один расширяет объект UnicastRemoteObject, тогда как другой экспортирует объект как объект UnicastRemoteObject.
Я действительно не понимаю, кстати, это всего лишь быстрый и грязный пример: -)
Интерфейс:
public interface EchoI extends Remote {
public String echo() throws RemoteException
}
Это код сервера (версия 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";
}
}
и это будет версия 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);
...
}
}
Мой вопрос: в чем разница между этими двумя?
в первой версии реестр явно создается, кроме того, удаленный объект создается в рамках повторной операции.
Мне очень любопытно, почему в первую очередь мне нужно создать реестр самостоятельно, но не нужно явно экспортировать объект и просто переустановить его с помощью именования.
это тот объект, который уже привязан к реестру раньше, или я могу использовать привязку вместо этого? И что произойдет, если объект ранее не был связан и повторная переинструкция?
в второй версии, реестр, похоже, уже создан?
Почему привязка к наименованию так же, как привязка к реестру напрямую?
Если вы хотите, чтобы я включил какие-либо подробности, оставьте мне комментарий...
Это то, что я думаю:
- первый класс direclty реализует интерфейс UnicastRemoteObject, что означает, что во время выполнения создается реестр и объект автоматически экспортируется в реестр RMI.
- поскольку объект уже привязан к реестру, необходимо выполнить повторную проверку вместо нормального связывания
- последний, делает все это явно
Ответы
Ответ 1
java.rmi.server.UnicastRemoteObject
используется для экспорта удаленного объекта с помощью Java Remote Method Protocol (JRMP) и получения заглушки, которая связывается с удаленным объектом.
Для конструкторов и статических методов exportObject
ниже, получается заглушка для удаленного объекта, экспортируемого...
Там вы должны следовать Javadoc
Ответ 2
Здесь есть два вопроса.
-
Вы можете либо расширить UnicastRemoteObject
, либо позвонить UnicastRemoteObject.exportObject().
, который вы делаете, зависит от вас. Первый - простой и автоматический; второй означает, что вы можете расширить другой класс.
-
Вы можете использовать внешний реестр RMI или создать его самостоятельно в своем JVM-сервере. Опять же, что вы делаете, зависит от вас, есть преимущества в обоих направлениях.
Эти два вопроса не имеют взаимодействия.
-
Если вы extend UnicastRemoteObject
, вы также получаете преимущество "удаленной семантики" для методов hashCode()
и equals()
, так что все заглушки выглядят идентично удаленному объекту, который их экспортировал, но это не имеет практического применения на стороне клиента и действительно существует только для поддержки самой реализации RMI.
Ответ 3
Вы можете вызвать UnicastRemoteObject.exportObject()
вместо расширения UnicastRemoteObject
в сценарии, где вам нужно расширить любой другой класс. Общий эффект тот же, что и я.
Смотрите это
Ответ 4
Во-первых, привязка и повторное связывание удаленного объекта с использованием класса Naming
class и Registry
не относится к сценариям расширения или отсутствия класса UnicastRemoteObject
. См. здесь для отличий.
Во-вторых, разница между расширяющимся классом UnicastRemoteObject
заключается в том, что если объект этого типа используется как заглушка, тогда вам не нужно будет вызывать UnicastRemoteObject.exportObject
, чтобы больше получить заглушку для привязки к реестру. В вашей версии 1 StorehouseImpl
должен был расшифровать UnicastRemoteObject
, и на самом деле нет необходимости в EchoImpl
расширять UnicastRemoteObject
для вашей версии 1, поскольку нет экземпляра EchoImpl
, зарегистрированного как удаленный объект в реестр.
В-третьих, вы упомянули, что произошло, если rebind
выполняется без bind
выполняется заранее. Как описано в javadoc здесь, если имя ключа не было вставлено, оно будет вести себя так же, как если бы первый раз bind
был выполняется.