Динамическая загрузка модулей в Java - PullRequest
5 голосов
/ 06 января 2009

В Java я могу динамически добавлять вещи в classpath и загружать классы («динамически», т.е. без перезапуска моего приложения). Существует ли известная инфраструктура / библиотека, которая занимается динамической загрузкой / выгрузкой модулей без перезапуска?

Обычной настройкой, особенно для веб-приложений, является балансировка нагрузки, несколько экземпляров приложения, а также постепенное развертывание и перезапуск новой версии. Я ищу что-то еще - приложение с несколькими службами / плагинами, возможно, настольное приложение с одним экземпляром, где отключение одного сервиса стоит дешево, но отключение или перезапуск полного приложения невозможен.

Я имею в виду типичную инфраструктуру плагинов, где плагины могут быть обновлены или установлены без перезапуска приложения. Нужно ли программировать это с нуля, или что-то уже доступно? Spring-совместимый и открытый исходный код является плюсом, но не обязательным требованием.

Ответы [ 2 ]

10 голосов
/ 06 января 2009

Возможно, вы захотите запустить свое весеннее приложение в OSGI framework .

Я полагаю, что DMServer - это сервер приложений Java на основе модулей, предназначенный для запуска корпоративных приложений Java и приложений на базе Spring на основе OSGI

Более подробную информацию вы можете найти в этой статье Hello, OSGi, часть 2. Введение в Spring Dynamic Modules , в частности, в том, как использовать Spring DM для динамической установки, обновления и удаления модулей в работающей системе. .


Примечание: когда вы говорите о том, что «плагины могут быть обновлены или установлены без перезапуска приложения», OSGI - первый подходящий фреймворк.

Все дело в модульности приложений в более мелкие пакеты.
Каждый пакет представляет собой тесно связанную, динамически загружаемую коллекцию классов, jar-файлов и файлов конфигурации, которые явно объявляют свои внешние зависимости (если есть).

3 голосов
/ 06 января 2009

Пожалуй, самый простой подход - загрузить каждый плагин с собственным загрузчиком классов. Затем откажитесь от загрузчика классов и создайте новый, чтобы перезагрузить плагин. Вам понадобятся методы init () и destroy () в API-интерфейсе плагина, чтобы обеспечить возможность для функций типа запуска / выключения.

Это также имеет преимущество в изоляции плагинов друг от друга.

URLClassLoader является вашей отправной точкой для этого. Общая идея заключается в том, что вы предоставляете суперкласс XxxPlugin, который является любым подклассом плагина. Рассмотрим пример Applet, который по сути является плагином GUI (или Midlet и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...