Динамически (повторно) загружать модуль поставщика услуг - PullRequest
2 голосов
/ 25 мая 2019

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

Следуя совету в этом ответе и примере в документах , мне удалось загрузить модуль во время выполнения и использовать поставщика услуг.

var finder = ModuleFinder.of(Path.of("/path/to/module/"));

var bootLayer = ModuleLayer.boot();
var pluginLayer = bootLayer.defineModulesWithOneLoader(
        bootLayer.configuration().resolve(finder, ModuleFinder.of(), Set.of("myapp")),
        ClassLoader.getSystemClassLoader());

ServiceLoader.load(MyService.class, pluginLayer.findLoader("myapp"))
    .findFirst()
    .ifPresentOrElse(
        __ -> System.out.println("Found provider."),
        () -> System.out.println("Couldn't find provider."));

Единственное, в чем я не уверен, так это в том, как мне в конечном итоге выгрузить модуль и перезагрузить его новую версию. Связанный ответ говорит о том, что выгрузка происходит, когда ModuleLayer является GC'd. После некоторого тестирования я подтвердил это, хотя это кажется очень привередливым. Очевидно, что я не могу точно определить, когда слой будет собирать мусор, даже если он недоступен.

Каков наилучший подход для обеспечения быстрой перезагрузки модуля?

...