2013-01-27 5 views
0

Я хочу установить адрес хоста удаленного объекта в rmi. Возможно ли установить этот ip addres в заглушке?Установка адреса хоста объекта rmi

НЕ: Я знаю, что могу сделать трюк с использованием фабрики ThreadLocalRmiClientSocket, но я не хочу его использовать.

+0

С какой целью? Получаемый в результате шлейф имеет только 1 из 65536 шансов на работу, даже если предположить, что удаленный объект, реализующий один и тот же удаленный интерфейс, был экспортирован через новый хост: порт. – EJP

+0

привет, EJP Я получаю удаленный серверный объект. Затем я создаю клиента и регистрирую этого клиента. например server.register (клиент); в вышеприведенном случае, когда я пинговаю сервер, все идет правильно. Но когда я ping клиент с сервера, он не работает. Поскольку у клиента две карты Ethernet, а в клиентском объекте - недействительный адрес хоста. Таким образом, проверка неверного адреса хоста не выполняется. – emin

ответ

1

Внутри удаленного заглушки вам необходимо установить новое значение для поля protected RemoteRef ref. Все удаленные коммуникации проходят через этот объект. Поскольку поле защищено, вы можете сделать это просто в своем собственном классе, который вы получаете из заглушки RMI.

К сожалению RemoteRef - это интерфейс без публичной реализации. Вы можете посмотреть существующие OpenJDK implementation. Оттуда видно, что существует реализация sun.rmi.server.UnicastRef, для которой требуется LiveRef, и для этого требуется Endpoint. Endpoint уже относительно легкий класс для понимания. Возможно, вам придется дублировать функциональность этих классов в вашем коде.

Чтобы убедиться, что класс заглушки действительно существует, сгенерируйте его с помощью rmic, возможно, даже используйте -keepgenerated, чтобы вы могли проверить исходный код, которое это поле существует, - кто знает подробности конкретной реализации.

В общем, это не изящное и простое решение, но оно должно работать.

Extension: Как все это кажется довольно сложным сделать, я предлагаю вместо того, чтобы получить новый действующий окурок, который указывает на обновленном месте удаленного обслуживания и украсть значение ref поля от него. Это кажется относительно простым в использовании и может быть разумным, если текущий заглушка запутан в некоторых структурах данных, так что вы не можете легко его заменить. Сама заглушка не заботится о хосте, порту, объекте id или watsoever, пока удаленная сторона продолжает реализовывать тот же самый удаленный контракт - только его RemoteRef делает. Stub полагается на RemoteRef.invoke.

+0

спасибо Audrius. – emin

+0

Именно этого и не нужно. См. Мой ответ. – EJP

+0

Это, см. Мой ответ. Решение @EJP будет работать только для заглушек, представляющих локальные объекты. – h22

-2

Перед экспортом любых удаленных объектов необходимо установить системное свойство «java.rmi.server.hostname» соответствующим образом на сервере JVM. Затем это значение встраивается в заглушку, когда она создается при экспорте.

+1

Он спрашивает, как изменить адрес * удаленного * объекта * в заглушке * - тот, который представляет объект на другой машине, имя хоста теперь должно быть разным. Я предполагаю, что он хочет изменить это имя хоста после того, как он узнает, что объект переместился в другое известное место. Вы объясните, как изменить имя хоста на локальном сервере. – h22

+0

@ AudriusMeškauskas В этом случае вопрос не имеет никакого смысла. Изменение адреса конечной точки непосредственно в заглушке будет работать только тогда, когда (a) в JVM на этом хосте находится удаленный объект: порт, который (b) реализует тот же удаленный интерфейс * и * (c), который был экспортирован с идентичным идентификатором объекта , над которым вы не контролируете. Не очень вероятно. – EJP

+0

@EJB Я предполагаю, что это своего рода переход на другой ресурс, и в этом новом месте работает полностью идентичный сервис. – h22