您的位置:首页 > 其它

利用OSGI声明服务实现Corba服务的改善

2008-06-19 11:59 239 查看
问题的提出:
1. 客户对服务模块的质量要求很高,服务的停止时间长,会造成用户无法接受的经济损失。
2..通信协议采用Corba, 而Corba的服务部分对开发人员要求比较高。

要解决什么?
采用OSGI可以改善第一个问题,

解决方案:

实现本提案的功效所使用的技术手段:
Corba服务有它自己的规范,先用IDL定义接口,再通过工具将其转成java规范的模块,但最有用的是POA类,如:
publicabstractclass GetTimeIntfPOA extends org.omg.PortableServer.Servant implements org.omg.CORBA.portable.InvokeHandler,com.inventec.itc.itcnd.osgi.corba.GetTimeIntfOperations

从上可以看出,不论哪个Corba服务,都是org.omg.PortableServer.Servant的子类。

OSGI动态发现也有自己的规范,那就是必须是以Inteface的形式进行发布,才能被动态发现(启动和停止都能被别的程序发感知)。而且每个Corba服务都必须提供唯一的ID,所以对此我们可以定义一个接口,如下:

package com.inventec.itc.itcnd.osgi.corba.adapter;

publicinterface IOSGIRemote {

public String getRemoteName();

}

强制所有Corba服务的实现类实现这个接口,所以,一个Corba服务的实现类即是org.omg.PortableServer.Servant的子类,也是IOSGIRemote的一个子类。

在组件中加入以下代码

public void setOSGIRemote(IOSGIRemote remote){
final String id = remote.getRemoteName();
Servant servant = (Servant) remote;
}

通过OSGI的自动注入功能,我们就得到了我们想要的东西。
当类似于一个小型操作系统的OSGI系统启动时,自动发布组件会先启动,当系统中一个或多个Corba服务启动时,发布组件会自动感知并将其注册到命名服务上,同样,当Corba服务停止时,会自动将其从命名服务上清除。
同样,当发布组件更新或重启时,同样能够感知到系统中存在的Corba服务。这样对于Corba服务开发人员来说,已经不用关心自己开发的是不是Corba服务了,而只是只要实现接口中所定义的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐