Я пытаюсь отладить проблему, которая, по-видимому, вызвана странным поведением одного из моих компонентов OSGi во время отключения оболочки.
Когда я пытаюсь закрыть фреймворк, позвонив
context.getBundle(0).shutdown()
Мой компонент деактивируется, но по какой-то причине он снова активируется, а затем снова деактивируется. Второй цикл активации/деактивации вызывает некоторое странное поведение, потому что компонент регистрируется с помощью "контейнера пользовательского интерфейса", который вызывает мерцание в пользовательском интерфейсе приложения во время выключения.
Мой вопрос в том, что может вызвать второй цикл активации/дезактивации?
Я использую декларативные сервисы Maven, Apache Felix и плагин SCR.
Ниже приведенные ссылки относятся к трассировке стека из методов деактивации/повторной активации/деактивации, которые, если они запрашиваются в ответе ниже:
Я пишу ответ, поскольку он длиннее комментария (и это может быть ответ):
Чтобы узнать, действительно ли это так, вставьте свои функции активации и деактивации в следующем порядке:
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, чтобы вычислить флаг реактивизации таким образом, что если системный пакет находится в состоянии остановки, он не должен повторно активировать компонент.