插件体系结构软件的原理和实现
2010-04-12陈翥
陈 翥
成都飞机设计研究所,四川 成都 610041
0 引言
随着计算机技术的发展,软件体系结构和开发方法也在发生着重大变化。为了高效率地进行软件开发,并且开发出高质量的产品,人们一直在寻求更好的软件体系结构和开发方法。插件式软件体系结构和开发方法正得到越来越多的应用,当前有很多成功的软件产品采用此种体系结构来开发。插件式体系结构是一种非常灵活的组件式结构,它把程序的功能分散在插件中来完成,插件是独立于系统可独立开发的程序模块,它能够动态地插入到系统中,并且插件可以被自由地插入、删除和替换。因此,它有着相当突出的优点:能够提高软件开发的并行性和开发效率,降低设计开发难度,缩短开发周期,增强应用程序的可运行性、可测试性和可维护性。
成都飞机设计研究所现拥有OA、经费管理、P3E等多个应用系统,由于各应用系统之间流程未能集成,造成流程的中断,故考虑通过RTX进行不同应用系统流程间的消息推送。在不影响RTX正常使用的前提下,开发人员充分利用插件体系结构技术,自主开发了“应用系统转发消息插件”。本文以RTX“应用系统转发消息插件”开发为例,分析插件体系结构软件的设计原理与实现过程。
1 插件体系结构原理
插件体系结构是近年发展起来的一种软件体系结构,其本质在于不修改软件主体的情况下对软件功能进行扩展与加强,当插件的接口公开后,任何公司或个人都可以制作自己的插件来解决一些操作上的不便或增加新的功能,也就是实现真正意义上的“即插即用”软件开发。体系结构见图1:
图1
插件软件结构将待开发的目标软件分为两部分,一部分为程序的主体或主框架,可定义为平台;另一部分为功能扩展或补充模块,可定义为插件。平台所完成的功能应为一个软件系统的核心和基础,这些基本功能即可为用户使用,也可为插件使用,就是又可以把平台功能分为两个部分,内核功能和插件处理功能。平台的内核功能是整个软件的基础,一个软件的大部分功能应由内核功能完成。平台的插件处理功能用于扩展平台和管理插件,为插件操纵平台和与插件通信提供标准平台扩展接口。插件所完成的功能是对平台功能的扩展与补充。
为了实现插件结构的软件设计需要定义两个标准接口,一个为由平台所实现的平台扩展接口;另一个为插件所实现的插件接口。这里需要说明的是:平台扩展接口完全由平台实现,插件只是调用和使用,插件接口完全由插件实现,平台也只是调用和使用。平台扩展接口实现插件向平台方向的单向通信,插件通过平台扩展接口可获取主框架的各种资源和数据。插件接口为平台向插件方向的单向通信,平台通过插件接口调用插件所实现的功能。
2 插件体系结构的实现
那么用什么样的方法和技术实现插件(程序插件),从目前已有这方面软件的设计方法来看,一种是使用传统DLL方法的实现;另一种是使用COM方法的实现。
不管用那种方式实现,平台与插件之间必须事先定义好接口规范。对于第一种方式而言,接口规范是一系列的函数,这些函数由插件DLL引出,由平台来调用;对于第二种方式,接口规范是COM接口,插件是一个COM组件。
第二种方式在第一种方式的基础上解决了跨进程、跨平台的问题。它是一种更规范、更先进的方式,RTX也采用了这种实现方式。为此开发人员围绕RTX插件体系结构、RTX插件的管理机制、RTX接口等方面进行了深入的研究。
2.1 RTX体系结构
RTX是腾讯公司推出的基于客户服务器架构的企业级即时通信平台,为满足企业多样化的需求,无论在服务器端还是客户端都提供了二次开发的接口体系,为用户在RTX平台上开发特定的软件功能提供了便利。本文仅以RTX客户端(以下简称RTXC)为例来说明插件体系结构的实现方式RTXC的体系结构如图1。
RTXC平台指的是腾讯公司发布的RTX客户端软件,它包括了两部分,一是RTXC的内核功能,即RTXC的基本功能部分;二是RTXC与插件交互相关的功能,包括插件的发现、加载、启用、卸载等功能。
RTXC插件则是由用户开发,实现了IRTXCPlugin接口的COM组件,它实现用户需要的一些特殊功能,作为RTXC功能的扩充部分。
RTXC由平台与插件两部分组成,平台不依赖于插件而存在,没有插件它也能单独运行。但插件却需要依赖于平台,只有它被平台加载后才能发挥作用。另外,插件是否被启用并不是由插件本身决定,而是由RTX客户端用户来决定。最后,被用户启用的插件还需要通过平台进行实例化才能真正的发挥最用。
2.2 RTX插件管理机制
对于插件体系结构的应用程序,平台的插件管理功能是必不可少的,它包括了插件的注册、加载、启用、停用、卸载等功能。为了实现插件的动态加载,平台必须解决两个问题,一是平台必须知道要加载的插件放在什么地方;二是平台必须自动确定那些插件需要被加载、启用、停用、卸载。
在RTXC中,专门提供了一个插件管理器来进行插件的管理,该插件管理器由COM组件RTXPluginMgr来具体实现。对于插件存放位置的问题,RTX的解决方案是将插件统一的存放到应用程序的特定目录下,即…/TECENT/RTXC/PLUGINS/插件名称。对于插件加载的问题,RTX将每个插件的配置信息存放到文件RTXPlugins.xml中,并根据配置文件中每个插件的标志位AutoLoad来决定对该插件的处理方式。如果允许加载,就到配置文件中Identifier标识的位置去加载插件。
2.2.1 未安装插件
当用户未安装插件时,PLUGINS目录下没有任何内容,配置文件RTXPlugins.xml的内容也只有简单的两行:
如果RTX在这种状态下启动,插件管理器自动读取配置文件内容后将不做任何操作。
2.2.2 安装插件后
安装插件后,RTX会自动的将插件安装到…/TENCENT/RTXC/PLUGINS/MESSAGESENDPLUGIN路径下,同时在配置文件中注册应用系统装发消息插件的内容,此时RTXPlugins.xml文件的内容如下:
-
Name = “应用系统转发消息” Description = “应用系统转发消息插件” AutoLoad = “1” Identifier=“Tencent.RTX.MessageSendPlugin”>PluginsMessageSendPluginMessageSendPlugin.dll 如果RTX在这种状态下启动,插件管理器自动读取配置文件后发现有应用系统转发消息插件的信息,根据标志位AutoLoad=“1”,确定该插件应该加载到RTX中并启用,然后到配置文件中指定的路径去加载插件MessageSendPlugin.dll。 2.2.3 启用插件 当用户启用插件时,RTX自动将配置文件中该插件的标志位AutoLoad设为1。下次启动RTX时,RTX插件管理器将根据此加载该插件。 2.2.4 停止插件 当用户停止插件时,RTX自动将配置文件中该插件的标志位AutoLoad设为0。下次启动RTX时,RTX插件管理器将根据此加载该插件,但不启用。 2.2.5 卸载插件 当用户卸载插件时,RTX自动将配置文件中该插件的标志位AutoLoad设为2。下次启动RTX时,RTX插件管理器将根据此从RTX平台上删除该插件。即删除插件的安装和配置信息。 在插件体系结构中,接口在平台于插件之间的通信起着至关重要的作用。RTX中涉及到两类接口,一类时由平台定义,但由插件实现,提供给平台调用的插件接口(见表1);另一类是由平台定义并实现,提供给插件调用的平台扩展接口(见表2)。 表1 插件接口 表2 平台扩展接口 通过RTX转发应用系统消息需要记录每次消息转发的全过程,同时要考虑消息接收人离线不能接收本次消息的状况。针对这种需求,应用系统转发消息插件设计了6种消息命令,分别标识6种状态。 1)CMD_MESSQGE_SEND:发送方将转发的应用系统消息发送给服务器; 2)CMD_DB_MESSAGE_SEND:服务器记录本次消息的情况,并将消息转发给未离线的接收方; 3)CMD_MESSAGE_LOGIN:通知服务器该账号上线; 4)CMD_OFFLINE_MESSAGE_SEND:服务器接收到上线消息后,查询该账号的离线后;的消息记录,如有则发送该账号的离线消息记录给该账号; 5)CMD_MESSAGE_QUERY:发送方向服务器发送查询本账号历次消息记录的请求; 6)CMD_MESSAGE_HISTORY_SEND:服务器收到查询消息记录请求后,查询数据库记录后返回该账号的历史消息信息。 在应用系统转发消息插件的实现中,除了实现了插件最基本的接口IRTXPlugin外,还实现了于RTX TAB页相关的接口,让该插件的图标能出现在RTX下方TAB页上供用户实现历史消息查询操作。为了保证数据传输的可靠性和快捷性,该插件采用RTX内部通道来发送消息,调用了IRTXCRoot、IRTXCData等RTX提供的扩展接口。 插件体系结构是一种开放的体系结构,由于它具有功能无限扩展性,为延长商业软件的寿命起到了很重要的作用。RTX正是采用这种机制,充分利用第三方和用户的力量不断为其进行功能扩充,增强了RTX的生命力。 [1][美]DONBOX著.COM本质论.潘爱民,译.北京:中国电力出版社,2001. [2]RTX2006ClientSDK.chm.腾讯公司.2.3 RTX接口
2.4 应用系统转发消息插件的设计与实现
3 结论