Удаленный реестр RMI - PullRequest
4 голосов
/ 18 января 2012

Я пишу приложение, которое требует удаленной привязки, то есть привязки удаленного объекта к удаленному реестру.По умолчанию реестр Java RMI привязывается только локально, только к удаленным объектам, которые связаны в той же JVM / хосте.

Я видел несколько решений, позволяющих обойти это создание удаленного интерфейса, который будет принимать удаленный объект, а затем связываться локально ( SO link этого обсуждения ).Разве нет более элегантного способа решить эту проблему?Может мне стоит попробовать использовать JNDI с другим провайдером ??

Ответы [ 4 ]

2 голосов
/ 06 февраля 2012

Используйте сервер LDAP вместо реестра RMI.

2 голосов
/ 28 января 2012

Это хак, но вы можете попробовать настроить переадресацию портов на сервере, чтобы порт сервера реестра был открыт таким образом, чтобы все запросы, проходящие через него, выглядели как локальные.

Это довольно легко сделать с помощью SSH. На сервере запустите:

ssh localhost -N -L 1199:localhost:1099 -g

Это не будет запускать команду (-N), но откроет сокет прослушивания на порту 1199 на локальном компьютере, который перенаправляется на порт 1099 на локальном хосте (-L 1199:localhost:1099) и который доступен для подключений из любого источник (-g). Соединения, сделанные через этот туннель, будут отображаться на сервере через порт 1099 как локальные. Обратите внимание, что вы также можете добавить -f, чтобы SSH перешел в фоновый режим после настройки туннеля, и в этом случае я бы предложил также добавить '-o ExitOnForwardFailure' для улучшения обработки ошибок.

Также должно быть возможно сделать это, используя netcat, а не SSH, что будет проще и эффективнее, но у меня не установлена ​​подходящая версия netcat. Это также возможно сделать с помощью socat, если у вас установлено:

socat TCP-LISTEN:1199,fork TCP:localhost:1099

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

0 голосов
/ 30 января 2012

Я провел еще несколько исследований по этому вопросу ... Во-первых, если у вас одинаковая кодовая база на обоих серверах, все должно быть так просто:

...
Registry registry = LocateRegistry.getRegistry("192.168.1.1", 1100);
registry.rebind("Hello, World!", myObj);

Но вы можете быстро столкнуться с проблемами, если вам нужно загрузить классы в удаленный реестр ... вам понадобится менеджер безопасности: http://www.devx.com/getHelpOn/10MinuteSolution/20444

Я все еще надеялся, что вы можете опубликовать пример кода или дать нам больше информации о вашей ситуации.

0 голосов
/ 24 января 2012

Я сделал это, но я использовал совсем другой подход.Я написал простые POJO и простые Java-интерфейсы, не возиться со странными абстрактными классами, компиляторами удаленных заглушек или множеством проверенных исключений, связанных с API Java RMI.Затем я использовал Spring Remoting для подключения всего, и Spring позаботился о транспорте RMI:

Взгляните на руководство здесь: http://static.springsource.org/spring/docs/2.0.x/reference/remoting.html

Вот пример bean-компонента, который будет использовать проксив удаленный реестр:

<bean id="accountService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
    <property name="serviceUrl" value="rmi://HOST:1199/AccountService"/>
    <property name="serviceInterface" value="example.AccountService"/>
</bean>

Это решает вашу проблему, но, вероятно, не дает точного ответа на ваш вопрос ... хотя старый API RMI из Java устарел, Spring позволяет вам работать с "простоJava».

...