Использование единого реестра RMI - PullRequest
8 голосов
/ 04 мая 2009

Я использую RMI для проекта, над которым я сейчас работаю, и хочу привязать несколько хостов к одному реестру RMI.

Однако, когда я пытаюсь это сделать, я получаю сообщение об ошибке

java.rmi.AccessException: Registry.Registry.bind запрещен; origin / 192.168.0.9 - нелокальный хост

Я так гуглил, и похоже, что RMI останавливает привязку удаленных хостов по умолчанию, что я хочу знать, есть ли способ переопределить или обойти это?

Если у кого-нибудь есть какие-либо предложения о том, как обойти эту проблему, они будут высоко оценены, я пробовал использовать разные файлы политики и переопределять менеджер безопасности, но, похоже, ни одно из них не работает.

Ответы [ 5 ]

7 голосов
/ 20 мая 2009

Есть способ обойти ограничение, но это то, что есть: обходной путь. В любом случае, не стесняйтесь попробовать. У нас это работает.

На хосте, на котором работает центральный реестр RMI, запустите небольшую службу, которая будет связывать удаленный объект одним удаленным методом: proxyRebind. Реализация этого метода просто связывает объект, предоставленный ему, в центральном реестре (это не сработает, потому что реестр находится на том же компьютере, что и эта служба).

Все остальные хосты просто ищут этот удаленный объект и вызывают proxyRebind со своими собственными удаленными объектами.

Это работает, потому что просмотр удаленно размещенных реестров разрешен. Ваша первоначальная попытка не удалась, поскольку привязка к удаленно размещенным реестрам не разрешена.

Дайте мне знать, если вам нужна дополнительная ясность по этому вопросу.

/ RS

2 голосов
/ 30 августа 2009

2 Есть способ обойти ограничение, но это то, что это: работать вокруг. В любом случае, не стесняйтесь попробовать это из. У нас это работает.

На хосте, на котором выполняется центральный реестр RMI запустить небольшой сервис, который будет связывать удаленный объект только с одним удаленным методом: proxyRebind. Реализация этот метод просто связывает объект что подается к нему в центральном реестр (это не сбоит, потому что реестр находится на той же машине, что и этот сервис).

Все остальные хосты будут просто искать этот удаленный объект и вызвать proxyRebind со своим собственным пультом объекты.

Это работает, потому что поиск удаленно размещенные реестры разрешены. Ваш первоначальная попытка не удалась, потому что привязка к удаленно размещенным реестрам не допускается.

Дайте мне знать, если вам нужно еще ясность в этом.

Это прекрасно работает. Единственное, о чем нужно позаботиться, это то, что следующее должно быть правильно настроено. -Djava.rmi.server.hostname = "LOCAL HOST IP"

1 голос
/ 19 мая 2009

Возможно, я неправильно понимаю ваш вопрос, если да, пожалуйста, дайте мне знать.

У меня ограниченный опыт работы с Java RMI, мы использовали его в нашем классе Design Patterns с Proxy Pattern. (Учебник: Шаблоны дизайна Headfirst)

Нам не удалось заставить наши проекты работать за пределами университетской сети, но они отлично работали при подключении напрямую к сети. По словам нашего профессора, не было возможности использовать RMI в нашей реализации через Интернет или WAN. Решение, которое она предложила, состояло в том, что потребуется VPN. Я считаю, что Владимир прав в том, что это связано с тем, что он является местной службой имен.

0 голосов
/ 14 июня 2009

Спасибо за ответы на все вопросы. Решение, которое я в итоге придумал, заключалось в использовании Cajo Framework . Это дает очень гибкую систему для распространения и позволяет мне обрабатывать реестр по своему усмотрению. Он также может работать за NAT, межсетевыми экранами и HTTP-прокси, что очень полезно.

Я полагаю, что метод проксирования, предложенный rndm.buoy, в некоторых случаях будет работать, но в некоторых системах он может быть проблематичным. RMI, похоже, имеет некоторые проблемы с подключением к неправильному сетевому интерфейсу. У меня была эта проблема, особенно при работе с дистрибутивами Linux на основе Debian.

0 голосов
/ 04 мая 2009

Я могу ошибаться, но похоже, что приложение rmiregistry по сути является оберткой над локальной службой именования. Это означает, что нет способа заставить его указывать на удаленные объекты.

То, что вам нужно, это реализация именования, кластеризованная на этом. Рассмотрим переход к кластерному решению J2EE AS. Дерево JNDI совместно используется в кластере.

...