1 生命周期管理
OSGi生命周期管理
OSGi生命周期层有两种不同的作用:
- 在应用程序外部,定义了对bundle生命周期的相关操作。OSGi生命周期层允许在执行时,从外部安装、启动、更新、停止、卸载不同的bundle,进而定制应用的配置。
- 在应用程序内部,定义了bundle访问其执行上下文的方式,为bundle提供了一种与OSGi框架交互的途径以及一些执行时的便利条件。
标准Java生命周期管理
Servlet生命周期管理
生命周期由servlet容器管理
2 生命周期层的三个接口
BundleActivator
还必须在MANIFEST.MF中描述该bundle激活器:
- 当bundle被安装并启动以后,框架将构建相应的BundleActivator的一个实例,触发BundleActivator.start();
- 当bundle停止后,框架会调用BundleActivator.stop();stop()方法应该取消start()中执行过的所有操作。
public void start(BundleContext context) throws Exception;
public void stop(BundleContext context) throws Exception;
}
BundleContext
BundleActivator的两个方法都接受一个BundleContext对象作为参数。BundleContext是bundle与OSGi framework通信的桥梁。BundleContext可以做的事有:
- Look up system-wide configuration properties;
——获取系统properties - Find another installed bundle by its ID;
——通过ID查询已安装的其他bundle - Obtain a list of all installed bundles;
——获取已安装的bundle列表 - Introspect and manipulate other bundles programmatically: start them, stop them, un-install them, update them, etc;
——在程序中操作其他bundle(启动、停止、卸载、更新) - Install new bundles programmatically;
——在程序中安装新bundle - Store or retrieve a file in a persistent storage area managed by the framework;
——往框架管理的持久化存储区中存储或查询文件 - Register and unregister bundle listeners, which tell us when the state of any bundle in the framework changes;
——注册bundle listener,监听bundle状态的改变 - Register and unregister service listeners, which tell us when the state of any service in the framework changes
——注册service listener,监听service状态的改变 - Register and unregister framework listeners, which tell us about general framework events.
——注册framework listener,监听一般框架事件
每个已激活的bundle都会接收到属于自己的BundleContext对象,该对象不能在bundle直接自由传递!
只有当bundle处于激活状态(从start()开始,到stop()结束),BundleContext对象才是有效的。其他状态下调用该对象,会抛出异常。
String getProperty(String key);
Bundle getBundle();
Bundle getBundle( long id);
Bundle[] getBundles();
Bundle installBundle(String location) throws BundleException;
Bundle installBundle(String location, InputStream input) throws BundleException;
void addBundleListener(BundleListener listener);
void removeBundleListener(BundleListener listener);
void addFrameworkListener(FrameworkListener listener);
void removeFrameworkListener(FrameworkListener listener);
}
Bundle
对于每个已安装的bundle,框架都会相应地创建一个逻辑上代表他的Bundle对象。Bundle接口定义了一系列API,用于管理已安装bundle的生命周期。
BundleContext getBundleContext();
long getBundleId();
Dictionary getHeaders();
int getState();
String getSymbolicName();
Version getVersion();
void start( int options) throws BundleException;
void start() throws BundleException;
void stop( int options) throws BundleException;
void stop() throws BundleException;
void update(InputStream input) throws BundleException;
void update() throws BundleException;
void uninstall() throws BundleException;
}
注意:BundleId=0的bundle表示OSGi框架本身,称为系统bundle。
当停止系统bundle时,它会首先停止其他bundle,然后才将自身完全关闭;以友好的方式关闭框架。
3 生命周期状态
INSTALLED
调用BundleContext.installBundle()后,会创建一个INSTALLED状态的bundle
RESOLVED
如果其所依赖的所有bundle都存在,即解析成功,转到RESOLVED状态
注意:不能直接从INSTALLED --> STARTING
STARTING
当开始执行BundleActivator.start(),则处于STARTING状态;
注意:这是一个瞬时状态
ACTIVE
当执行BundleActivator.start()成功,则转到ACTIVE状态;
如果抛出异常,则回到RESOLVED状态。
STOPPING
当开始执行BundleActivator.stop(),则处于STOPPING状态;
UNINSTALLED
INSTALLED状态的bundle可以被卸载,转到UNINSTALLED状态;
如果卸载一个ACTIVE状态的bundle,则框架会首先自动停止该bundle,使其转到RESOLVED状态;然后再卸载之前,将其状态转为INSTALLED。
刷新/更新
刷新或更新一个bundle,将使其状态退回INSTALLED状态!