Я готовлюсь к экзамену, и у меня есть вопрос, который, я надеюсь, кто-то здесь может мне ответить.
Речь идет об 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);
...
}
}
Мой вопрос: в чем разница между этими двумя?
В первой версии реестр создается в явном виде, кроме того, удаленный объект создается при повторном связывании?
Мне действительно любопытно, почему сначала мне нужно создать реестр самостоятельно, но не нужно явно экспортировать объект и просто привязать его заново, используя Naming
. Этот объект уже связан с реестром ранее, или я мог бы вместо этого использовать связывание? И что произойдет, если объект ранее не был связан, и повторное связывание выполнено?
Во второй версии реестр, похоже, уже создан.
Почему привязка к именованию совпадает с привязкой к реестру напрямую?
Это то, что я думаю:
- первый класс direclty реализует интерфейс UnicastRemoteObject, который означает, что во время выполнения создается реестр, и объект автоматически экспортируется в реестр RMI.
- , поскольку объект уже привязан к реестру, вместо обычной привязки должна быть выполнена повторная привязка.
- последний делает все это явно.