OSGi架构研究
OSGi概述
OSGi是Open Service Gateway Initiative的简称,该组织建立于1999年,是一个非赢利机构,旨在建立一个开放的服务规范,为通过网络向设备提供服务建立开放的标准。OSGi并不是专为家庭网络而制定的,除了住宅网关,像车载电脑等其他移动嵌入式设备也都可以通过OSGi接入Internet,获取不同的应用服务。它为服务供应商、软件供应商、网关开发人员以及设备供应商提供了一个开放、通用的架构,使它们能互动地开发、部署和管理服务。其软件环境基于Sun的 JAVA虚拟机,并不涉及具体的连接协议。对于任何新设备,它都能够灵活地将其纳入现有网络。可以使用OSGi的对象包括各种数字和模拟的机顶盒、服务网关、有线电视电缆调制解调器、消费类电子产品、PC、工业计算机、汽车等。
OSGi体系结构
以下是一张OSGi的体系结构图:
从上图的层次结构可以看出,Native Operating System层代表的是本地硬件与操作系统,Java VM层为跨平台应用提供了可能。而再往上,就是OSGi framework了。
Bundle实际就是一个具有jar(Java ARchive)格式的文件,其中包含了java的class文件和其他资源文件(比如图标,配置文件等等)。Bundle可以在自己的manifest 文件中说明自己能够提供哪些java包,其他bundle如果在自己的manifest文件中指定了它需要这个包,那他们之间就可能产生java包的依赖关系,这样多个bundle之间就可以共享java包。
OSGi在R4中将功能分为几层,包括:安全层、模块层、生命周期层、服务层和实际的服务。OSGi的核心实现即为OSGi框架,它本身也是一个OSGi Bundle。
名称(层)
|
职责或功能
|
Security(安全层)
|
对OSGi环境中应用的部署和管理提供更好的安全控制。
|
Modules(模块层)
|
主要负责bundle的安装部署,更新和卸载。
|
Life Cycle(生命周期层)
|
为Bundle组件的安全和生命周期操作提供了API定义,该层位于安全层和模块层之上。
|
Services(服务层)
|
定义了一个与生命周期层紧密结合的组件动态交互模型。OSGi中的服务是实现了一个或多个Java接口的Java对象,通过将这些对象依据其实现的接口注册到服务注册表中,Bundle组件可以发布自己的服务,查找使用服务,注册监听处理服务的状态变更等。
|
Actual Services(实际的服务)
|
OSGi定义的一些标准的服务接口如日志服务(Log Service),包管理服务(Package Admin Service)、启动级别服务(Start Level Service)、HTTP服务(Http Service)、配置服务(Config Admin Service)、用户管理服务(User Admin Service)等。
|
OSGi容器
现在比较流行的开放源码的OSGi容器有以下三种:
a) Equinox容器是参照OSGi规范第4版实现的,它构成了Eclipse IDE的核心—模块化的Java运行时;它实现了OSGi规范4中规定的必须强制实现的功能,同时,它也实现了OSGi规范中大部分的可选功能;
b) Knoflerfish是OSGi规范第3版和第4版的开源实现,它实现了OSGi规范规定的必须实现的功能及部分可选功能;
c) Apache的Felix是Apache软件基金会实现的OSGi开源容器。
OSGi项目实践
技术是做出来的,不是想出来的。
以下,我将使用Equonix作为OSGi容器,来做一个小项目,将一天以来学习到的知识用到具体实践之中。
便携设备越来越多,连家庭主妇身边都可能有个PDA或者智能手机,优秀的家庭主妇都是管帐的高手,相信做一个支出管理系统会大卖特卖。现在忽略PDA或是智能机用的是什么硬件配置以及接口,用Swing来模拟前端界面。
我把这个系统命名为ExpenseManager,下面是系统的包结构:
pratice.domain 用来放实体类
pratice.service 存放支出管理系统提供服务的接口及其实现类
pratice.uri 界面相关的类
完成1.0版时的包结构如下:
其中,Expense是代表一条消费记录的实体类,其定义如下:
public class Expense {
private int id; //消费ID
private String date; //消费时间
private String item; //消费项目
private float money; //消费额
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
……//省略其它属性get,set方法
}
ExpenseDB类代表一个存储消费记录的数据库表,提供插入,检索数据,查询列名等操作,类图如下:
ExpenseManagerService是系统的服务接口,定义系统可以向外提供的功能,在1.0版中只实现了增加支出记录功能,以后可逐步增加诸如,删除,修改,统记等功能。下面给出接口及其实现类代码:
public interface ExpenseManagerService {
public void addExpense(Expense expense);
}
public class ExpenseManagerServiceImpl implements ExpenseManagerService {
private ExpenseDB expenseDB;
public ExpenseManagerServiceImpl(ExpenseDB expenseDB) {
this.expenseDB = expenseDB;
}
public void addExpense(Expense expense) {
expenseDB.addExpense(expense);
}
}
ExpenseManagerURI类是界面类,也是bundle中的Activator,继续自JFrame,同时实现BundleActivator接口。只要在MANIFEST.MF中指定
Bundle-Activator: pratice.uri.ExpenseManagerURI
framework就能通过ClassLoader找到pratice.uri.ExpenseManagerURI.class并加载后,就可以通过newInstance()方法创建一个BundleActivator的实例,然后调用public void start(BundleContext context)方法和void stop(BundleContext context)方法来管理bundle的生命周期。代码略。
AddExpenseDialog是增加支出记录的对话框。
MANIFEST.MF文件内容如下:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ExpenseManager Plug-in
Bundle-SymbolicName: ExpenseManager
Bundle-Version: 1.0.0
Bundle-Activator: pratice.uri.ExpenseManagerURI
Bundle-Localization: plugin
Import-Package: org.osgi.framework;version="1.3.0"
布署到Equonix容器后,执行效果见下图:
点击添加记录,跳出加支出记录的对话框。
输入数据提交后,在管理系统界面点击支出列表,罗列出支出记录。
为显示OSGi架构支持即插即用,动态部署的特性,在1.1版中增加统计消费额的功能,只要执行Equonix框架提供的更新命令,framework就完成对bundle的升级工作。为此,对源代码进行相应修改。
ExpenseManagerService接口增加统计方法,实现类与ExpenseDB类作相应修改。
public interface ExpenseManagerService {
public void addExpense(Expense expense);
public float sumAllCost();
}
public class ExpenseManagerServiceImpl implements ExpenseManagerService {
private ExpenseDB expenseDB;
public ExpenseManagerServiceImpl(ExpenseDB expenseDB) {
this.expenseDB = expenseDB;
}
public void addExpense(Expense expense) {
expenseDB.addExpense(expense);
}
public float sumAllCost() {
return expenseDB.sumAllCost();
}
}
public class ExpenseDB {
private List<Expense> expenseList;
……//其余代码省略
public float sumAllCost() {
float sum = 0;
for(int i = 0; i <= expenseList.size(); i++ ){
sum += ((Expense)expenseList.get(i)).getMoney();
}
return sum;
}
}
MANIFEST.MF文件内容如下:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Namefont-size: 10pt; color: black; font-family:
- 大小: 23.8 KB
- 大小: 59.7 KB
- 大小: 61.5 KB
- 大小: 2.8 KB
- 大小: 4.7 KB
- 大小: 8 KB
- 大小: 15.1 KB
- 大小: 5.5 KB
- 大小: 11.2 KB
- 大小: 6.5 KB
- 大小: 11.4 KB
分享到:
相关推荐
"基于Android平台的OSGi架构中间件的研究与应用.pdf" 本文主要研究了基于Android平台的OSGi架构中间件的设计和实现,旨在满足不同的Java环境和平台的需求,屏蔽了底层技术的复杂性,极大降低了智能家居应用系统的...
分布式OSGi研究与发展是一项涉及计算机应用研究、分布式计算技术、以及OSGi框架融合的研究,旨在将OSGi技术应用于跨多个虚拟机的异构分布式处理。OSGi(Open Services Gateway initiative)是OSGi联盟针对嵌入式领域...
#### 三、RFID中间件的服务架构研究 **概念介绍** RFID中间件是连接RFID阅读器与企业应用程序之间的桥梁,它的主要作用是屏蔽底层硬件和通信协议的复杂性,提供统一的数据访问接口,从而简化应用开发的难度。...
例如,开发工具如Eclipse就广泛采用了OSGI架构,允许插件以独立的bundle形式存在,方便安装、更新和卸载。 在实际应用中,OSGI的源码分析可以帮助我们深入理解其工作原理。例如,可以研究其bundle的加载过程、服务...
是一本适合新接触OSGI开发学习的一本很好的书,本书介绍了Equinox, Spring-DM和Felix这三个常用的OSGi容器的使用、...本书适合希望了解、深入掌握OSGi,以及编写模块化、动态化Java应用的Java架构师和开发人员阅读。
4. **案例研究**:提供真实世界中的OSGi应用案例,帮助读者理解OSGi在实际问题中的解决方案。 5. **社区与资源**:介绍OSGi社区、相关资源和学习路径,鼓励读者参与并持续学习。 通过这两本书,读者不仅可以了解...
OSGi的核心是其服务导向的架构,它允许开发者将应用程序分解为独立的模块,这些模块称为"bundles"或"服务"。每个bundle都包含代码和元数据,描述了它提供的服务以及它依赖的服务。这种模块化的方法使得在运行时动态...
《深入理解OSGi:以org.eclipse.osgi_3.7.0.v20110613及其源码为例》 OSGi(Open Services ...通过深入研究其3.7.0.v20110613版本及源码,开发者不仅能掌握OSGi的基本概念,还能在实践中提升软件设计和架构的能力。
OSGi和Equinox的技术细节及应用实例,以及它们如何在各种应用场景中发挥作用,都是值得深入研究和探讨的领域。了解这些概念对于当今面向服务的架构(SOA)和微服务架构趋势具有非常重要的意义。模块化不仅仅是技术...
10. **未来发展趋势**:讨论WPF与OSGI结合的未来潜力,比如云原生应用、微服务架构,以及跨平台支持的可能性。 以上就是基于标题、描述和标签生成的相关知识点,这些内容对于理解和实践WPF与OSGI在.NET环境中的集成...
2. **服务框架**:OSGi定义了一个服务框架,允许组件之间以服务的形式进行交互,从而实现了动态的依赖管理和插件式的架构。 3. **生命周期管理**:通过提供一个生命周期管理模型,OSGi使得组件可以在运行时动态安装...
通过研究这些材料,开发者可以掌握如何有效地利用OSGi来创建可维护、可扩展的Java应用程序,并理解其背后的原理和最佳实践。无论你是想要理解OSGi的基本概念,还是寻求解决特定问题的方案,这些文档都将提供宝贵的...
7. **最佳实践与案例研究**:可能包括实际项目中的应用示例,展示如何有效地利用OSGI来解决复杂问题,比如大型企业级应用的模块化改造。 8. **工具支持**:介绍有助于OSGI开发的工具和框架,如Bndtools、Eclipse ...
OSGI(Open Services Gateway Initiative)是一种...通过深入研究像"org.salever.osgi.depends.clientbundle"和"org.salever.osgi.depends.hostbundle"这样的示例,我们可以更好地掌握OSGI环境下的依赖管理和协作机制。
例如,可以研究Apache Felix或Equinox的源码,了解它们如何处理bundle的加载、依赖解析和服务注册等核心功能。 10. **挑战与解决方案** 虽然OSGi提供了很多优势,但也有一定的学习曲线和复杂性。解决这个问题的...
- **6.8.2 C/S**:探讨客户端/服务器架构下的OSGI应用开发。 - **6.8.3 嵌入式**:分析OSGI在嵌入式系统中的应用和优化方法。 - **6.9 注意事项**:总结在开发过程中需要注意的关键问题和常见陷阱。 #### 七、...