Мы сделали это на рабочем сервере, но это было давно.Военного файла для установки нет, так как это довольно необычная вещь, особенно в наши дни с AJAX и веб-приложениями, а что нет.Я бы не рекомендовал развертывать RMI через Интернет из-за масштабируемости и надежности.Это замечательно для ЛВС или даже для JVM, но в более широком масштабе я бы рассмотрел более традиционный веб-сервис, если это возможно.
Помимо этого, здесь есть так себе руководство .Это для Tomcat 3, но концепции все те же, и в нем упоминается интеграция с Apache, которая довольно избыточна для использования сервлетом, так что есть куски этого, которые вы можете игнорировать, если вы уже достаточно au fait сTomcat.
Он проведет вас через установку сервлета в Tomcat, который распакует запрос RMI, поддерживающий отправку HTTP-сообщения, найдет локальный реестр и завершит удаленный вызов метода для вас.Он также предоставляет небольшой демонстрационный сервер и клиентское приложение для тестирования вашей установки.
Изменить в ответ на комментарии:
У меня естьнашел сервлет, который будет имитировать /cgi-bin/java-rmi.cgi, но чтобы использовать его, я должен перенаправить все запросы в / RMIServlet, не давая клиенту знать, что он перенаправляется.Я много гуглил за это и пробовал многочисленные решения.Все без успеха.Каков наилучший способ сделать это?
Я думаю, что это достигается путем предоставления SocketFactory для RMI, которая отказывается от обычного маршрута порта 1099 и вместо этого выполняет запрос на HTTP / Post.
Сама фабрика сокетов выглядит примерно так: вы можете заставить ее работать с HTTPS, просто изменив объект URL.
public class RMIHttpToCgiSocketFactory extends RMISocketFactory implements Serializable {
public static final long serialVersionUID = 1L;
public RMIHttpToCgiSocketFactory(){}
public Socket createSocket( String s, int i ) throws IOException {
// Whacked out indentation for StackOverflow! Hope you can read this.
return new HttpsSendSocket(
s,
i,
new URL(
"http",
s,
"/cgi-bin/java-rmi.cgi?forward="+i
)
);
}
public ServerSocket createServerSocket( int i ) {
return null;
}
}
Теперь вам просто нужно указать приложению использовать этот сокетФабрика в своих отношениях RMI.В нашей кодовой базе это делается как на сервере, так и на клиенте.На стороне сервера, когда служба RMI привязывает себя к реестру, вы можете указать фабрику сокетов клиента при экспорте объекта для получения заглушки Remote.
RMIClientSocketFactory clientSocketFactory = new RMIHttpToCgiSocketFactory();
Remote stub = UnicastRemoteObject.exportObject(
server,
port,
clientSocketFactory,
RMISocketFactory.getDefaultSocketFactory()
);
А на клиенте вы можете указать фабрику сокетовпри поиске реестра.
Registry registry = LocateRegistry.getRegistry(
loginHostName,
portNumber,
new RMIHttpToCgiSocketFactory()
);