Метка: rmi

  • Про старый добрый 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 фактически “из коробки”.