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);
        ...
    }
}

Мой вопрос: каково различие между этими двумя?

В thefirst версии реестр явно создается, кроме того, удаленный объект создается в рамках снова переплетания?

Мне действительно любопытно, почему в первом я должен создать реестр сам, но не должен экспортировать объект явно и просто снова переплетать его использование Naming. Это - объект, уже связанный с реестром прежде, или мог я использовать связать вместо этого? И что происходит, если объект не был ранее связан, и снова переплетание выполняется?

Во второй версии реестр, кажется, уже создается. Почему привязка к именованию того же как связывающий с реестром непосредственно?

Это, что я думаю:

  • первый класс direclty реализует интерфейс UnicastRemoteObject, что означает, что во времени выполнения реестр создается, и объект автоматически экспортируется в реестр RMI.
  • поскольку объект уже связывается с реестром, снова переплетание вместо нормального связывают, должен произойти.
  • последний делает все это явно.
18
задан user207421 26 November 2018 в 21:10
поделиться

2 ответа

java.rmi.server.UnicastRemoteObject используется для экспорта удаленного объекта с помощью протокола удаленного метода Java (JRMP) и получения заглушки, которая связывается с удаленный объект.

Для конструкторов и статических методов exportObject ниже получается заглушка для экспортируемого удаленного объекта ...

Здесь вы должны следовать Javadoc

4
ответ дан 30 November 2019 в 08:43
поделиться

Здесь есть два вопроса.

  1. Вы можете либо расширить UnicastRemoteObject , либо вызвать UnicastRemoteObject.exportObject (). Что делать, зависит от вас. Первый простой и автоматический; второй означает, что вы можете расширить другой класс.

  2. Вы можете использовать внешний реестр RMI или создать его самостоятельно внутри JVM вашего сервера. Опять же, что вы делаете, зависит от вас, есть преимущества в обоих направлениях.

    Эти два вопроса не взаимодействуют друг с другом.

  3. Если вы расширяете UnicastRemoteObject , вы также получаете преимущество «удаленной семантики» для методов hashCode () и equals () , так что все заглушки кажутся идентичными удаленному объекту, который их экспортировал, но это не имеет практического применения на стороне клиента, а на самом деле существует только для поддержки самой реализации RMI.

19
ответ дан 30 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: