OSGI:重新绑定捆绑包后,激活和绑定方法更改启动顺序

时间:2020-04-08 08:59:38

标签: java osgi bundle

在我的项目中,我有一个OSGI捆绑包。在此捆绑软件中,我有一个Activated方法和一个bind(to ConfigurationAdmin)方法。

当我第一次运行项目时,首先调用了Activated方法,因此我可以初始化我需要的所有东西,但是如果我停止捆绑软件然后再次启动它,则首先调用bind方法,并且nullpointer(因为尚未调用Activate中的初始化)。

bind方法的引用为“基数= ReferenceCardinality.OPTIONAL,策略= ReferencePolicy.DYNAMIC”

为什么第二次开始更改订单?

@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 个答案:

答案 0 :(得分:1)

绑定方法可以在Activate方法之前称为。实际上,对于静态引用,绑定方法 必须在Activate方法之前被调用。将激活方法视为后构造方法。如果您需要Activate方法作为构造函数,请使用DS 1.4支持的构造函数注入。

答案 1 :(得分:0)

似乎在服务可用时将调用绑定方法。 第一次启动时,调用Activated方法的configurationAdmin尚不可用,但是当我停止捆绑软件然后再次重新启动它时,configurationAdmin是可用的,并且绑定在激活之前被调用。