Отладка проблемы активации / деактивации компонента OSGi

1

Я пытаюсь отладить проблему, которая, по-видимому, вызвана странным поведением одного из моих компонентов OSGi во время отключения оболочки.

Когда я пытаюсь закрыть фреймворк, позвонив

context.getBundle(0).shutdown()

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

Мой вопрос в том, что может вызвать второй цикл активации/дезактивации?

Я использую декларативные сервисы Maven, Apache Felix и плагин SCR.


Ниже приведенные ссылки относятся к трассировке стека из методов деактивации/повторной активации/деактивации, которые, если они запрашиваются в ответе ниже:

деактивировать stacktrace

повторно активировать stacktrace

деактивировать stacktrace

  • 1
    Возможно, у вас есть какие-либо циклические зависимости, или 2 разных пакета предоставляют версию пакета, которая может удовлетворить зависимость вашего пакета.
  • 0
    @white белый, я не думаю, что у меня есть циклические зависимости, которые могли бы вызвать сбой приложения при запуске. Не могли бы вы объяснить более подробно, что вы имеете в виду под "2 разных комплекта ..."?
Показать ещё 3 комментария
Теги:
osgi
apache-felix

1 ответ

2
Лучший ответ

Я пишу ответ, поскольку он длиннее комментария (и это может быть ответ):

  • ConfigAdmin останавливается перед DS и пакетом, который содержит ваш компонент
  • Когда ConfigAdmin останавливается, он запускает событие, когда конфигурация недоступна
  • Ваш компонент настроен таким образом, что конфигурация не требуется, поэтому он останавливается из-за того, что уже существующая конфигурация исчезает и повторно активируется, так как конфигурация не требуется для компонента

Чтобы узнать, действительно ли это так, вставьте свои функции активации и деактивации в следующем порядке:

Thread.dumpStack();

Затем скопируйте трассировки стека в свой вопрос.

Если это так, вы можете решить эту проблему, установив политику конфигурации на свой компонент.

Обновить

Что я сделал (и вы тоже можете сделать), чтобы сравнить трассировку стека дезактивации и реактивации. Вы найдете полезную информацию, где начинаются различия.

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

Одна из его зависимостей (ссылка исчезает), но другая удовлетворяет компоненту.

Интересной частью трассировки стека реактивации является следующее:

at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:972)
at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:134)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:1024)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:818)
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:946)
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:871)
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1503)

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

at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:946)

Узнайте, почему флаг Возобновить в исходном коде имеет истинное значение и значение serviceReference параметра removedService функции. Узнайте также в отладочном представлении, в котором вы находитесь в этой точке трассировки стека. В результате вы узнаете, какой компонент реактивирован и на основе какой ссылки на службу. Вы можете переконфигурировать компонент для подключения только уникальной справочной службы.

Я также хотел бы написать письмо в список рассылки felix, чтобы вычислить флаг реактивизации таким образом, что если системный пакет находится в состоянии остановки, он не должен повторно активировать компонент.

  • 0
    Я добавил запрошенные вами следы стека, что именно я должен искать?
  • 0
    обновил ответ
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню