考虑以下课程:
@Service(MyTest.class)
public class MyTest{
@Reference
ExternalService externalService;
@Activate
public void activate(){
externalService.someMethod();
}
}
OSGi是否保证在externalService
类的activate()
方法中调用之前MyTest
已经激活?
答案 0 :(得分:0)
ExternalService不是组件,而是OSGi服务。 OSGi服务可能已由另一个组件注册。
如果服务是由其他组件自动注册的(在您的示例中使用@Service注释),则必须在注册服务之前调用其他组件的activate方法。但是,如果在您的activate方法中使用断点,则可能会在Web控制台上看到未满足状态的其他组件。原因是 MyTest 的activate方法被同步调用,而另一个组件的状态标志尚未被DS更改。简而言之,即使您看到其他组件的状态未被满足,也会在调用组件的Activate方法时完成组件的Activate方法。
如果从另一个组件的Activate方法以编程方式注册该服务,则可能会同步调用您的activate方法。在这种情况下,如果在注册服务后其他组件的activate方法中有更多逻辑,则它尚未初始化。
OSGi服务也可能是由其他技术注册的,也可能是从另一个包的Activator手动注册的。
答案 1 :(得分:0)
有助于查看从注释生成的组件XML。 Service
注释不是OSGi声明服务标准注释。
但通常,必须在调用activate方法之前设置所有非可选的policy="static"
引用。可以取消设置可选参考。