扩展 Tomcat 支持 OSGi 应用服务(1)
1.摘要
OSGi 的动态服务,包版本管理,安全设施,热插拔等特性吸引了越来越多开发人员的关注
,由于 OSGi 不同于以往的设计理念,在企业级应用中一直没有很大的发挥。不过通过大家的不
断努力,OSGi 已在企业级服务平台中有所集成。本文站在另一个角度尝试 Tomcat 服务器下的
OSGi 服务集成,为 web 应用提供动态服务,为企业级开发提供参考。
本文需要读者了解以下内容:
Java 编程及一些简单的设计模式
OSGi 的相关知识
Tomcat 服务器的相关知识
2.集成思路
我们知道 OSGi R4.0 平台中发布的服务为 java 对象服务,只能在其内部使用,而不能够为
外部环境所使用的主要原因是类加载问题。要想为外部环境引用 OSGi 平台中的服务,我们需要
使用 java 的反射机制来达到目的。
鉴于 OSGi 平台服务的各种新的让人向往的优势,我们当然希望将其应用于开发和生产环境
中。那么如何将 OSGi 平台服务集成到 Tomcat 中,并被 web 应用所使用呢?首先我们需要了解
一些基本知识。
2.1 J2EE 基础知识
我们知道,J2EE 平台的 JNDI 规范,规定了服务器如何提供 JNDI 服务,同时也规定了 web
应用如何使用 JNDI 服务。举个例子,我们经常在服务器中配置数据库连接池,然后在 web 应用
中使用(不明白的可以参考《Tomcat 中数据源的配置及原理》)DataSource 对象,而这个
DataSource 对象就是通过 JNDI 发布给 web 应用的。
当然,JNDI 不仅仅能够发布 DataSource 服务对象,它还可以发布其它 java 服务对象。
基于这个原理,我们很自然地会想,能否将 OSGi 平台的服务对象发布到 JNDI 呢?答案是肯定
的。把 OSGi 平台的服务对象发布到 JNDI 的方式有很多种,这里介绍通过扩展 Tomcat 服务
器来集成 OSGi 平台来实现以上的想法。
2.2 扩展 Tomcat,支持 OSGi 平台
这里我们选择支持以下 OSGi 平台和 Tomcat 服务器:
1. Eclipse 的 OSGi 平台实现 equinox,版本 equinox3.3.2。
2. Apache 的 OSGi 平台实现 felix,版本 felix1.6.0。
3.Apache 的 Web 应用服务器 Tomcat,版本 tomcat6.0.18(6.0 以上目录结构一致)。
我们选择扩展 Tomcat 服务器的目的是,希望保持 OSGi 环境对 Tomcat 的透明,即 OSGi 平
台的集成不会影响 Tomcat 服务器的功能。我们需要在 Tomcat 启动时启动 OSGi 平台,在 Tomcat
停止时停止 OSGi 平台。所以我们将服务器的启动作为扩展点,具体来说,就是在 Tomcat 的 server
组件启动时,添加一个关于 OSGi 平台生命周期的监听器(OsgiLifecycleListener),
OsgiLifecycleListener 必须实现 LifecycleListener 接口,这样就可以接受到
server 组件的事件通知了,根据不同事件,就可以在 Tomcat 的 server 组件启动时,启动 OSGi
平台,在 server 组件停止时,停止 OSGi 平台了。
2.3 Tomcat 中发布 JNDI 服务