Подтвердить что ты не робот

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.
  • поскольку объект уже привязан к реестру, необходимо выполнить повторную проверку вместо нормального связывания
  • последний, делает все это явно
4b9b3361

Ответ 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 был выполняется.