要运行本文中的示例,请确保已在计算机上安装和设置了以下软件:
- Java 5 或更高版本
- Apache Felix 二进制分发版 1.0.4
订单应用程序
接下来让我们看看如何使用基于 Felix 的 OSGi 框架创建订单应用程序包。此应用程序包括两个组件:OrderClient.java(客户端)和 OrderService.java(服务器端)。客户端组件打包为 client.jar,服务器组件打包为 order.jar。接下来让我们首先看看 OrderClient
类。
清单 1. 客户端组件 OrderClient
public class OrderClient implements BundleActivator {
private ServiceTracker orderTracker;
private OrderService orderService;
public void setService(OrderService orderService) {
this.orderService = orderService;
}
public void removeService() {
this.orderService = null;
}
public void start(BundleContext context) throws Exception {
orderTracker =
new ServiceTracker(context, OrderService.class.getName(), null);
orderTracker.open();
OrderService order = (OrderService) orderTracker.getService();
if (order == null) {
System.out.println("Order service not available");
} else {
order.processOrder();
}
}
public void stop(BundleContext context) {
System.out.println("Bundle stopped");
orderTracker.close();
}
}
正如清单 1 中所示,OrderClient
对 OrderService
组件调用 processOrder
方法,以在启动 client.jar 包时打印 orderID
。此类实现 BundleActivator
接口,该接口具有两个回调方法:start()
和 stop()
。启动和停止客户端包时,Felix 容器将调用实现的 start()
和 stop()
方法。
接下来让我们仔细分析一下 start()
方法。在 start()
方法中,首先获得 ServiceTracker
类的引用。您可以将此类视为工厂类。然后通过调用此 getService
方法从此工厂类获取服务引用。ServiceTracker
使用以下参数构造:包上下文和 OrderService
类的名称。
清单 2. OrderService 实现
public class OrderServiceImpl implements OrderService, BundleActivator {
private ServiceRegistration registration;
public void start(BundleContext context) {
registration =
context.registerService(OrderService.class.getName(), this, null);
System.out.println("Order Service registered");
}
public void stop(BundleContext context) {
System.out.println("Order Service stopped");
}
public void processOrder() {
System.out.println("Order id: ORD123") ;
}
}
服务器端 order.jar 文件包含两个组件:OrderService
接口和 OrderServiceImpl
类。此接口具有由 OrderServiceImpl
类实现的抽象类 processOrder
。此类还实现了 BundleActivator
接口,此接口供 Felix 容器调用来启动和停止 order.jar 包。start()
方法在注册中心注册 OrderService
组件,以供客户端包使用。注册与导出对象供其他包使用的作用一样。
--
通过 Manifest 通信
真正的问题是,客户端包如何知道注册的服务包?此通信通过使用 Manifest 文件处理。在 Manifest 文件中,在导入和导出程序包中提供包的引用。客户端包 Manifest 通常导入服务组件程序包,而服务包 Manifest 导出自己的程序包。请注意,当包 A 导入包 B 的程序包时,包 B 必须导出自己的程序包。没有恰当的导入和导出定义,通信将失败。
清单 3. 客户端清单文件
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service Client
Bundle-SymbolicName: orderclient //模块代号名称
Bundle-Version: 1.0.0
Bundle-Activator: order.client.OrderClient //激活器类的名称,激活器类负责在包中调用 start() 和 stop() 方法
Import-Package: org.osgi.framework, org.osgi.util.tracker, order //导入的包 order是OrderService到处的别名
清单 4. 服务器清单文件
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service
Bundle-SymbolicName: orderservice
Bundle-Version: 1.0.0
Export-Package: order //导出的包名,客户端引入此包
Bundle-Activator: order.impl.OrderServiceImpl //激活器类的名称,激活器类负责在包中调用 start() 和 stop() 方法
Import-Package: org.osgi.framework //导入的包
对于订单应用程序,client.jar 包 Manifest 中包含条目 Import-Package: org.osgi.framework, org.osgi.util.tracker, order
。这个实际上表示,客户端包导入核心 OSGi 程序包和 OrderService
程序包。类似地,order.jar 包清单包含条目 Export-Package: order
。即,包导出其程序包供客户端使用。如果导入和导出未显式声明,OSGi 将引发运行时错误。
Manifest 文件还包含其他信息,如包激活器类的名称等。激活器类负责在包中调用 start()
和 stop()
方法。在本例中,client.jar 包的激活器类为 OrderClient
,order.jar 包的激活器类为 OrderService
。
--
部署
在部署和使用包前,请进行以下工作:
- 根目录 C:\osgi 文件夹下创建图 1 中所示的目录结果,并将本文前面介绍的组件放入其中:
- Java 代码放入相应的程序包文件夹(客户端和服务)。
- 清单文件放入相应的 META-INF 文件夹(客户端和服务)。
图 1. 代码目录结构
下一步便是部署这些包。请通过以下步骤,使用 Felix OSGi 容器部署客户端和服务包:
下一步便是部署这些包。请通过以下步骤,使用 Felix OSGi 容器部署客户端和服务包:
- 在服务文件夹中使用 ANT 运行 build.xml。
- 在客户端文件夹中使用 ANT 运行 build.xml。
执行了上述构建文件后,将分别在 client/bin 和 service/bin 文件夹中创建 client.jar 和 order.jar 包。
- 在 Microsoft® Windows® 命令提示符中运行 startfelix.bat,以启动 Felix 运行时。
每次启动 Felix 运行时,都会提示配置文件名称。配置文件名称的作用类似于项目名称。可以提供任何名称作为项目配置文件的名称。对于 Felix 运行时的每次后续启动,如果提供了之前输入的相同配置文件名称,Felix 将会加载与该项目名称关联的所有已安装包。如果提供了新配置名称,则将需要再次显式安装各个包:
- 在 Felix Shell 中提供以下命令,以安装各个包:
-
install file:service/bin/order.jar
-
install file: client/bin/client.jar
-
start service_bundle_id
-
start client_bundle_id
为了指示包的 ID,可以使用 ps
命令。必须首先启动服务包,然后启动客户端包。在启动相应的包时,将显示以下输出(请参见图 2)。
图 2. 程序输出
还可以通过在 Felix Shell 提供 update bundle_id
命令更新包。包将在运行时动态更新。
分享到:
相关推荐
这本书为想要入门OSGi和Apache Felix的开发人员提供了一个详细的学习路径,涵盖了基础知识到实践应用的各个环节。学习完这本书之后,开发人员将能够使用Felix框架构建自己的模块化应用程序,并理解OSGi技术如何在...
《OSGI入门和整合Spring》则关注OSGI与Spring框架的结合,主要讨论: 1. **Spring与OSGI集成原理**:Spring的bean管理如何与OSGI服务机制相结合,实现更灵活的依赖注入。 2. **Declarative Services(DS)**:利用...
学习OSGI入门和整合Spring,对于开发复杂的企业级应用,或者想要提升系统灵活性和可维护性的开发者来说,是非常有价值的。通过理解OSGI的模块化机制和Spring的依赖注入原理,可以构建出更加高效和可扩展的Java应用。
4. **felix或equinox**:Felix和Equinox是两个常用的OSGi运行时实现,它们提供了API和框架,用于构建和运行OSGi应用。 5. **Blueprint或Declarative Services**:这两种是OSGi中的服务配置方式,Blueprint更接近XML...
在OSGI入门阶段,首先要理解的是它的基本概念,如bundle(模块)、服务、生命周期管理和依赖管理。Bundle是OSGI中的核心组件,它类似于Java的JAR文件,但具有自己的元数据和生命周期。每个bundle可以导出和导入服务...
**Spring OSGi 入门** Spring OSGi 是 Spring 框架与开放服务网关规范(OSGi)的结合,它为基于 Java 的应用程序提供了模块化开发的能力。OSGi 是一个动态的、模块化的运行时环境,使得开发者可以创建可热插拔的...
- **Blueprint Container**:Spring OSGi 提供了一个基于 Blueprint 的容器,它是 OSGi 社区对 CDI(Contexts and Dependency Injection)的实现,类似于 Java EE 中的 CDI 容器。 - **Module Bundles**:Spring ...
包含电子书和第04、05、06、07、08、09、10、11、13章的代码, 是学习OSGi和Apache Felix的一个很好的入门资料, 虽然版本有一点点老了, 但是基本的东西没有变, 值得下下来一看!
1. 安装OSGi容器:首先,你需要一个支持Spring OSGi的OSGi容器,如Apache Felix或Equinox。这些容器提供了运行Spring OSGi应用的基础环境。 2. 创建Spring OSGi Bundle:使用Spring的osgibundle.xml配置文件,定义...
1. **选择合适的 OSGi 框架**:Equinox 是 Eclipse 提供的一个流行的 OSGi 实现,除此之外还有 Felix、Knopflerfish 等其他框架可供选择。 2. **安装开发工具**:Eclipse 提供了强大的 OSGi 开发支持,可以通过...
- **选择OSGi实现**:如Apache Felix、Equinox等,它们提供了运行时环境。 - **集成Spring**:引入Spring OSGi相关的库,如spring-osgi-core、spring-osgi-io等。 - **配置Bundle**:创建Manifest.MF文件,声明...
**标题:“OSGi入门”** **描述:** 这篇博客文章主要介绍了OSGi(Open Services Gateway Initiative)的基础知识,包括它的起源、概念以及在Java开发中的应用。作者通过一个实际的例子来帮助读者理解如何使用OSGi...
8. **felix**和**equinox**: OSGI实现的两个流行框架,提供了实现OSGI规范的运行时环境。 学习OSGI不仅能够帮助你理解模块化开发,还能提升你在大型项目中的代码组织和维护能力。通过阅读“OSGI介绍”文档,你可以...
本书基于作者多年使用OSGi的经验而编写,涵盖了...最后对OSGi知识进行深入讲解,通过对OSGi规范和实现框架(Equinox、Felix、Spring-DM和Apache CXF)的分析,以及最佳实践的介绍,帮助读者更好地掌握如何使用OSGi。
5. **felix或equinox等OSGI实现**:熟悉至少一种OSGI容器,比如Apache Felix或Eclipse Equinox,它们提供了运行OSGI应用的平台。 通过分析这两个示例源码,你可以深入理解OSGI的工作原理,包括bundle间如何交互、...
最后对OSGi知识进行深入讲解,通过对OSGi规范和实现框架(Equinox、Felix、Spring-DM和Apache CXF)的分析,以及最佳实践的介绍,帮助读者更好地掌握如何使用OSGi。 本书适合希望了解、深入掌握OSGi,以及编写模块化...
OSGi容器已经有多家开源的实现,比如:knoflerfish、Equnox、Apache的Felix。你可以通过这些容器,把你的应用程序划分为多个模块单元,这样你就可以更容易地管理这些模块单元之间的交叉依赖关系
Felix是实现OSGi(Open Services Gateway Initiative)规范的一个开源Java框架。OSGi是一个用于构建模块化Java应用程序的平台,它提供了动态服务发现、管理以及模块化加载的能力,使得开发者可以更方便地管理和更新...