osgi bundle生命周期问题

时间:2011-07-16 06:57:05

标签: java eclipse osgi bundle equinox

我试着了解osgi的工作原理。我编写了我的第一个hello-world bundle,它在执行bundle activator类的start方法时提供了一些控制台输出。现在,我已经阅读了关于延迟启动机制的内容,并将此标志放入我的捆绑清单中。然后,我启动了equinox控制台,安装了我的软件包并启动了它。但现在我希望我的包被标记为'开始'。但它已经调用它的start方法并被标记为活动。 我对懒惰的启动机制有什么不妥吗?

2 个答案:

答案 0 :(得分:8)

当您拥有其他捆绑包时,会使用lazy-start标志,这些捆绑包依赖于捆绑包中的捆绑包和类。

假设您有两个捆绑A和B,其中

  • A导出C类
  • B取决于A
  • B包含引用C
  • 的D类

捆绑B被激活后会发生什么?

没有延迟加载标志,首先加载并激活A包。

使用延迟加载标志,在D类需要引用C类之前,不会加载或激活A包。

这可以在激活配置文件中产生很大的不同,因为捆绑的加载和激活被推迟到延迟加载标志发生,所以来自捆绑包的初始响应非常快...... / p>

相反,这个标志也使得很难推断B中方法的执行时间,因为这可以随时加载和激活bundle来拦截....

答案 1 :(得分:3)

你说过,你已经在安装后启动了捆绑包 - 如果手动启动捆绑包,无论延迟激活策略如何都会激活它。

根据the OSGi specification,以下情况适用于激活:

  

延迟激活策略表示捆绑包一旦启动,就必须   从类加载类之前不会被激活;要么正常   类加载或通过Bundle loadClass方法。资源加载   不会触发激活。这种改变来自默认的渴望   激活策略反映在捆绑包的状态及其中   事件。使用延迟激活策略启动捆绑包时,   必须采取以下步骤:

     
      
  • 为捆绑包创建捆绑上下文。
  •   
  • 捆绑状态将移至STARTING状态。
  •   
  • 触发了LAZY_ACTIVATION事件。
  •   
  • 系统等待捆绑包中的类加载发生。
  •   
  • 正常的STARTING事件被触发。
  •   
  • 捆绑已激活。
  •   
  • 捆绑状态将移至ACTIVE。
  •   
  • STARTED事件被触发。
  •   
     

如果激活因Bundle Activator start方法失败而失败   抛出一个异常,必须在不调用的情况下停止bundle   Bundle Activator停止方法。这些步骤如流程图所示   在图4.29中。该流程图还显示了差异   正常的急切激活和懒惰的激活策略   活化。

更新:因为我不能说我在编写答案的时候打开了哪个版本的规范(但是,我相信,它是4.2或4.3),我已检查了当前,v5.0规范和4.4.6.2节包含实际的,语义上等效的地方。