OSGI: методы Activate и Bind изменяют порядок запуска после перезапуска пакета - PullRequest
0 голосов
/ 08 апреля 2020

в моем проекте у меня есть пакет OSGI. В этом комплекте у меня есть метод Activated и метод привязки (к ConfigurationAdmin).

Когда я запускаю проект в первый раз, сначала вызывается метод Activated, поэтому я могу инициализировать все, что мне нужно, но если я останавливаю пакет и затем снова запускаю его, сначала вызывается метод связывания, и у меня есть нулевой указатель (потому что инициализации в Activate еще не вызваны).

Ссылка на метод связывания - "cardinality = ReferenceCardinality" .OPTIONAL, policy = ReferencePolicy.DYNAMI C "

Почему при запуске во второй раз изменяется порядок?

@Component(configurationPid = "ConsulService", immediate = true, service = ConsulService.class)
public class ConsulServiceImpl implements ConsulService {

private ConfigurationAdmin configurationAdmin;
private BundleContext context;
private Consul consul;

@Override
public AgentClient agentClient() {
    return consul.agentClient();
}

@Override
public KeyValueClient keyValueAgent() {
    return consul.keyValueClient();
}

@Activate
public void activate(BundleContext bundleContext) {
//this cause the nullpointer after the stop and the restarting of this bundle
//since this method is not called "consul" is null
    this.consul = Consul.builder().build();
    this.context = bundleContext;
}

...

@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, unbind = "unbindConfigurationAdmin")
public void bindConfigurationAdmin(final ConfigurationAdmin configurationAdmin) {
    this.configurationAdmin = configurationAdmin;
    // Here I have nullpointer because consul is not initializated 
    KeyValueClient keyValueAgent = keyValueAgent();
    ...
}

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Методы привязки можно вызвать до метода активации. На самом деле, методы связывания должны вызываться перед активацией метода для ссылок c. Думайте о методе активации как о методе пост-конструкции. Если вам требуется, чтобы ваш метод активации был вашим конструктором, то используйте внедрение конструктора, которое поддерживается в DS 1.4.

0 голосов
/ 09 апреля 2020

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

...