OSGI 生命周期
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状态!
OSGI 生命周期的更多相关文章
- 【OSGi】OSGi生命周期
1 生命周期管理 对于非模块化应用,生命周期将应用作为一个整体来操作: 而对于模块化应用,则可以以细粒度的方式来管理应用的某一个独立部分. OSGi生命周期管理 OSGi生命周期层有两种不同的作用: ...
- 转:OSGi 入门篇:生命周期层
OSGi 入门篇:生命周期层 前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或 ...
- osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo
生命周期中关键3个类: BundleActivator 入口点,类似main方法 BundleContext Bundle上下文对象,在执行期间,为应用程序提供操作osgi框架的方法 Bundle 代 ...
- OSGi:生命周期层
前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或者两者的结合),并且给了应用本 ...
- 深入理解java虚拟机【Java虚拟机类生命周期】
C/C++等纯编译语言从源码到最终执行一般要经历:编译.连接和运行三个阶段,连接是在编译期间完成,而java在编译期间仅仅是将源码编译为Java虚拟机可以识别的字节码Class类文件,Java虚拟机对 ...
- (转)《深入理解java虚拟机》学习笔记7——Java虚拟机类生命周期
C/C++等纯编译语言从源码到最终执行一般要经历:编译.连接和运行三个阶段,连接是在编译期间完成,而java在编译期间仅仅是将源码编译为Java虚拟机可以识别的字节码Class类文件,Java虚拟机对 ...
- OSGi-入门篇之生命周期层(03)
前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或者两者的结合),并且给了应用本 ...
- Liferay7 BPM门户开发之17: Portlet 生命周期
Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() ...
- <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
随机推荐
- vue+elementUI中单选框el-radio设置默认值和唯一标识某个单选框
vue+elementUI中单选框el-radio设置默认值 如果后台返回的单选框的值是number:单选框的lable需要设置成 :lable='0';如下: <el-form-item la ...
- 【IDEA】IDEA项目没有被SVN管理问题
解决方法 VCS-Enable Version Control Integration
- [第二章]c++学习笔记5(构造函数和析构函数调用时机)
示例函数 注:输出并不一定从main函数开始,如全局对象的初始化在main函数前执行,如构造函数中存在输出,则从构造函数的输出开始 此处6被类型转换构造函数的存在转换为临时对象赋值,而在这个过程结束后 ...
- 记一次 .NET 某电商无货源后端服务 死锁分析
一:背景 1. 讲故事 这个月初,星球里的一位朋友找到我,说他的程序出现了死锁,怀疑是自己的某些写法导致mongodb出现了如此尴尬的情况,截图如下: 说实话,看过这么多dump,还是第一次遇到真实的 ...
- opa gatekeeper笔记:AdmissionReview input.request请求对象结构
官方:https://v1-17.docs.kubernetes.io/zh/docs/reference/access-authn-authz/extensible-admission-contro ...
- Windows操作系统安全加固基线检测脚本
一.背景信息 在我们的安全运维工作中经常需要进行安全基线配置和检查,所谓的安全基线配置就是系统的最基础的安全配置,安全基线检查涉及操作系统.中间件.数据库.甚至是交换机等网络基础设备的检查,面对如此繁 ...
- react之路由
功能:让用户从一个视图(组件)导航到另一个视图(组件) 前端路由是一套映射规则,在React中,是URL路径与组件的对应关系 使用React路由简单来说,就是配置路径和组件 路由的使用 1.安装路由 ...
- [luogu4747]Intrinsic Interval
有一个结论,答案一定是所有包含其合法区间中$l$最大且$r$最小的 证明比较容易,考虑两个合法区间有交,那么交必然合法,同时交也必然包含该区间,因此这个区间一定是合法的(取$l$最大的和$r$最小的两 ...
- Ubuntu下的磁盘管理
采用fat的磁盘存储,插入后采用相同命令会出现sdb和sdb1 sdb:磁盘 sdb1:磁盘分区标号为1 命令 df:显示磁盘使用情况 du:查询某个文件的大小读 du-h 或du -h --max- ...
- html+css第八篇滑动门和可爱的css精灵
滑动门: 滑动门并不是一项全新的技术,它是利用背景图像的可层叠性,并允许他们在彼此之上进行滑动,以创造一些特殊的效果. CSS精灵 CSS Sprites在国内很多人叫CSS精灵,是一种网页图片应用处 ...