Bundle状态及转换

来源:互联网 发布:snow拍照软件 编辑:程序博客网 时间:2024/05/13 05:21

http://book.2cto.com/201302/15415.html    可以看看  

深入理解OSGi:Equinox原理、应用与最佳实践


“状态”是Bundle在运行期的一项动态属性,不同状态的Bundle具有不同的行为。生命周期层规范定义了Bundle生命周期过程之中的6种状态,分别是:UNINSTALLED(未安装)、INSTALLED(已安装)、RESOLVED(已解析)、STARTING(启动中)、STOPPING(停止中)、ACTIVE(已激活),它们的含义为:

UNINSTALLED,未安装状态。处于未安装状态的Bundle导出的Package和包含的其他资源都是不可使用的。但是OSGi容器中代表这个Bundle的对象实例仍然可以操作,在某些场景,比如自省(Introspection)中这个对象还是可用的。UNINSTALLED的状态值为整型数1。

INSTALLED,已安装状态。Bundle处于已安装状态就意味着它已经通过OSGi框架的有效性校验(有效性校验的内容可参见第2章中模块层定义的介绍)并产生了Bundle ID,但这时还未对它定义的依赖关系进行解析处理。INSTALLED的状态值为整型数2。

RESOLVED,已解析状态。Bundle处于已解析状态说明OSGi框架已经根据元数据信息中描述的依赖关系成功地在类名空间中找到它所有的依赖包,这时它导出的Package就可以被其他Bundle导入使用。RESOLVED的状态值为整型数4。

STARTING,启动中状态。Bundle处于启动中状态说明它的BundleActivator的start()方法已经被调用,但是还没执行结束。如果start()方法正常执行结束,Bundle将自动转换到ACTIVE状态; 否则,如果start()方法抛出了异常,Bundle将退回到RESOLVED状态。STARTING的状态值为整型数8。

STOPPING,停止中状态。Bundle处于停止中状态说明它的BundleActivator的stop()方法已经被调用,但是还没执行结束。无论stop()是正常结束还是抛出了异常,在这个方法退出之后,Bundle的状态都将转为RESOLVED。STOPPING的状态值为整型数16。

ACTIVE,Bundle处于激活状态,说明BundleActivator的start()方法已经执行完毕,如果没有其他动作,Bundle将继续维持ACTIVE状态。ACTIVE的状态值为整型数32。

OSGi规范定义的部分API接口对Bundle的状态有要求,只有处于特定状态的Bundle才能调用这些API。在代码中可以使用Bundle接口中的getState()方法来检测Bundle目前的状态,示例如下:
import static org.osgi.framework.Bundle.*;
……
Bundle bundle = bundleContext.getBundle();
if((bundle.getState() & (STARTING | ACTIVE | STOPPING)) != 0){
 // 进行某些只允许在STARTING、ACTIVE、STOPPING状态下执行的动作
}

目前Bundle的状态值采用由整型数存储的位掩码(Bit-Mask)来表示,而没有直接采用JDK 1.5后提供的枚举类型。从OSGi R4.3规范开始,规范中定义的标准接口中已经开始使用了部分JDK1.5的语言特性,主要是泛型支持,在对应的实现R4.3规范的Equinox 3.7框架的元数据信息中,运行环境项也升级到了“J2SE-1.5”。不过,其他JDK 1.5中的新语言特性,如注解和枚举,仍然没有被采用。这主要是考虑到已有代码的兼容性,Java基于擦除法实现的范型可以在编译时直接使用Javac的“-target jsr14”转换出能部署在JDK 1.4环境下的代码,而注解、枚举等还需要其他Backport运行库支持才可以。

Bundle状态是动态可变的,上述6种状态可以在特定条件下互相转换,图3-1描述了状态转换的规则和所需的条件,随后笔者将详细解释这些状态的转换过程。




0 0