Вопрос

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

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

java.rmi.AccessException Исключение:Реестр.Привязка к реестру запрещена;источник / 192.168.0.9 является нелокальным хостом

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

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

Это было полезно?

Решение 5

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

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

Другие советы

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

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

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

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

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

/Рупий

  

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

     

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

     

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

     

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

     

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top