Актуализирайте Apache Felix Bundles по време на стартиране на рамката в Java

Така че имам този код, който извиквам, за да актуализирам пакети в Apache Felix Framework по време на стартиране, но актуализирам само пакети, които нарочно съм задал на ниво 7 и по-високо. Всеки път, когато този код се изпълни, актуализираният пакет се премахва от списъка и конзолата виси. Друг път състоянието на актуализирания пакет е ACTIVE, но конзолата също виси.

Arrays.stream(bundleContext.getBundles())
            .filter((bundle) ->  return bundle.adapt(BundleStartLevel.class).getStartLevel() > 6;
            .forEach((Bundle bundle) -> {
                try {
                    this.logger.log(LOG_DEBUG, "updating : " + bundle.getSymbolicName());
                    if (bundle.getState() == Bundle.ACTIVE) {
                        bundle.stop();
                    }
                    bundle.update();
                    bundle.start(Bundle.ACTIVE);
                } catch (BundleException exception) {
                    this.logger.log(LOG_ERROR, "Bundle update for " + name + " failed.", exception);
                }
            });

Има ли подходящ начин за актуализиране на пакети в Apache Felix Framework?


person Marie Antoinette Go    schedule 26.01.2016    source източник
comment
Не е необходимо да спирате пакет, преди да го актуализирате. Просто го актуализирайте и OSGi ще разбере необходимите преходи на състоянието.   -  person Neil Bartlett    schedule 26.01.2016


Отговори (1)


От описанието, което давате, и примерния код е невъзможно да се каже точно какво се обърка:

  • Кога точно се извиква този код?
  • Казвате в описанието си, че се актуализират само пакети, които имат начално ниво от 7 и по-високо. Никъде не го виждам в кода. Всъщност той актуализира само пакети, които имат символично име, равно на name.
  • Няма нужда изобщо да извиквате bundle.stop() и bundle.start(), когато правите актуализацията. Освен това тази логика в този код е погрешна: ако даден пакет не е бил активен преди, той ще стане такъв сега.
  • Ако този код бъде извикан от start метод на `BundleActivator, той може да се опита да се актуализира, което води до всякакви видове непредсказуемо поведение.
person Marcel Offermans    schedule 26.01.2016
comment
Съжалявам, актуализирах моя код, който връща само пакетите с StartLevel по-високо от 6. - person Marie Antoinette Go; 26.01.2016
comment
Мисля, че беше проблем в дизайна. Актуализирах пакетите, които вече са ACTIVE, което е непредвидимо. Трябваше просто да оставя моя пакет от ниво 6 да актуализира всички пакети от ниво 7, преди да бъдат стартирани. Благодаря ви за просветлението. ^_^ :) - person Marie Antoinette Go; 26.01.2016
comment
Актуализирането на АКТИВНИ пакети не води до непредвидимо поведение. Той е напълно предвидим и дефиниран в спецификацията OSGi. - person Neil Bartlett; 26.01.2016
comment
Напълно съм съгласен с Нийл. Това не е проблем с актуализирането на пакети ACTIVE, трябва да е някакъв друг проблем (но без пълен пример, който можем да разгледаме, можем само да гадаем). - person Marcel Offermans; 26.01.2016
comment
В някои случаи, когато актуализирам ACTIVE пакети чрез кода, пакетът се поврежда, но когато използвам конзолата, работи добре. Не знам обаче какво причинява корупцията, ще проуча допълнително проблема. Но наистина се случва. - person Marie Antoinette Go; 28.01.2016
comment
Би било хубаво, ако можете да изпратите някакъв възпроизводим сценарий на разработчиците на рамката, която използвате, тъй като това определено не трябва да се случва. - person Marcel Offermans; 28.01.2016