使用 WAS V8.5 的 OSGi 功能,不仅能够将已有的 EJB 模块转化为以 OSGi Bundle 为单位的 OSGi 应用,也可以结合 Rational Development 工具直接开发基于 EJB 的 OSGi 应用。在本文中,我们首先介绍 WAS V8.5 在 OSGi 编程方面的增强,然后通过实例讲解如何在 OSGi 应用中使用 EJB 技术。
WebSphere Application Server V8.5 对 OSGi 一个最重要的增强就是提供了对 EJB3.x 的支持(目前暂时不支持 EJB2.x 及以前的版本),OSGi 应用可以包含 EJB 模块,并能直接的访问和调用包含在其内的 EJB。我们可以在 OSGi 应用中添加包含 Stateful,Stateless,Singleton 以及 Message-Driven Beans 的 EJB 模块,所有的 EJB 功能都能在 OSGi 应用中继续保留,这与之前 JEE 应用中的 EJB 模块一样。对于包含 EJB 模块的 OSGi 应用,在对其进行部署,配置和更新的时候,采取的方法与之前对非 OSGi 应用采取的方法是一样的(包括命令行和控制台两种方法)。
开发人员可以选择将 EJB Bundle 打包到 OSGi 应用中(EBA 文件),也可以将其导入到 WAS 的内部 Bundle 存储库中,然后在 OSGi 应用的元数据文件(APPLICATION.MF)中添加对该 EJB Bundle 的引用,这两种方式达到的效果是相同的。
图 1. 管理包含 EJB 的 OSGi 应用
只需要很少的代码改动就可以将已经存在的 EJB 模块转化成 EJB Bundle 并对其添加 OSGi 的功能特性,一个 EJB Bundle 本质上就是一个 EJB 模块加上一个元数据描述文件(MANIFEST.MF)。我们通过在 MANIFEST.MF 中引入一个新的属性标识“Export-EJB:
”将一个 Bundle 定义为 EJB Bundle, EJB 容器负责加载并运行这些 EJB Bundle。
在“Export-EJB:”后面指定的 EJBs 将会以 OSGi 服务的形式进行发布,其他的 OSGi Bundle 可以查找并使用这些服务,没有在“Export-EJB:”后列出的 EJBs 依然会被加载和运行,但是这些 EJBs 对于服务存储库是不可见的,其他的 Bundle 不能使用未被列出的 EJBs。除了在“Export-EJB:”后面指定特定的 EJBs,还可以使用如下值设置:
冒号后加一个空格:表明将 Bundle 中所有的 EJBs 发布成 OSGi 服务并导出供其他 Bundle 使用 NONE:表明不将任何的 EJBs 发布为 OSGi 服务
图 2. 在 OSGi 应用中使用 EJB
&">nbsp;