Поменять местами логику в работающей системе - PullRequest
2 голосов
/ 03 марта 2009

Я хочу разработать эту систему, которая состоит из двух основных компонентов:

  1. База / основной материал. Никогда не меняется.
  2. Материал работает на ядре. Изменения довольно часто.

Это будет разработано в Java, но проблема относится к любому классическому языку ОО. Как я могу заменить 2 выше в работающей системе без перекомпиляции 1 и даже без остановки 1 во время работы. Это нормально, чтобы перекомпилировать 2, но я не должен беспокоить 1.

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

Ответы [ 8 ]

6 голосов
/ 03 марта 2009

Без дополнительной информации трудно ответить ... но вы можете проверить OSGi в качестве отправной точки для некоторых идей.

2 голосов
/ 03 марта 2009

Я однажды сделал нечто похожее на вашу цель, используя JRuby поверх Java. Основная часть была на Java и всегда будет работать, а сценарии Ruby загружались динамически с использованием JRuby. Таким образом, я мог бы добавить функциональность без перезапуска (или компиляции) части Java.

2 голосов
/ 03 марта 2009

Это в основном то, для чего нужно отражение. Как уже говорили другие, если вы будете следовать какой-то схеме подключений или подключаемых модулей, это поможет вам в большинстве случаев. В основном это выглядит так:

  1. Создайте четко определенные интерфейсы в своем коде, которые описывают контракт между основным приложением и плагином.
  2. Разработайте способ хранения информации о jar / классе в вашей конфигурации, чтобы вы могли загружать типы посредством отражения во время выполнения
  3. Загрузка плагинов с помощью методов отражения и вызова на интерфейсах, описанных в # 1

Теперь, если вы начнете увязать в реализации рабочего процесса, тогда, возможно, пришло время исследовать готовый механизм рабочего процесса. Здесь слишком много упоминаний, но поиск в Google должен помочь вам начать.

2 голосов
/ 03 марта 2009

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

Я бы посоветовал вам начать с изучения исходного кода Tomcat (, доступного по этим URL-адресам подрывной деятельности .)

2 голосов
/ 03 марта 2009

Вам понадобится шаблон плагинов для часто меняющихся вещей в сочетании с некоторым интерфейсом для перезапуска плагинов. Ваше ядро ​​/ база (1) будет отвечать за динамическую загрузку сборок / фляг, которые содержат часто меняющиеся вещи (2).

2 голосов
/ 03 марта 2009

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

1 голос
/ 04 марта 2009

Очевидно, что это именно то, что было разработано для чего-то вроде Eclipse; они создали фреймворк для плагинов с использованием OSGi.

Тем не менее, я бы пошел на язык сценариев, который может работать на JVM, таких как Jython, Rhino / JavaScript или JRuby. Фреймворки, такие как Spring , теперь поддерживают возможность определять bean-компоненты на этих языках и динамически перекомпилировать их.

Они, вероятно, будут широко внедрены в будущем, поскольку в JVM появится больше поддержки динамических языков (помимо сценариев JDK6).

1 голос
/ 03 марта 2009

Достаточно легко разделить ваш исходный код на два дерева. Скомпилированные формы могут быть доставлены отдельно, а неосновные компоненты скомпилированы с добавлением ядра в -classpath.

Код может быть загружен во время выполнения с помощью загрузчиков классов (URLClassLoader.newInstance). Вы должны быть осторожны, чтобы получить старый код для выгрузки. Вы должны удостовериться, что нет абсолютно никаких (сильных) ссылок на него.

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