是否有任何类型的事件侦听器,如BundleEvent类中的事件侦听器,用于检测bundle是否已完全加载并可用于请求?
我进行了搜索,我找到的只有this
不使用事件监听器,意味着我需要手动或定期检查(顺便说一句,我没有测试那段代码。
是否有任何事件如BundleEvent.STARTING用于加载操作?或者我们需要自己实施(如果可能的话)?
答案 0 :(得分:3)
OSGi框架无法知道您的捆绑包何时“准备好”用于业务。框架当然可以确保解析bundle的代码依赖性以允许加载类。但是框架无法知道任何其他依赖项。只有您的捆绑包可以知道何时可以开展业务。你可以通过注册一个表示这个的服务来宣传这个。
答案 1 :(得分:3)
正如BJ所提到的,一种选择是使用OSGi服务。例如,捆绑包B将等待服务出现。当捆绑包A准备好(例如,激活完成)时,它注册服务。这将通知捆绑包B.您可以使用ServiceTracker
。
另一种选择是使用BundleTracker
。在B组的激活器中,您可以注册BundleTracker
,该STARTED
会收到{{1}}捆绑包状态的通知。但是,您还希望监视其他状态,以便在捆绑包消失时发现。
答案 2 :(得分:2)
在OSGi中,有两种依赖关系。第一种基本上是设置一个环境,在这种环境中你的bundle可以安全地运行。这包括您可以在清单中表达的代码依赖性和其他依赖项。该框架确保在解析捆绑包之前满足这些依赖关系。如果不满足这些依赖关系,您将无法运行单个指令。
第二种依赖关系更具动态性,您的代码应该能够在运行时更改时处理它们。在OSGi中,这些依赖关系是表达最好的服务。使用声明性服务(特别是注释),依赖其他人是微不足道的(请不要使用服务跟踪器,DS远远超出优势)。
正如其他响应者所说,准备就绪在旁观者的眼中。在OSGi中,当您表达对服务的依赖关系时,问题从捆绑包中移开已经准备就绪,以便:是否有服务X?只要服务X的注册商遵循这些规则,您就拥有一个非常强大且有弹性的应用程序模型。由于框架和DS严格遵循生命周期规则,因此在单个模型中捆绑包准备好或不崩溃的原因有很多种:服务。
简短示例,服务Y取决于服务X:
@Component
public class YImpl implements Y {
@Activate
void activate() { /* only called when X is registered */ }
@Reference
void setX( X x ) {
this.x = x;
}
}