1.摘要
OSGi的动态服务,包版本管理,安全设施,热插拔等特性吸引了越来越多开发人员的关注,由于OSGi不同于以往的设计理念,在企业级应用中一直没有很大的发挥。不过通过大家的不断努力,OSGi已在企业级服务平台中有所集成。本文站在另一个角度尝试Tomcat服务器下的OSGi服务集成,为web应用提供动态服务,为企业级开发提供参考。
本文需要读者了解以下内容:
l Java编程及一些简单的设计模式
l OSGi的相关知识
l 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服务
集成了OSGi平台后,我们希望将OSGi平台中服务发布到JNDI中,而OSGi平台中的服务对象各不相同,且是动态的,如果直接将这些服务发布给JNDI,web的使用将是痛苦的,也将不能获得OSGi动态服务的特性。所以,我们需要抽象一个共同的服务接口(OsgiServices),将该接口发布到JNDI中,而当web应用使用OSGi服务时,通过该接口来查找相应的服务。
为了在Tomcat中发布JNDI资源(OsgiServices),我们创建自己的资源工厂OsgiServicesFactory,OsgiServicesFactory实现了对象工厂(ObjectFactory)。
2.4 集成模型
到目前为止,我们的集成模型可以用图表示如下: