Java OSGI:Activate和Bind方法在重新启动捆绑包后更改启动顺序

Java OSGI:Activate和Bind方法在重新启动捆绑包后更改启动顺序,java,osgi,bundle,Java,Osgi,Bundle,在我的项目中,我有一个OSGI包。在这个捆绑包中,我有一个激活的方法和一个绑定(到ConfigurationAdmin)方法 当我第一次运行项目时,首先调用Activated方法,这样我就可以初始化所有需要的东西,但是如果我停止bundle,然后再次启动它,则首先调用bind方法,并且我有一个null指针(因为Activate中的初始化尚未调用) bind方法的引用是“cardinality=ReferenceCardinality.OPTIONAL,policy=ReferencePolicy

在我的项目中,我有一个OSGI包。在这个捆绑包中,我有一个激活的方法和一个绑定(到ConfigurationAdmin)方法

当我第一次运行项目时,首先调用Activated方法,这样我就可以初始化所有需要的东西,但是如果我停止bundle,然后再次启动它,则首先调用bind方法,并且我有一个null指针(因为Activate中的初始化尚未调用)

bind方法的引用是“cardinality=ReferenceCardinality.OPTIONAL,policy=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();
    ...
}

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

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

您停止的是哪个捆绑?包含组件的捆绑包或承载绑定到的服务的捆绑包?嗨,Christian,我停止包含组件的捆绑包。ConfigurationAdmin是OSGISounds strange提供的一项服务。。你能显示组件的相关代码吗?我已经用代码编辑了我的问题。我正在使用DS 1.3,它似乎不受支持