Обновление пакетов Apache Felix во время запуска фреймворка в 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
Обновление пакетов ACTIVE не приводит к непредсказуемому поведению. Это совершенно предсказуемо и определено в спецификации 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