Подключение к объекту RMI без реестра - PullRequest
1 голос
/ 09 июня 2010

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

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

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

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

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

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

1 Ответ

1 голос
/ 09 июня 2010

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

...