繁体   English   中英

如何检测bundle是否在osgi容器中完全加载?

[英]how to detect if a bundle is completely loaded in osgi container?

是否有任何类型的事件侦听器,如BundleEvent类中的事件侦听器,用于检测bundle是否已完全加载并可用于请求?

我做了一个搜索,我能找到的就是这个

不使用事件监听器,意味着我需要手动或定期检查(我没有测试那段代码。

有没有像BundleEvent.STARTING这样的事件来进行加载操作? 或者我们需要自己实施(如果可能的话)?

OSGi框架无法知道您的捆绑包何时“准备好”用于业务。 框架当然可以确保解析bundle的代码依赖性以允许加载类。 但是框架无法知道任何其他依赖项。 只有您的捆绑包可以知道何时可以开展业务。 您可以通过注册表示此功能的服务来宣传这一点。

正如BJ所提到的,一种选择是使用OSGi服务。 例如,捆绑包B将等待服务出现。 当捆绑包A准备好(例如,激活完成)时,它注册服务。 这将通知捆绑包B.您可以使用ServiceTracker

另一种选择是使用BundleTracker 在包B的激活,你可以注册一个BundleTracker是获取通知STARTED捆绑的状态。 但是,您还希望监视其他状态,以便在捆绑包消失时发现。

在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;
   }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM