首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

为 WebSphere Application Server 开发企业 OSGi 应用程序(6)

为 WebSphere Application Server 开发企业 OSGi 应用程序(6)

Web 应用程序 bundle在很多方面,Web bundle 都与标准的 Java EE Web 存档相似,它在一个 web.xml 文件中声明它的 servlet 映射,将其代码打包到 WEB-INF/类中。但是,也有一些区别。对于一个 OSGi bundle,您将与其清单文件声明一些导入 — 本例中为 API bundle 导出的博客 API。Web-ContextPath 在清单文件,而不是 EAR 的 application.xml 文件中声明。这个区别的实际原因是 OSGi 应用程序不是一个 EAR,因此没有 application.xml 文件。但是,还有一个更重要的动机。将 Web 模块的所有配置信息都保存在 Web bundle 本身中使 Web 存档的模块性和独立性更高,从而保持了 OSGi 的精髓。
清单 5. 博客样例 Web bundle 清单文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Manifest-Version: 1.0

Bundle-ManifestVersion: 2

Bundle-ClassPath: WEB-INF/classes

Bundle-Name: blog.web

Bundle-SymbolicName: com.ibm.ws.eba.example.blog.web

Web-ContextPath: blog

Bundle-Version: 1.0.0

Import-Package:

com.ibm.ws.eba.example.blog.api;version="[1.0.0,1.1.0)",

com.ibm.json.java;version="[1.0.0,2.0.0)"




WebSphere Application Server 中的 OSGi 框架将这个存档识别为一个 Web bundle 并将其传递给一个 Web 容器,以管理 servlets 的生命周期。Java EE Web 容器和 OSGi 容器之间的集成通过联合的 JNDI 查找实现,这种查找是企业 OSGi 规范的一个特性。所有 OSGi 服务都自动在 JNDI 中注册,并可以以访问 Java EE 组件的熟悉方式访问。例如,这个博客 servlet 访问 BloggingService 的一个实现,如清单 6 所示。
清单 6. 从 Web 组件访问 OSGi 服务
1
2
3
4
5
InitialContext ic = new InitialContext();

return (BloggingService) ic.lookup("osgi:service/"

+ BloggingService.class.getName());




同样,也可以使用一个 @Resource 注释来注入这个引用,作为使用这个 JNDI Context API 的替代方法。
Blueprint bundle 业务逻辑被实现为一个 POJO 集合,并通过一个声明性 blueprint.xml 配置文件将 bean 定义和引用与 OSGi 服务关联起来。Blueprint 容器负责与 OSGi 服务注册表交互,以管理与服务的交互和服务的生命周期。清单 3 中展示的 blueprint.xml 来自这个博客样例业务 bundle,展示了声明一个 bean,注入其依赖项(可能是服务和其他 beans 的引用)并将这个 bean 发布为一个服务的一个典型模式。
持久性 bundle持久性 bundle 使用企业 OSGi 的另一个标准特性 — JPA 集成 — 来利用托管持久性。JPA 持久性单元同样通过一个 persistence.xml 文件来配置。持久性 bundle 的 bundle 清单文件需要一个 Meta-Persistence 头部来表明它是一个持久性 bundle,如清单 7 所示。
清单 7. 博客样例持久性清单文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Manifest-Version: 1.0

Bundle-ManifestVersion: 2

Bundle-Name: blog.persistence

Bundle-SymbolicName: com.ibm.ws.eba.example.blog.persistence

Bundle-Version: 1.0.0

Meta-Persistence:

Import-Package:

com.ibm.ws.eba.example.blog.persistence.api;version="[1.0.0,1.1.0)",

javax.persistence;version=1.0.0




持久性 bundle 实际上不仅仅获取一个托管 JPA,而是一个容器 托管 JPA,因为它是一个 Blueprint bundle(以及一个持久性 bundle);Blueprint 容器全面管理 JPA PersistenceContext 并将其注入为 blogExample 持久性单元注释的托管 bean(BlogPersistenceServiceImpl)中。
清单 8. 基于注释的 JPA EntityManager 注入
1
2
3
4
5
6
7
8
9
private EntityManager em;

@PersistenceContext(unitName = "blogExample")

public void setEntityManager(EntityManager e) {

em = e;

}




作为注释这个 bean Java 代码的一种替代方法,容器托管的 PersistenceContext 能够通过在 Blueprint bean 定义中使用 <jpa:context> 元素来声明,如清单 9 所示。
清单 9. Blueprint 容器托管的 Transaction 和 Persistence 配置
1
2
3
4
5
<bean id="persistenceManager"
    class="com.ibm.ws.eba.example.blog.persistence.BlogPersistenceServiceImpl">
<tx:transaction method="*" value="Required"/>
<jpa:context property="em" unitname="blogExample"/>
</bean>




清单 9 还展示了一些 Blueprint 容器托管的事务。在这个示例中,persistenceManager bean 的所有方法都在 Blueprint 容器建立(或连接)的一个全局事务下运行。WebSphere Blueprint 容器支持的容器托管的事务值集合与 EJB 容器支持的集合相同。(参见 了解更多信息。)
返回列表