摘 要: 在基于.Net平台的信息系统开发过程中,组件-控件的复用已经很常见,但是,逻辑流程部分的代码始终没有得到有效的缩减。针对这种现状,提出对插件虚拟机的研究。在组件-控件和功能模块间抽象一层“插件”,将信息系统划分为不同的“插件”,通过XML配置文件来定义“插件”间的逻辑关系,同时,“插件”也可以很好地实现功能的复用。插件虚拟机用于解释执行该配置文件。
关键词: XML;插件;虚拟机;业务逻辑
虚拟机并不是新技术,早在20世纪六七十年代,IBM研究中心就在试验室里实现了其主机的镜像,算是最原始的虚拟机了。之后一段时间发展缓慢,一度由于分时操作系统的出现而处于停滞状态。20世纪90年代随着Java虚拟机的推出,使对虚拟机技术的研究成为处理器设计人员、软件设计人员、服务器设计人员和网络安全设计人员的热门研究课题。虚拟机并不只是应用于对操作系统,目前,在具体应用领域的虚拟机开发得到迅速发展。这里将虚拟机的概念首次应用到Net环境下的信息系统的开发过程中。
为了便于理解插件虚拟机的作用,首先介绍一种自动化业务流程规范语言——业务流程执行语言BPEL(Business Process Execution Language),这与插件虚拟机中用XML配置文件实现业务逻辑有相似之处。BPEL是基于XML和Web服务的,用XML文档写入BPEL中的流程能在Web服务之间以标准化的交互方式得到精心组织,它简化了将多个Web服务合成到一个新的业务流程中的操作[1]。这些流程能够在任何一个符合BPEL规范的平台或产品上执行。BPEL通过合作伙伴连接来实现服务的调用,合作伙伴连接只定义所要调用的接口,它是一个抽象的网络服务描述语言WSDL(Web Services Description Language)接口,这个接口在BPEL运行时再绑定到真正的服务提供者上面[2]。这样使接口和实现之间达到了一种松散耦合的效果,Web Service实现了接口的可重用性,而BPEL实现的是流程的可重用性。在XML配置文件中,“插件”类似于Web Service的接口,而BPEL对Web Service提供的服务类似于XML配置文档对“插件”的执行顺序的控制。插件虚拟机的研究,提出了一种新的业务逻辑部分的实现,在此之前,业务逻辑部分只能通过程序代码实现,现在转换成只需要编写描述性的文本语言,从而有效减少开发工作量,降低软件开发成本。
1 相关名词简介
1.1 虚拟机
虚拟机按其表面意思来理解就是指虚拟的机器,这个机器并不是由真实的硬件所组成,而是通过软件系统虚拟而成的具有跟真正机器类似功能的一种实现[3-5]。“插件虚拟机”的命名,是因为其设计思想与计算机的基本思想相类似:计算机的工作基于存储程序与程序控制,其中存储程序包括对程序及运行中所需数据的存储,程序控制指计算机对程序中一条条指令的取出、分析与执行[6];在插件虚拟机中,其主要工作是数据的存储与插件的控制,数据的存储包括外界输入的数据及运行时数据的存储,插件的控制包括插件的取出、分析与执行。从功能上看,CPU的内部结构分为控制单元、逻辑单元和存储单元3大部分[7],这3个部分互相协调进行分析、判断、运算,并控制计算机各部件进行工作。插件虚拟机中根据各部分具体实现的功能,可以把它分为如下几部分:插件运行时、插件执行器、路由规则器、插件管理器、消息管理器、线程管理器、共享数据堆和运行时上下文。通过这几部分的相互协作,共同完成信息系统中插件的有序调用与执行。
1.2 插件
在开发信息系统软件的时候,现在最常见的做法是把软件按功能模块来划分,将每个功能模块分别设计好之后,最后再组合起来形成最终的信息系统软件。目前,在程序复用方面,最常见的是组件复用,最具有代表性的是微软公司的组件对象模型COM(Component Object Model)和Sun公司的企业级JavaBean EJB(Enterprise JavaBean)。COM是基于分布式对象模型的开放标准,它详细规定了一个COM组件所应具有的二进制内存结构是组件集成的框架,这个框架支持对象的互操作性和可重用性[8-9],COM组件的创建由COM库和类工厂协作完成,它是ActiveX技术的基础,并且运用于大多数的Windows编程;EJB是一种基于Java环境的针对服务器端的组件模型[10],其设计目标与核心应用是部署分布式应用程序,同时它定义了一个用于开发基于组件的企业多重应用程序的标准,EJB技术简化了用Java语言编写企业级应用系统的开发、配置和执行[11]。插件虚拟机中的“插件”是在模块、控件-组件中抽象出来的,单个模块中可以包含多个插件,插件中可以包含控件和组件,在复杂的应用系统中可以实现插件的嵌套,例如:信息系统首先划分为几个插件,插件中可以包含功能模块,然后功能模块中再包含插件。
2 虚拟机的设计及实现
2.1 组成结构
插件虚拟机的工作是围绕“插件”的调用展开的,信息系统被划分为插件的形式,插件被统一定义在配置文件中,其中插件的编码与实现插件的类相互对应,便于插件虚拟机在合适的场景与环境中调用插件。根据插件虚拟机要完成的功能将其分为以下几部分,其结构图如图1所示。
(1)插件虚拟机运行时,为插件提供面向操作系统和Net环境的基础服务,解释模块配置文件,根据模块配置文件创建各种子系统;
(2)上下文管理器,提供对插件虚拟机传入的参数的封装;
(3)共享数据堆,提供插件间的数据共享服务;
(4)消息管理器,提供插件间的消息发送功能;
(5)插件管理器,负责查找、加载、缓存插件;
(6)插件执行器,负责从插件池中取出插件,执行插件,并根据插件参数确定插件显示模式;
(7)路由规则器,主要负责确定下一个需要执行的插件的id,并将插件id发送给插件执行器,由插件执行器运行id对应的插件;
(8)线程管理器,提供操作系统的线程封装服务,提供线程间数据传递服务。
2.2 插件虚拟机的实现
插件虚拟机的实现,有其完备的执行过程,不仅能够完成基本的功能,而且能够处理运行过程中产生的各种异常。其主要的技术点包括:插件间数据的存储、插件的生命周期以及接口规范等。启动插件虚拟机,会检查各部分的完整性并加载XML配置文件中定义的所有“插件”,用户界面输入的数据会在插件虚拟机中的得到相应的处理并触发相应“插件”的执行。插件虚拟机的工作流程如图2所示。
插件虚拟机运行时,主要包括以下步骤:
(1)插件虚拟机运行时加载并读取配置文件信息,根据配置文件创建子系统。子系统包括:路由规则器、消息管理器、共享数据堆、线程管理器、上下文管理器、插件管理器、插件执行器。然后,插件虚拟机运行时调用插件管理器;
(2)插件管理器加载配置文件中涉及到的插件,由加载单元通过Net环境调用操作系统,在操作系统下查找插件。插件虚拟机运行时包含在名为pluginvm core.dll的动态链接库中,为插件提供面向操作系统和Net环境的基础服务。具体包括:
①文件操作及路径查找服务;
②唯一主机码创建(包含CPU-网卡),即密码验证服务,通过读取主机唯一的CPU序列号以及网卡的序列号,按照相应的公式计算出验证码,与软件中存储的密码相匹配,保障了软件安装合法性,可以有效防止盗版;
③加密解密;
④面向Window操作系统API的托管封装;
⑤解释模块配置文件,根据模块配置文件创建各种子系统。
插件管理器查找到所有的配置文件中涉及到的插件后,确认可用的插件然后加载,插件管理器加载完毕后,等待插件执行器调用。
加载配置文件中将插件加载至插件管理器中,由插件管理器统一管理加载的插件,并且将参数存储至上下文管理器中。上下文管理器提供对运行插件虚拟机传入的参数的封装,具体为一个面向对象的哈希表;
(3)路由规则器根据插件执行器调用插件后返回的结果或者根据加载单元提供的插件调用入口点确定插件执行器需要执行的插件编码,并将该插件编码传递给插件执行器;
(4)插件执行器接收路由规则器传入的插件编码,并从上下文管理器中获得和本插件相关的参数;插件执行器通过调用插件的约定方法并在调用时传入从上下文管理器中获得的参数来执行插件;
将插件执行过程中产生的数据,存储至共享数据堆中,以供其他插件调用。不同的插件可以将需要共享的数据放入共享数据堆中,插件虚拟机退出后共享数据堆可以自动回收。插件虚拟机维护共享数据堆中的数据的引用计数,当数据引用计数为0的时候,共享数据将被自动回收。
插件执行器负责从插件管理器中取出插件,调用插件的特定方法Excute Plugin(PluginParam param)执行插件;插件执行器还负责处理插件异常信息,如果遇到需要退出插件虚拟机的异常则直接调用插件虚拟机提供的退出函数ExitVm(Excption ecode)退出插件虚拟机。
插件执行器执行完毕当前插件后,还将当前插件运行完毕后返回的数据转发至路由规则器中,路由规则器根据插件执行器返回的数据确定下一个需要执行的插件的编码,并将插件编码发送给插件执行器,由插件执行器运行编码对应的插件。
(5)插件间可以通过插件虚拟机发送/接收消息。消息管理器包括消息队列和消息派发器,消息队列接收消息,并将其加入队列,消息派发器按照队列顺序将消息派发给该消息所指定的插件。消息中携带有需要执行插件的信息,消息管理器向插件管理器中的需要执行的插件(若插件管理器中没有加载所述的需要执行的插件,则由插件管理器重新加载,然后由插件执行器执行。具体过程与初始加载插件时一致:由加载单元通过Net环境调用操作系统,在操作系统下查找插件。加载后的插件存储至插件管理器中,参数存储至参数封装单元中,然后由插件执行器可以调用)派发该消息,由插件管理器将该插件的编码传给插件执行器,最终插件执行器根据该插件的编码执行该插件。消息管理器的功能还有:消息队列,负责存储插件发送过来的消息,并按照先后顺序排成队列的形式。其中,插件需要实现AcceptRunMsg(RunMessage msg)接口接收插件管理器发送的消息。
目前,随着软件行业的发展,其规模和复杂性提高、使用范围扩大,为了便于维护和管理,软件开发过程中逐渐出现对开发方法的研究、软件管理的规范、体系结构的分离[12]。在开发信息系统软件过程中,通常会将一个系统分为几个相互独立的功能模块,由不同人员来开发,最后再根据用户的操作逻辑和业务逻辑组织起来。通过对插件虚拟机的研究,实现了缩减业务逻辑部分代码,首次提出用配置文件的描述语言代替业务逻辑部分的代码;其次,以“插件”的形式来实现信息系统中程序的复用,同一“插件”可以被多个模块的配置文件使用。由此,可以降低软件开发成本,缩短周期,增强可读性,更加便于维护和管理。
参考文献
[1] 刘树军,王炳同,李莉.基于WS-BPEL的Web服务组合技术[J].计算机系统应用,2012(8):206-209.
[2] 陈建飞,申晨光,韩伟力.面向WS-BPEL的访问控制策略合成研究[J].计算机应用与软件,2012,29(3):195-197.
[3] 刘菲军,陈俊杰,郭涛,等.云计算下虚拟机部署机制的研究[J].电脑开发与应用,2012(5):4-6.
[4] 邓维,廖小飞,金海.基于虚拟机的数据中心能耗管理机制[J].中兴通讯技术,2012(4):15-18.
[5] Wu Dongyao, Wei Jun, Gao Chushu, et al. Event-driven process execution model for virtual machine[J]. Computer Integrated Manufacturing Systems, 2012(8): 1675-1685.
[6] 詹姆斯,瑞维著,安虹,等译.虚拟机:系统与进程的通用平台第二版[M].北京:机械工业出版社,2009.
[7] EMOTO, MASAHIKO, YOSHIDA, et al. Application of virtual machine technology to real-time mapping of Thomson scattering data to flux coordinates for the LHD[J]. Fusion Engineering and Design, 2012(87): 2076-2080.
[8] 刘春泉,周绍梅,刘小东.COM在软件复用中的应用[J].计算机与现代化,2005(5):28-30.
[9] 潘恒.中间件技术——COM组件的探究[J].科协论坛:下半月,2011(4):61-62.
[10] 乔波.新一代EJB组件技术研究[J].科技信息,2009(5):62-63.
[11] 刘秋梅,郑耿忠.EJB组件技术在数字参考咨询系统中的应用[J].图书馆学刊,2010(12):85-87.
[12] 夏明忠,夏以轩,李兵元.软件模块化设计和模块化管理[J].中国信息界,2012(11):56-59.