OSGi的服务层(Service Layer)为bundle之间的解耦合及服务引用提供的强大而又灵活的实现机制。通过BundleActivator控制组件的生命周期,通过BundleContext与其他组件和服务交互。但是,OSGi服务层在提供强大的功能的同时,也给使用者造成了很大的困惑,比如,组件的启动顺序,服务的查找策略等等。OSGi通过Declarative Service给出了一种通过XML配置文件发布和绑定服务的功能,用户只需要定义XML文件即可向OSGi环境中发布服务对象和获取其他bundle组件发布的服务。
在OSGi编程过程中,获取其他Bundle提供的服务是比较复杂的,尤其是获取多个服务时需要做很多重复性的工作。有没有更为简单的方式实现服务的发布和绑定呢?最近在Equinox邮件列表中看到Patrick的向equinox开发组的一项提议,建议将Service Activator Toolkit(SAT)组件添加到Equinox项目中,SAT目前位于Eclipse 技术项目OHF中。
SAT大大简化了OSGi Service Bundle开发的复杂性。用户可以通过SAT插件引用服务,发布服务,自定义Bundle Activator。下面是SAT插件的功能略图:
上图展示了如何引用和发布服务
上图展示了如何定制BundleActivator。
下面通过几行简单的代码展示SAT如何简化服务的发布和引用。
//服务的发布
public class Activator extends BaseBundleActivator {
protected void activate() {
LogUtility.logInfo("The Hotdog Vendor bundle has been activated"); //$NON-NLS-1$
addExportedVendorService();
}
//将HotdogVendor服务发布到OSGi环境中
private void addExportedVendorService() {
VendorService service = new HotdogVendor();
Dictionary properties = new Hashtable(11);
properties.put(VendorService.SPICINESS_PROPERTY, new Integer(10));
addExportedService(VendorService.SERVICE_NAME, service, properties);
}
protected void deactivate() {
LogUtility.logInfo("The Hotdog Vendor bundle has been deactivated"); //$NON-NLS-1$
}
}
//服务的引用
public class Activator extends BaseBundleActivator {
private Customer customer;
//组件启动激活
protected void activate() {
LogUtility.logInfo("The Customer bundle has been activated"); //$NON-NLS-1$
VendorService vendor = getVendorService();
Customer customer = getCustomer();
customer.setVendor(vendor);
customer.eat();
}
//组件停止注销
protected void deactivate() {
Customer customer = getCustomer();
customer.setVendor(null);
LogUtility.logInfo("The Customer bundle has been deactivated"); //$NON-NLS-1$
}
private Customer getCustomer() {
return customer;
}
//声明需要引用的服务的名称
protected String[] getImportedServiceNames() {
return new String[] {
VendorService.SERVICE_NAME
};
}
//设定服务过滤条件
private String getVendorFilter() {
StringBuffer buffer = new StringBuffer(50);
buffer.append('(');
buffer.append(VendorService.SPICINESS_PROPERTY);
buffer.append("<="); //$NON-NLS-1$
buffer.append(8);
buffer.append(')');
String filter = buffer.toString();
return filter;
}
//获取HotdogVender服务
private VendorService getVendorService() {
return (VendorService) getImportedService(VendorService.SERVICE_NAME);
}
private void setCustomer(Customer customer) {
this.customer = customer;
}
protected void start() throws Exception {
LogUtility.logInfo("The Customer bundle has been started"); //$NON-NLS-1$
Customer customer = new Customer();
setCustomer(customer);
String filter = getVendorFilter();
addImportedServiceFilter(VendorService.SERVICE_NAME, filter);
}
protected void stop() throws Exception {
setCustomer(null);
LogUtility.logInfo("The Customer bundle has been stopped"); //$NON-NLS-1$
}
}
SAT目前从Eclipse CVS上可以获取到。CVS的访问地址为:
:pserver:dev.eclipse.org:/cvsroot/technology org.eclipse.ohf/plugins/org.eclipse.soda.sat
分享到:
相关推荐
赠送jar包:osgi-resource-locator-1.0.1.jar; 赠送原API文档:osgi-resource-locator-1.0.1-javadoc.jar; 赠送源代码:osgi-resource-locator-1.0.1-sources.jar; 赠送Maven依赖信息文件:osgi-resource-locator...
"spring-osgi-1.2.0-rc1"是Spring OSGi的一个早期版本,"RC1"代表Release Candidate 1,意味着这是正式发布前的最后一个测试版本。在这个版本中,开发者可以期待一些新特性和改进,但同时也可能存在一些未发现的...
spring-osgi-1.2.1-with-dependencies.zip spring-osgi-1.2.1-with-dependencies.zip spring-osgi-1.2.1-with-dependencies.zip
赠送jar包:osgi-resource-locator-1.0.1.jar; 赠送原API文档:osgi-resource-locator-1.0.1-javadoc.jar; 赠送源代码:osgi-resource-locator-1.0.1-sources.jar; 赠送Maven依赖信息文件:osgi-resource-locator...
总结来说,“spring-osgi-1.2.1-with-dependencies”是一个集成了Spring与OSGi的完整包,它提供了在OSGi环境中运行Spring应用所需的所有组件和服务。通过理解和掌握这个包,开发者可以更好地利用OSGi的模块化优势,...
"carrot-osgi-anno-scr-make"项目是一个针对OSGi服务组件的工具,主要功能是帮助开发者自动生成SCR组件描述符。在OSGi DS中,组件描述符是用于声明服务组件行为的XML文件,这些文件定义了服务的接口、实现类、依赖...
OSGi 服务发布和获取方式 OSGi(Open Service Gateway Initiative)是一种动态模块化的服务平台,能够动态地管理和部署服务。OSGi 服务发布和获取方式是 OSGi 框架中的一种核心机制,用于发布和获取服务。下面将...
基于java的开发源码-OSGi 分布式通讯组件 R-OSGi.zip 基于java的开发源码-OSGi 分布式通讯组件 R-OSGi.zip 基于java的开发源码-OSGi 分布式通讯组件 R-OSGi.zip 基于java的开发源码-OSGi 分布式通讯组件 R-OSGi.zip ...
maven-easybeans-osgi-2.0.0-rc1-sources.jar
这个压缩包包含了关于OSGI的重要文档,分别是“OSGi R4核心规范文档”、“OSGi服务文档”以及“OSGi-最佳原理与实践”(王昊编著)。下面将详细介绍这些文档所涵盖的关键知识点。 首先,"OSGi R4核心规范文档"是...
spring-osgi-1.2.0-with-dependencies.zip spring-osgi-1.2.0-with-dependencies.zip spring-osgi-1.2.0-with-dependencies.zip
maven-osgi-plugin-launcher-framework-equinox-1.0.15.jar
在SpringDM(Spring Dynamic Modules)框架中,OSGi(Open Service Gateway Initiative)服务注册与引用是核心功能之一,它使得模块化系统中的组件能够互相发现并交互。本篇笔记将探讨如何在OSGi环境中注册服务以及...
OSGi服务平台规范4.1是其第四个版本,由OSGi成员公司共同开发,扩展了原有的API并修复了部分问题,以确保与早期版本的兼容性。 **OSGi框架概述** OSGi核心规范4.1提供了基础框架,支持动态部署和管理称为bundle的...
maven-osgi-test-plugin-0.11.1-sources.jar
maven-osgi-test-plugin-0.11.0-sources.jar
maven-osgi-test-plugin-0.10.0-sources.jar
maven-osgi-test-plugin-0.9.0-sources.jar
maven-osgi-test-plugin-0.8.0-sources.jar
maven-osgi-test-plugin-0.6.0-sources.jar