OSGI StartLevel explained and using 启动级别机制和使用
bundle startlevel
实际的应用环境中,我们的 bundle 互相有一定的依赖关系,所以在启动的顺序上要有所区别,好比盖楼,
要从打地基开始。
实际上,OSGi 框架最初的 start level 是 0,
启动顺序如下:将启动级别加一,如果发现有匹配的 bundle
(即 bundle 的启动级别和目前的启动级别相等),则启动这个 bundle;
继续第一步,直到发现已经启动了所有的 bundle,且活动启动级别和最后的启动的 bundle 启动级别相同。
停止顺序,也是首先将系统的 start level 设置为 0:
由于系统当前活动启动级别大于请求的 start level,所以系统首先停止等于当前活动启动级别的 bundle;
将活动启动级别减一,继续第一步,直到发现活动启动级别和请求级别相等,都是 0。
1静态的设置系统和各Bundle的启动级别,在启动系统时,OSGI框架将按照各Bundle
的启动级别从小到大的启动,如启动级别相同,则按照Bundle ID从小到大的启动,一直启动到系统的启
动级别为止。
configration
config.ini
reference\:file\:bundles/fdsf.jar@4:start //@4:start用于分别设置
osgi.startLevel=
//静态的设置基于OSGI的应用系统的启动级别(不是system bundles(sb) ,sb == 0 forever!),默认
为6
osgi.bundles.defaultStartLevel=
// 静态的设置各个bundles的启动级别,默认为4
要保证“应用系统”的启动级别大于所有需要bundles的启动级别才能使应用系统正常运行!
总之记住:
系统是按照从小到大的level启动的,如果是相等的level,根据id从小到大启动就ok了!
2动态的设置start level
动态的设置系统和各Bundle的启动级别
动态的设置系统和各Bundle的启动级别可通过在运行时调用StartLevelService来实现。
同样的,既然要使用StartLevelService,先打开MANIFEST.MF,在import packages中
import org.osgi.service.startlevel,
通过BundleContext获取StartLevelService:
ServiceReference serviceRef=bc.getServiceReference(StartLevel.class.getName());
StartLevel startLevelSrv=(StartLevel) bc.getService(serviceRef);
StartLevel提供了管理系统和各Bundle启动级别的API:
?? getBundleStartLevel(Bundle bundle)
获取Bundle的启动级别。
?? getInitialBundleStartLevel()
获取默认的Bundle的启动级别。
?? getStartLevel()
获取系统的启动级别。
?? setBundleStartLevel(Bundle bundle,int startLevel)
设置Bundle的启动级别,如设置的启动级别高于系统的启动级别,那么OSGI框架将会停止此Bundle,如设
置的启动级别低于系统的启动级别,如此时Bundle尚未启动,OSGI框架则会启动此Bundle,如已启动,
OSGI框架不会做任何动作。
?? setInitialBundleStartLevel(int startLevel)
设置Bundle的默认启动级别,对于新安装的Bundle将使用此默认启动级别。
?? setStartLevel(int startLevel)
设置系统的启动级别。
如设置的系统启动级别和目前系统的启动级别一致,则OSGI框架会发布 FrameworkEvent.STARTLEVEL_CHANGED的事件;
如设置的系统启动级别比目前的系统启动级别低,那么OSGI框架将现有的启动级别按1递减,
并停止相应启动级别的Bundle,直至设置的系统启动级别,当系统的启动级别和设置的启动
级别一致时,OSGI框架会发布FrameworkEvent.STARTLEVEL_CHANGED的事件;
如设置的系统启动级别比目前的系统启动级别高,那么OSGI框架将现有的启动级别按1递增,
并启动相应启动级别的Bundle,直至设置的系统启动级别,当系统的启动级别和设置的启动
级别一致时,OSGI框架会发布FrameworkEvent.STARTLEVEL_CHANGED的事件。
这些的应用很多哦,典型的就是系统启动前的闪屏,你可以将它的启动级别设置到“最低”!