Подключение к объекту RMI без реестра

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

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

К сожалению, дистрибьютор и рабочие хосты находятся за брандмауэром. Чтобы добраться до хоста дистрибьютора, я туннелирую два порта (один для реестра, один для объекта дистрибьютора) через SSH, поэтому я могу получить доступ к реестру и дистрибьютору из-за брандмауэра. Чтобы это работало, я должен установить "-Djava.rmi.server.hostname=localhost" на JVM дистрибьютора, чтобы клиенты подключались к своему локальному туннелированному порту, а не к порту на фактическом хосте дистрибьютора, который заблокирован.

Однако это создает проблему для воркеров, потому что им нужно подключаться к дистрибьютору напрямую, но из-за перенаправления «localhost» они ведут себя как клиенты и пытаются подключиться к порту на своем собственном хосте, который недоступен, потому что Я не тунел на рабочих (это нецелесообразно).

Теперь, если бы я мог подключиться к удаленному объекту напрямую, указав имя хоста и порт, я мог бы избавиться как от реестра на дистрибьюторе, так и от взлома «localhost», и заставить рабочих подключаться правильно.

Как я могу это сделать? Или есть другое решение этой проблемы?


person Mark Probst    schedule 09.06.2010    source источник


Ответы (1)


Теперь я решил проблему, внедрив свою собственную RMISocketFactory, которая подключается к «localhost» вместо хоста-дистрибьютора. Используя эту фабрику сокетов на клиентах через RMISocketFactory.setSocketFactory, теперь я могу запускать дистрибьюторов и рабочих без каких-либо взломов. На клиентах мне, конечно, еще нужен туннель SSH.

person Mark Probst    schedule 09.06.2010