Java 如何检测捆绑包是否完全加载到osgi容器中?

Java 如何检测捆绑包是否完全加载到osgi容器中?,java,osgi,loading,soa,Java,Osgi,Loading,Soa,是否有类似BundleEvent类中的事件侦听器之类的事件侦听器,用于检测捆绑包是否已完全加载并可用于请求 我搜索了一下,我能找到的只有 它不使用事件监听器,这意味着我需要手动或定期检查(顺便说一下,我没有测试那段代码) 是否有BundleEvent.STARTING之类的事件用于加载操作?或者我们需要自己实现一个(如果可能)?OSGi框架无法知道捆绑包何时“准备就绪”对于业务。框架当然可以确保您的捆绑包的代码依赖关系得到解析,以允许加载类。但是任何其他依赖关系都是框架不知道的。只有您的捆绑包可

是否有类似BundleEvent类中的事件侦听器之类的事件侦听器,用于检测捆绑包是否已完全加载并可用于请求

我搜索了一下,我能找到的只有

它不使用事件监听器,这意味着我需要手动或定期检查(顺便说一下,我没有测试那段代码)


是否有BundleEvent.STARTING之类的事件用于加载操作?或者我们需要自己实现一个(如果可能)?

OSGi框架无法知道捆绑包何时“准备就绪”对于业务。框架当然可以确保您的捆绑包的代码依赖关系得到解析,以允许加载类。但是任何其他依赖关系都是框架不知道的。只有您的捆绑包可以知道它何时准备好进行业务。您可以让它公布这一点,或者注册一个表示这一点的服务。

作为BJ如上所述,一个选项是使用OSGi服务。例如,捆绑包B将等待服务出现。当捆绑包a准备就绪(例如,激活完成)时,它将注册一个服务。这将通知捆绑包B。您可以使用
ServiceTracker
进行此操作


另一个选项是使用
BundleTracker
。在bundle B的激活器中,您可以注册一个
BundleTracker
,它会收到关于
已启动
捆绑包状态的通知。但是,您还需要监视其他状态,以便发现捆绑包何时消失。

在OSGi中,有两种依赖关系。第一种是kind基本上是设置一个环境,使您的捆绑包可以安全地运行。这包括代码依赖项和您可以在清单中表达的其他依赖项。框架确保在解析捆绑包之前满足这些依赖项。如果不满足这些依赖项,您将无法运行单个指令

第二种依赖关系更具动态性,当它们发生变化时,您的代码应该能够在运行时处理它们。在OSGi中,这些依赖关系是表达最好的服务。对于声明性服务(特别是带有注释的服务),依赖其他服务是微不足道的(请,请不要为此使用服务跟踪器,DS是非常非常优越的)

因此,正如其他响应者所说,就绪在旁观者眼中。在OSGi中,当您表达您对服务的依赖时,问题从捆绑包就绪转移到:是否存在服务X?只要服务X的注册器也遵循这些规则,您就有一个非常健壮和有弹性的应用程序模型。因为框架d 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;
   }

}

你想做什么?如果你使用该捆绑包中的服务,当它们可用或消失时,你会收到通知。为什么你需要检测捆绑包本身?基本上我想做的是,检测捆绑包是否完全加载到容器中,并且可以满足任何需求…例如,让我们说我是dep通过一个脚本来加载一些捆绑包,如捆绑包A和捆绑包B,而B依赖于A提供的一些服务。因此,在部署或运行它们时,B需要等到A完全可用。我想知道,如果捆绑包A完全加载,是否有任何方法可以通知我们,以便脚本可以继续部署捆绑包B。