一种插件部署和加载的方法及装置的制作方法

文档序号:6332545阅读:141来源:国知局
专利名称:一种插件部署和加载的方法及装置的制作方法
技术领域
本发明涉及一种软件插件的加载技术,特别涉及一种插件部署和加载的方法及装置。
背景技术
在大型软件开发中,为了方便对软件进行功能扩展,实现模块内的高内聚,模块间 的低耦合,为实现发布软件功能的可定制性,往往采用插件式开发,将一个个功能封装在插 件中实现,这些插件有多种类型,即遵循的插件接口不一样,而为了处理上的方便,这些不 同的接口可以派生于同一个基础接口。在综合型的网管中要管理各种专业网产品,而每种专业网产品拥有很多种设备, 专业网的特性也各有不同,由于不同设备之间存在差异,一个网管要管理数以万计的设备 就需要多个进程、分布式管理。由于不同进程所需部署的功能也不同,因此提供一种软件架 构来开发这种大型网管,管理不同的专业网,成为我们需要解决的问题。

发明内容
本发明的目的在于提供一种插件部署和加载方法,采用大型软件插件分组管理、 进程共享程序目录和分布式进程内插件部署及插件加载的方法,解决了大型网管管理不同 的专业网的问题。本发明的另一目的在于提供一种插件部署和加载装置,采用大型软件插件分组管 理、进程共享程序目录和分布式进程内插件部署及插件加载的方法,解决了大型网管管理 不同的专业网的问题。根据本发明的一个方面,提供了一种插件部署和加载方法,包括以下步骤A、将待加载的插件进行分组;B、建立用于部署进程要加载分组后的插件组的插件部署文件;C、部署文件分析模块根据插件部署文件及插件组的依赖关系计算得到插件组依 赖树;D、程序入口模块获取进程的进程名,启动进程;E、插件加载模块根据插件组依赖树按进程加载插件。根据本发明的另一方面,提供了一种插件部署和加载装置,包括插件分组模块,用于将待加载的插件按类型划分成适于按进程加载的插件组;插件部署模块,用于建立部署进程要加载插件组的插件部署文件;部署文件分析模块,用于根据插件部署文件及插件组的依赖关系计算得到插件组 依赖树;程序入口模块,用于获取所述进程的进程名,启动进程;插件加载模块,用于根据插件组依赖树按进程加载插件。与现有技术相比较,本发明的有益效果在于本发明通过分组形式加载插件,支持分布式管理,进程工作目录和程序目录分离,实现了不同功能进程共享程序文件。


图1是本发明提供的插件部署和加载方法的流程示意图;图2是本发明提供的插件部署和加载装置的结构示意图;图3是本发明实施例提供的网管插件分组示意图;图4是本发明实施例提供的进程启动过程和分析命令行获取进程名称的示意图;图5是本发明实施例提供的软件发布目录结构图。
具体实施例方式以下结合附图对本发明的优选实施例进行详细说明,应当理解,以下所说明的优 选实施例仅用于说明和解释本发明,并不用于限定本发明。图1显示了本发明提供的插件部署和加载方法的流程示意,如图1所示步骤S101,将待加载的插件进行分组。在此之前,需对插件接口进行定义建立程序的基础扩展点接口和该基础扩展点 接口的插件基础扩展点接口实例函数;建立派生于该基础扩展点的派生接口和该派生接口 的插件派生接口实例函数;定义插件的描述文件格式定义插件ID、插件接口类型和插件 库名称。如按产品功能可将插件产品分为产品插件单元PPU,PPU是顶层组,一个PPU下有 多个插件管理单元PMU,PMU下有多个插件功能组PMUFunction,插件功能组下有多个插件 或数据文件,这些插件功能组可以有交叉插件和数据文件。步骤S102,建立插件部署文件,在该文件中部署进程要加载的分组后的插件组,一 个进程可能有多个部署文件,进程按这些文件的并集加载插件。步骤S103,部署文件分析模块根据插件部署文件及插件组的依赖关系计算得到插 件组依赖树。步骤S104,程序入口模块通过分析命令行函数获取进程的进程名,启动进程。此外,程序入口模块需先创建插件工厂接口,再创建上下文接口,然后解析插件部 署文件、属性数据文件和插件组依赖树。在此之前,需建立属性数据文件,该文件是定义进程在启动或运行过程中需要的 一些名值对,这些属性文件是分层的,根据需要可以定义多层。步骤S105,插件加载模块根据插件组依赖树按进程加载插件。加载插件有两种方 式进程启动过程中加载某些插件或运行过程中按需加载插件。图2是本发明提供的插件部署和加载装置的结构示意,如图2所示,该装置包括插 件定义模块、插件分组模块、插件部署模块、部署文件分析模块、程序入口模块、属性数据模 块和插件加载模块。其中,插件定义模块包括插件基础扩展点定义单元、插件派生接口定义单元和插 件描述文件定义单元。插件基础扩展点定义单元建立程序基础扩展点接口和该基础扩展点接口的实例 函数。
插件派生接口定义单元建立派生于基础扩展点接口的派生接口和该派生接口的 实例函数。插件描述文件定义单元定义插件的描述文件格式,包括插件ID、插件接口的类 型和插件库名称。插件分组模块将待加载的插件划分成适于按进程加载的插件组。插件部署模块建立部署进程要加载插件组的插件部署文件。部署文件分析模块根据插件部署文件及插件组的依赖关系计算得到插件组依赖 树。程序入口模块获取所述进程的进程名,启动进程,并建立管理插件基础扩展点接 口实例函数和插件派生接口实例函数的插件工厂接口和建立描述运行环境的上下文接口, 以及解析插件部署文件、属性数据文件和插件组依赖树。属性数据模块定义进程启动和运行所需名值对的属性数据文件。插件加载模块根据插件组依赖树按进程加载插件。图3显示了本发明实施例提供的网管插件分组示意,如图3所示,顶层有bn. ppu、 uca. ppu 两个 PPU,其中 bn. ppu 下有 bn-core-c. pmu>bn-necommon-c. pmu 禾口 bn-res. pmu 多 个PMU,每个PMU下多个插件功能组PMUFunction,如其中bn_res. pmu下有两个功能组osf 和emf,各包含有一些目录,且存在共同的目录common,与common同级的目录下是一些数据 文件、插件及描述文件,其中同级的dll中为普通的动态库。图4显示了本发明实施例提供的进程启动过程和分析命令行获取进程名称的示 意,如图4所示,程序入口模块首先创建插件工厂接口,再创建上下文接口,在上下文的初 始化插件函数中创建本地系统接口 ILocalSystem,本地系统接口负责分析部署及加载启动 插件。插件工厂接口 IExtensionService、上下文接口 IContext和ILocalSystem对于每个 进程必须存在一个实例。图5显示了本发明实施例提供的软件发布目录结构,如图5所示,在procs下是 程序和数据文件,在works下是一些进程对应的目录,进程对应的目录下有一些子目录,如 log目录用来存放运行过程中产生的日志,而cbploy下用来存放插件部署文件和属性数据 文件。下面结合图1 图3对统一网管的需求进行说明。(一 )需求来源在统一网管中,需要将各种产品线的设备在一个网管中管理,各产品线有多种类 型的设备,各设备的差异较大。在一个网管中管理多个产品线的设备,既节省资源又便于统 一管理,在设备数量庞大的情况下,需要分布式的管理。(二)开发平台自适配通信环境 ACE(ADAPTIVE Communication Environment),编译器 vc7 或 gcc,支持Win32、solaris和Iinux等多个操作系统。(三)插件式开发的实现1、定义基础扩展点。class IExtension {public:
IExtension(const char氺version =〃 V 1. O");virtual IExtension () {}virtual int Init (int argc, char^argv[]);virtual int Finish();virtual void SetVersion (const char氺version);virtual const char氺GetVersion();virtual void ProcessDebugCommand(std::string&cmd,::StringList&para s, std::ostream&os);private:_STD_string m_strVersion ;};Init根据进程启动参数初始化插件。Finish用于在扩展点销毁前做清理
工作,如关闭句柄和释放内存等。GetVersion和SetVersion用于设置插件版本。 ProcessDebugCommand是一个支持命令行调适的方法,类似基础功能可根据需要添加函数。插件基础扩展点实例创建函数IExtension*Create_Extension (const char*path,CProperties*properties)是插件动态库对唯一的导出函数,创建该插件基础 扩展点的实例,path是插件所在的目录路径,properties是该插件属性的名值对,函数返 回扩展点指针。插件的名称用‘·,分割字符串,如ican. context, localservice. log表示一个 插件id, ican. context, localservice表示是一个ILocalService对应的插件,通过对插 件id力口扩展的方式表示其子插件,如ican. context, localservice. log. xxplg表示ican. context, localservice的子插件,这种id有点长,可以采用别名方式来简化插件id,如log 可以作为 ican. context, localservice. log 的别名。插件描述文件用xml文件定义,文件中定义插件ID、版本、对应dll的名称等,也可 以约定某种类型得子插件由其父插件来加载。2、定义本地服务提供者接口 ILocalService、服务接口 IServant和IServant的本 地或远程代理IService接口,这些接口派生自IExtension,这些插件实现了网管的具体功 能,因此这些插件在数量上有很多,如果需要还可以定义一些其它插件接口。下面给出了这 三个接口的主要方法2. IlLocalService对本进程模块提供服务virtual void PreInit (IContext^ctx)virtual IDefaultContext氺GetCtx(void)其中,PreInit用于设置上下文,GetCtx用于获得上下文。2. 21 Servant对本进程或远程进程提供服务,服务提供主要通过Get、Set来实现virtual void PreInit (IContext^ctx)virtual CMsg*Get(CMsg&msgbuf, CMsgHead&headinfo)virtual void Set(CMsg&msgbuf, CMsgHead&headinfo)PreInit用于设置上下文,Get是有应答报文处理函数,CMsg表示报文,headinfo 表示命令码和用户等报文头信息,Set是无应答报文处理函数。
2. 3客户通过IService实现对IServant的Get和Set的调用,通过 IContext: HasServant 可以判断 servant 是否在本地。virtual void PreInit(IContext^ctx, const char^servantName)virtual void SetServant (IIcanServant^servant)virtual CMsg*Get(CMsg&msgbuf, CMsgHead&headinfo)virtual void Set(CMsg&msgbuf, CMsgHead&headinfo)PreInit用于设置上下文以及对应IServant的名称servantName, SetServant用 于设置对应IServant的名称,Get是有应答报文处理函数,Set是无应答报文处理函数。3、定义插件分组,按产品功能分为多个PPU,PPU是顶层组,一个PPU下有多个PMU, 一个PMU下有多个PMUFunction。PPU对应一个目录,而PMU对应PPU下的一个子目录,一 个插件功能组可以含有PMU的多个目录,每个目录下有多个插件或数据文件,这些插件功 能组可能有交叉目录。PMUFunction中还定义了对其它功能组的依赖关系。4、定义进程部署,在进程工作目录的文件中部署定义,该文件可以有多个,部署定 义文件用于定义本进程部署哪些PMUFunction。5、定义 IContext 和 IExtensionService 接口,这些接口可以派生自 IExtension。5. 1 j^X IExtensionService 白勺力夕去virtual IExtension*CreateExtension (const char氺extName, boo 1 isSingleton);virtual void DestroyExtension (IExtension^pcExtension) = O ;virtual StringList GetExtensions (const char*pcSub ject) = 0;CreateExtension按照是否以单例方式创建名为extName的基础扩展点实例。 DestroyExtension销毁扩展点。GetExtensions获取主体pcSubject的所有子插件,即用 ‘.’分割的插件ID的部分前缀。5. 2IContext在某个进程中创建和运行插件的上下文的方法virtual void PreInit (IExtensionService*)virtual ILocalService^GetLocalService(const char*extName, const char氺strpmufunc);virtual IServant^GetServant (const char*extName, const char氺strpmufunc);virtual IService^GetService (const char*extName, const char氺strpmufunc);virtual IExtensionService^GetExtService();virtual bool HasServant(const char*extName, const char^strpmufunc);PreInit用于设置插件工厂。GetLocalService获得插件功能组strpmufunc下的 名为extName的ILocalService,strpmufunc为NULL,其中,查找范围为本进程的所有PMU。 GetServant 获得插件功能组 strpmufunc 下的名为 extName 的 IServant。GetService 获得 插件功能组strpmufunc下的名为extName的IService。HasServant判断本进程插件功能 组strpmufunc是否存在名为extName的IServant。GetExtService获得插件工厂。6、ILocalSystem派生于ILocalService,是本进程部署分析和插件组分析模块,
8读取本进程属性数据文件中的名值对,分析本进程部署哪些插件组及插件组依赖树,在本 实施方式中只要分析部署哪些功能组PmuFimction以及它们的依赖树,依赖树中叶子节点 对父节点有依赖,然后从树根节点分层向叶子节点加载插件,同一个PMUFunction下的插 件可以按目录或插件名定义先后加载顺序。约定某种原则在程序启动时加载某些类型插 件,有些类型插件按需加载,如本实施方式中启动时加载具有IServant扩展点的插件。7、实现上面各接口功能或插件,发布软件。插件及dll按PPU、PMU分目录放在 Procs目录下,PMUFunction中含有那些目录和插件,每个功能组对应一个xml描述文件,在 Procs同级别定义works目录,works目录下是一些进程目录,存放与进程相关的一些数据 文件,如进程部署文件和属性数据文件等。8、程序入口模块通过程序的命令行指定进程名称,通过进程名称知道进程的工作 目录,这样进程入口模块可以加载不同的进程。创建IContext和IExtensionService,传递 进程工作目录给ILocalSystem,ILocalSystem负责按部署加载启动时需要的插件,运行时 直接调用IContext按需加载插件。此外,可以根据本发明的技术方案的说明和具体实施方式
做出各种可能的改变或 替换,如IContext和IExtensionService合并,描述文件不采用xml格式,基础扩展点接口 添加或减少一些方法,或是才用面向过程语言的结构及函数指针实现接口。综上所述,本发明具有以下技术效果1、分组管理插件,便于大型软件对插件进行 管理2、可以通过文件定义插件id和类型。3、具有统一的插件基础接口,便于创建扩展点。 4、支持分布式部署。5、进程工作目录和程序目录分离,便于多个进程共享程序文件。6、支 持进程相关属性名值对,便于进程变量的定义。7、由于采用面向对象接口机制,有很高的抽 象处理能力。此外,方法本身是通用的,不依赖于特定的操作系统和特定的面向对象语言, 甚至在结构化语言中也能实现这种插件机制。尽管上文对本发明进行了详细说明,但是本发明不限于此,本领域技术人员可以 根据本发明的原理进行各种修改。因此,凡按照本发明原理所作的修改,都应当理解为落入 本发明的保护范围。
权利要求
一种插件部署和加载方法,其特征在于,包括以下步骤A、将待加载的插件进行分组;B、建立用于部署进程要加载分组后的插件组的插件部署文件;C、部署文件分析模块根据所述插件部署文件及所述插件组的依赖关系计算得到插件组依赖树;D、程序入口模块获取所述进程的进程名,启动进程;以及E、插件加载模块根据所述插件组依赖树按所述进程加载插件。
2.根据权利要求1所述的一种插件部署和加载方法,其特征在于,在所述步骤A之前, 还包括以下步骤建立用于添加插件实现基础功能的基础扩展点接口和所述基础扩展点接口的插件基 础扩展点接口实例函数;建立派生于所述基础扩展点的用于管理不同类型插件的相应派生接口和所述派生接 口的插件派生接口实例函数;以及 定义所述插件接口的类型。
3.根据权利要求1所述的一种插件部署和加载方法,其特征在于,在所述步骤D之前, 建立用于定义进程启动和运行所需名值对的属性数据文件。
4.根据权利要求3所述的一种插件部署和加载方法,其特征在于,在所述步骤D和步骤 E之间,还包括以下步骤所述程序入口模块建立用于管理所述插件基础扩展点接口实例函数和所述插件派生 接口实例函数的插件工厂接口;所述程序入口模块建立用于描述运行环境的上下文接口 ;以及所述程序入口模块解析所述插件部署文件、所述属性数据文件和所述插件组依赖树。
5.一种插件部署和加载装置,其特征在于,包括插件分组模块,用于将待加载的插件按类型划分成适于按进程加载的插件组; 插件部署模块,用于建立部署进程要加载插件组的插件部署文件; 部署文件分析模块,用于根据所述插件部署文件及所述插件组的依赖关系计算得到插 件组依赖树;程序入口模块,用于获取所述进程的进程名,启动进程;以及 插件加载模块,用于根据所述插件组依赖树按所述进程加载插件。
6.根据权利要求5所述的一种插件部署和加载装置,其特征在于,还包括插件定义模块,用于定义插件基础扩展点接口、派生接口、所述插件基础扩展点接口的 实例函数、所述派生接口的实例函数和所述插件接口的类型。
7.根据权利要求6所述的一种插件部署和加载装置,其特征在于,所述插件定义单元 包括插件基础扩展点定义单元,用于建立添加插件实现基础功能的基础扩展点接口和所述 基础扩展点接口的插件基础扩展点接口实例函数;插件派生接口定义单元,用于建立派生于所述基础扩展点的用于管理不同类型插件的 相应派生接口和所述派生接口的插件派生接口实例函数;以及 插件描述文件定义单元,用于定义所述插件接口的类型。
8.根据权利要求5所述的一种插件部署和加载装置,其特征在于,还包括 属性数据模块,用于定义进程启动和运行所需名值对的属性数据文件。
9.根据权利要求8所述的一种插件部署和加载装置,其特征在于,所述程序入口模块 还用于建立管理所述插件基础扩展点接口实例函数和所述插件派生接口实例函数的插件 工厂接口 ;建立描述运行环境的上下文接口 ;以及解析所述插件部署文件、所述属性数据 文件和所述插件组依赖树。
全文摘要
本发明公开了一种插件部署和加载的方法及装置,该方法包括以下步骤将待加载的插件进行分组;建立用于部署进程要加载分组后的插件组的插件部署文件;部署文件分析模块根据插件部署文件及插件组的依赖关系计算得到插件组依赖树;程序入口模块获取进程的进程名,启动进程;插件加载模块根据插件组依赖树按进程加载插件。本发明通过分组形式加载插件,支持分布式管理,进程工作目录和程序目录分离,实现了不同功能进程共享程序文件。
文档编号G06F9/445GK101937353SQ20101029002
公开日2011年1月5日 申请日期2010年9月20日 优先权日2010年9月20日
发明者张新平, 祝继洪 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1