Про старый добрый RMI



Не так давно, после многолетнего перерыва, в одном небольшом проекте использовал такую древнюю технологию как RMI. В итоге хотел поделиться общими впечатлениями и сделать небольшие заметки “для себя” на будущее.
Задача была типовой — перебросить выполнение некоторых функций с одного сервера на другой, на котором установлено специальным образом настроенное оборудование и программное обеспечение. В результате нескольких раундов переговоров с клиентом были получены следующие нефункциональные требования:

1. Между серверами гигабитная сеть в доверенной зоне, без доступа в интернет.
2. Физически сервера расположены рядом (в одной стойке).
3. Размер передаваемых в функцию данных около нескольких сотен килобайт, максимум нескольких мегабайт.
4. Количество запросов небольшое, но возможны пиковые нагрузки.
5. Операционная системы и оборудование позволяет установить последнюю стабильную версию Java, но по возможности следует избегать большого количества сторонних библиотек и фреймворков.
6. Клиентская и серверная часть должны работать не столько в рамках сервера приложения/веб-сервера, а скорее как обычное приложение.

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

Кончено RMI давно уже не в тренде, но в данном случае он очень органично подходил для решения этой задачи. Другое дело, что явно пользовался им очень давно, во времена предшествующие Java 5. С тех пор для ремоутинга чего-только не приходилось применять. В зависимости от контекста: .NET Remoting, Hessian/Burlap, GWT-RPC, SOAP, ну и конечно различные самодельные реализации.
Сейчас большинство моих заказчиков хотят веб-службы. Бизнесу нужен SOAP и WSDL, по крайней мере сейчас.

Еще раз повторюсь, я не смотрел на RMI много лет, с тех пор многое изменилось (для меня). В первую очередь радует то, что уже давно можно не запускать rmic и колдовать со скелетонами как нас до сих пор учит википедия.
С другой стороны классы Remote и RemoteException остались, т.е. преемственность базовых классов естественно остается. И это хорошо!

Официальный Java-учебник как обычно в хорошем состоянии. Пересказывать его не вижу смысла, поэтому далее хочу ограничиться небольшим количество “хинтов”, которые возможно пригодятся мне в будущем.

  • Системное свойство java.rmi.server.logCalls = true/false полезно для отладки.
  • Если две сетевые карты, то может будет полезно посмотреть на свойство java.rmi.server.hostname.
  • Если вдруг понадобится, то можно прочитать руководство по работе RMI и SSL.
  • Подробный список свойств находится на страницах javarmiproperties и sunrmiproperties.

Резюмируя — мне понравилось, вернулись воспоминания моей java-молодости, во времена когда клепал Applet-ы, раскладывал GridBag-ом и писал сервера на голых ServerSocket-ах. В целом, не смотря на то, что RMI уже очень много лет, оказалось, что на нем до сих пор можно быстро делать простые связки Java-to-Java фактически “из коробки”.

Любое использование либо копирование материалов или подборки материалов сайта, элементов дизайна и оформления допускается лишь с разрешения правообладателя и только со ссылкой на источник: programador.ru

Телеграм канал: @prgrmdr
Почта для связи: vit [at] programmisty.com