OSGi 探秘系列 (3)- 浅谈OSGi 架构及Bundle的生命周期

时间:2021-07-19 09:00:00

在这篇文章中,我将高层次地介绍OSGi的架构以及Bundle的生命周期,相信大家读完这篇以后,可以对OSGi有个高屋建瓴的认识。

 

OSGi的架构如下图所示,主要包括以下几个层次:执行环境(Execution Environment), 模块(Modules), 生命周期(Life Cycle), 服务(Services)和安全(Security)等几个层次。

 

OSGi 探秘系列 (3)- 浅谈OSGi 架构及Bundle的生命周期

 

执行环境层次 主要定义了在具体的执行环境平台中,哪些方法和类可以被上面几个层次访问。模块层次 是OSGi的核心层次,定义了Bundle的模型,Bundle如何Import和Export代码,以及如何定义和解析Bundle之间的依赖关系。生命周期层次 定义了Bundle的生命周期包括的状态以及状态之间如何转换,并且定义了接口支持Bundle的生命周期操作,包括Install, start, stop, update和uninstall。OSGi提供了Bundle库(Bundle Repository), 服务层次 定义了如何将一个Java对象注册发布在某个/某些接口下面成为由这些接口表示的服务,获取服务,以及监听某些服务的启动和停止事件等等。安全层次 定义了如何签名和验证一个Bundle。

 

Bundle的生命周期如下图所示,分为INSTALLED, RESOLVED, UNINSTALLED, STARTING, ACTIVE和STOPPING状态。

 

OSGi 探秘系列 (3)- 浅谈OSGi 架构及Bundle的生命周期

 

1 当用户执行install命令后,Bundle就被安装在OSGi平台上并进入INSTALLED状态。

2 当我们执行start命令时,OSGi平台会首先执行resolve操作。如果操作成功,Bundle就会进入RESOLVED状态。一个Bundle进入RESOLVED状态表示Bundle所有需要的条件都满足了,包括以下三个方面:1)Java运行环境满足或者超出Bundle的运行需求;2)Bundle所声明导入的包都由所依赖的插件导出了并且版本一致;3)Bundle所依赖的插件都可以访问并且处于RESOLVED状态,或者能够与该Bundle同时处于RESOLVED状态。

3 无论是在INSTALLED状态还是RESOLVED状态,执行refresh或者update操作都会使Bundle进入INSTALLED状态。

4 Bundle进入RESOLVED状态后,start命令会使Bundle进入Starting状态。在这个状态中,Bundle Activator的start()方法会被执行,用于分配或获取需要的资源。这个过程应该尽量的短,使得Bundle能够快速启动起来。当启动操作执行完毕后,Bundle会自动进入到ACTIVE状态。

5 在ACTIVE状态的Bundle如果被执行stop命令,Bundle就会进入Stopping状态。在这个状态中,Bundle Activator的stop()方法会被执行,用于释放在Bundle启动时所分配或者获取的资源。当停止操作完成后,Bundle会自动进入RESOLVED状态。

6 无论是在INSTALLED状态还是RESOLVED状态,执行uninstall操作都会使Bundle进入UNINSTALLED状态。