OpenDoc Series':OSGI实战(六):1

 由  ValRay 发布

六. 基于 OSGI 框架(Equinox)的实战

讲了这么多 OSGI 的相关”废话”,开始走入正题,任何东西,仅仅说是没用的,在本章节中我们基于 OSGI 框架(Equinox)来实现体验 OSGI 章节中的用户登录验证模块。

6.1. 做好准备

OSGI 框架是一个微核结构的容器,所有的模块都需要运行在容器范围内,在 OSGI 中所有模块的部署都必须以 Bundle 的方式来进行部署,那么到底什么是 Bundle 呢? Bundle其实就是一个jar文件,这个jar文件和普通的jar文件唯一不同的地方就是 Meta-inf 目录下的 MANIFEST.MF 文件的内容,关于 Bundle 的所有信息都在 MANIFEST.MF中进行描述,说的时髦点,可以称它为bundle的元数据,这些信息中包含有象Bundle的名称、描述、开发商、classpath、需要导入的包以及输出的包等等,在后续的开发Bundle中将会详细的介绍Bundle的元数据以及如何去开发Bundle。

Bundle 通过实现 BundleActivator 接口去控制其生命周期,在 Activator 中编写 Bundle启动、停止时所需要进行的工作,同时也可以在 Activator 中发布或者监听框架的事件状态信息,以根据框架的运行状态做出相应的调整,但同时要注意,如果应用是被类似才用 Ctrl+C 等方式强行终止的话,那么 Activator 中的 stop 方法是不会被调用的。

Bundle是个独立的概念,在OSGI框架中对于每个Bundle采用的是独立的classloader机制,这也就意味着不能采用传统的如引用其他Bundle的工程来实现Bundle间的协作了,那么在OSGI框架中Bundle之间是怎么协作的呢,在OSGI框架中对于每个Bundle可以定义输出的包以及引用的包,这样在Bundle间就可以共享包中的类了,尽管这样也可以直接实现简单的Bundle的协作,但在OSGI框架中更加推荐的是采用Service的方式,Service-Oriented的概念(例如SOA)大家都接触多了,OSGI框架也同样是如此的,每个 Bundle可以通过BundleContext注册对外提供的服务,同时也可以通过BundleContext 来获得需要引用的服务,采用Service-Oriented的方式可以使得对外提供的服务能够更加的封闭,不需要为了使用别的Bundle提供的Service而做环境依赖等的设置,同时, Bundle还可以采用Require-Bundle的方式来直接引用其他的Bundle(相当于引用其他 Bundle的工程或jar),在后续的开发、发布和使用Service中将会详细的介绍如何去开发、部署、使用Service。 好,在对OSGI中的核心概念有了了解后,摩拳擦掌,开始来设计下基于OSGI框架如何实现用户登录验证模块,由于目前Declarative Services[ 详见Declarative Services ]的实现尚处于测试阶段,在这里先采用Bundle控制的方式来实现用户登录验证模块,按照体验OSGI中的描述,我们将用户登录验证模块分为如下五个Bundle来实现:

图表 1 用户登录验证模块Bundle设计示意图

●用户登录 Web 响应 Bundle

提供输入登录所需信息的页面,接受用户的登录请求,从 BundleContext 中获取用户登录验证的 Service,造型为用户登录验证接口,调用验证方法得到用户是否允许登录的许可,相应的返回结果至页面。

●用户登录验证接口

Bundle 对外提供用户登录验证接口。

●LDAP 验证 Bundle

以 LDAP 验证方式实现用户登录验证接口,对外提供用户登录验证服务。

●DB 验证 Bundle

以 DB 验证方式实现用户登录验证接口,对外提供用户登录验证服务。

●配置文件验证 Bundle

以配置文件验证方式实现用户登录验证接口,对外提供用户登录验证服务。

6.2. 工具箱 设计完毕了,是不是急着开始动手了呢,稍微忍耐下,不能空着手就开始呀,得先把工具箱里的工具准备好,好,下工具去。 既然是基于 Equinox,自然要先下 Equinox,但由于 Equinox 是 Eclipse 的工程,而且 Eclipse 3.1 以后的版本都是通过它来启动的,这也就意味在 Eclipse 3.1 以后的版本其实本身就包含了 Equinox 的,所以如果你采用的是 Eclipse 3.1 以后的版本,那么就省事 了 , 在 你 的 Eclipse 的 plugins 目 录 下 你 可 以 找 到 类似org.eclipse.osgi_3.2.0.v20060510.jar 这样的文件,它其实就是 Equinox 的 OSGI R4 Core Framework 的实现了,如果你采用的不是 Eclipse 3.1 以后的版本,由于我们在开发基于 Equinox 的应用时采用的也是 Eclipse,那么还是建议你去下个 Eclipse 3.1 以后的版本。

由于用户登录验证模块是个web性质的模块,我们得使用OSGI R4 中定义的Http Service,Equinox目前已实现了这个,到 http://download.eclipse.org/eclipse/equinox/drops/S-3.2RC7-200606021317/index.php上下载org.eclipse.equinox.http1.0.0.v20060601a.jar 以及 org.eclipse.equinox.servlet.api1.0.0.v20060601.jar,这是到目前为止Equinox对于Http Service实现的新的两个相关的jar,如果在看到这篇文档时已经有更新的版本,那么可以去Equinox的新版本中下载这两个jar包,下完这两个包后,把这两个包放到Eclipse的plugins目录下。

OK,启动Eclipse[ 笔者使用的Eclipse为 3.2 RC5 ],来检查下工具箱有没有准备好:

●第一步

图表 2 工具箱-第一步

●第二步

图表 3 工具箱-第二步

●第三步

图表 4 工具箱-第三步

选中上图中的 org.eclipse.equinox.http、org.eclipse.equinox.servlet.api、 org.eclipse.osgi 以及 org.eclipse.osgi.services。

●第四步

点击上图中的Run,如Console中如看到osgi>而且没有错误信息,则表明工具箱配置已成功了,而如果看到类似Address already in use: JVM_Bind则说明本机的80端口已被占用,由于Equinox的Http Service实现默认使用的是80 端口,所以会报这个错,那么我们可以通过在这里指定Http Service所使用的端口(进入第二步的那个窗口):

图表 5 工具箱-第四步

在 VM arguments 中填入这样的一行-Dorg.osgi.service.http.port=8080,后面 的 8080 可以指定为你想要设定的端口,设置好后点 Run,是不是正常的在 Console 中看到了 osgi>,恭喜恭喜。

●第五步

经过上步后整个工具箱的工具其实已经准备好了,后可以验证下: 在 console 的 osgi>后输入 ss,回车,是不是看到类似这样的界面呢:

图表 6 工具箱-第五步

既然用了http service的实现,那么我们应该可以通过web去访问,OK,到web 浏览器中输入http://localhost:8080,后面的 8080 替换为你自己的端口,应该会出现找不到网页而不是找不到服务器的提示。

经过上面的五个步骤,可以确定工具箱中的工具已经准备好了。

查看评论