Сервер через RMI без реестра - PullRequest
4 голосов
/ 01 февраля 2011

У меня есть сервисный объект, к которому можно подключиться через RMI. В настоящее время я делаю это:

Сервер

Registry r = LocateRegistry.createRegistry(1234);
r.bind("server", UnicastRemoteObject.exportObject(remoteServer, 0));

Клиент

RemoteServer s = LocateRegistry.getRegistry("example.com", 1234).lookup("server");

Реестр на сервере имеет только одно использование для связи с одним объектом сервера. Я подумал, что с таким же успехом могу сделать это на сервере:

UnicastRemoteObject.exportObject(remoteServer, 1234);

Но тогда как мне подключиться к объекту сервера с клиента?

Ответы [ 2 ]

13 голосов
/ 14 февраля 2011

Реестр RMI существует для решения проблемы начальной загрузки RMI, которая заключается в том, что вы можете получить удаленную заглушку только через удаленный вызов метода, а для выполнения удаленного вызова метода вам нужна удаленная заглушка.Ссылка на реестр, предоставленная LocateRegistry.getRegistry(), решает эту проблему (и используется внутри Naming.lookup(), если вы используете этот API).[Обратите внимание, что эта заглушка не получена удаленным методом: она синтезируется локально, используя предоставленный вами порт host :.Если они не верны, вы не узнаете , пока не воспользуетесь заглушкой реестра. ]

У вас есть несколько вариантов решения проблемы начальной загрузки RMI:

  1. Использование реестра RMI.

  2. Использование сервера LDAP через JNDI с поставщиком LDAP.

  3. Использование UnicastRemoteObject, serializeзаглушка, полученная при экспорте объекта и использовании общего файла, сокета или sneakernet, чтобы сделать заглушку доступной для клиентов.

  4. Использовать активацию RMI;сериализовать заглушку, полученную при регистрации активируемого, и распространить среди всех клиентов в файле вместе с клиентским приложением.С точки зрения распределения заглушек это намного проще, чем (3), потому что заглушка остается постоянной в течение всего срока службы приложения, тогда как в (3) вы должны перераспределять заглушку при каждом экспорте.

Вы видите, что Реестр, безусловно, самый простой вариант.Обратите внимание, что вам нужно использовать его только для решения проблемы начальной загрузки Когда у вас есть заглушка, ваши собственные удаленные методы приложения могут возвращать другие объекты: вам не нужно более одного удаленного объекта в реестре.Вы можете считать это фабрикой удаленных объектов.

1 голос
/ 01 февраля 2011

Не невозможно, но не очень практично, потому что реестр передает объект-заглушку экспортируемого объекта клиенту (см. http://www.developer.com/print.php/3455311). Если у вас нет другого механизма для этого, вы застрянете. Использование реестра в распределенных системах имеет другие преимущества, поэтому я бы порекомендовал сохранить его по другим причинам (прозрачность местоположения и т. д.).

...