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 ...
随机推荐
- Flask WTForm disable choice field
Flask disable choice field ChoiceField = { render_kw={'disabled':''} } form.my_field.render_kw = {'d ...
- eclipse查看jar包源代码
方法一:将jd-gui集成在Eclipse中 https://jingyan.baidu.com/article/b24f6c8275536686bfe5daed.html 下载2个反编译文件, ...
- 学不懂Netty?看不懂源码?不存在的,这篇文章手把手带你阅读Netty源码!
阅读这篇文章之前,建议先阅读和这篇文章关联的内容. 1. 详细剖析分布式微服务架构下网络通信的底层实现原理(图解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...
- C#练习3
using System; class Test { static void F(params int[]args) { Console.WriteLine("# of argument:{ ...
- adb server version (32) doesn't match this client (39); killing...解决办法
输入今天遇到,安装AndroidSDK之后,已经配置好环境变量,输入adb可运行,但是输入adb devices之后就出现adb server version (32) doesn't match t ...
- Docker容器基础入门认知-网络篇
这篇文章中,会从 docker 中的单机中的 netns 到 veth,再到单机多个容器之间的 bridge 网络交互,最后到跨主机容器之间的 nat 和 vxlan 通信过程,让大家对 docker ...
- 进击的 Ansible(二):如何快速搞定生产环境 Ansible 项目布局?
Tips:与前文 <进击的 Ansible(一):Ansible 快速入门> 一样,本文使用的 Ansible 版本 2.5.4,项目演示环境 MacOS.由于 Ansible 项目开发活 ...
- Codeforces 891E - Lust(生成函数)
Codeforces 题面传送门 & 洛谷题面传送门 NaCly_Fish:<简单>的生成函数题 然鹅我连第一步都没 observe 出来 首先注意到如果我们按题意模拟那肯定是不方 ...
- jquery操作html中图片宽高自适应
在网站制作中如果后台上传的图片不做宽高限制,在前台显示的时候,经常会出现图片变形,实用下面方法可以让图片根据宽高自适应,不论是长图片或者高图片都可以完美显示. $("#myTab0_Cont ...
- 使用GitHub Action进行打包并自动推送至OSS
GitHub Action 是 GitHub 于 2018 年 10 月推出的一个 CI\CD 服务. 官方文档:https://docs.github.com/cn/actions CI\CD 持续 ...