【问题标题】:how to detect if a bundle is completely loaded in osgi container?如何检测捆绑包是否已完全加载到 osgi 容器中?
【发布时间】:2012-08-31 01:19:44
【问题描述】:

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

我进行了搜索,我只能找到this

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

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

【问题讨论】:

  • 你想做什么?如果您使用该捆绑包中的服务,您将在它们可用或消失时收到通知。为什么需要检测捆绑包本身?
  • 基本上我想做的是,检测捆绑包是否完全加载到容器中并且可用于任何即将到来的请求......例如,假设我正在部署一些捆绑包,如捆绑包 A 和捆绑包B,通过脚本,而 B 依赖于 A 的某些服务。因此,在部署或运行​​它们时,B 需要等到 A 完全可用。我想知道如果包 A 已完全加载,是否有任何方法可以通知我们,以便脚本可以继续部署包 B。

标签: java osgi loading soa


【解决方案1】:

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

第二种依赖更加动态,当它们发生变化时,你的代码应该能够在运行时处理它们。在 OSGi 中,这些依赖关系是最好表达的服务。使用声明式服务(特别是带有注释),依赖他人是微不足道的(请不要为此使用 Service Tracker,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;
   }

}

【讨论】:

    【解决方案2】:

    OSGi 框架无法知道您的包何时“准备好”用于业务。该框架当然可以确保您的包的代码依赖关系被解析以允许加载类。但是框架不知道任何其他依赖项。只有您的捆绑包才能知道它何时可以投入使用。您可以通过注册一个表示这一点的服务来让它宣传这一点。

    【讨论】:

      【解决方案3】:

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

      另一种选择是使用BundleTracker。在bundle B 的激活器中,您可以注册一个BundleTracker,它会收到关于bundle 状态STARTED 的通知。但是,您还希望监控其他状态,以便发现捆绑包何时消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 2017-09-08
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多