Как я могу уничтожить все компоненты проекта OSGi до остановки инфраструктуры OSGi? - PullRequest
0 голосов
/ 15 октября 2018

Если я остановлю каркас OSGi, компоненты проекта OSGi не будут уничтожены (методы уничтожения не вызываются).Почему это так и как я могу их уничтожить.У меня есть собственная реализация запуска OSGi.Я использую хук завершения работы, а затем останавливаю среду OSGi:

Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        Launcher.logService.log(LogService.LOG_WARNING, "HANDLE SHUTDOWN");
        if(Launcher.framework != null) {
            try {
                Launcher.framework.stop();
            } catch (BundleException e) {
                Launcher.logService.log(LogService.LOG_ERROR, "Shutdown" + ((Launcher.framework != null) ? " of " + Launcher.framework.getSymbolicName() + " " : " ") + "failed!", e);
                System.exit(-1);
            }
        }
    }
});

1 Ответ

0 голосов
/ 16 октября 2018

Мы должны дождаться остановки каркаса.

Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        Launcher.logService.log(LogService.LOG_WARNING, "HANDLE SHUTDOWN");
        if(Launcher.framework != null) {
            try {
                Launcher.framework.stop();
                Launcher.framework.waitForStop(0); // !!!
            } catch (BundleException e) {
                Launcher.logService.log(LogService.LOG_ERROR, "Shutdown" + ((Launcher.framework != null) ? " of " + Launcher.framework.getSymbolicName() + " " : " ") + "failed!", e);
                System.exit(-1);
            }
        }
    }
});
...