发明内容
本发明旨在解决现有技术的缺陷,提供一种以功能单元为基础的程序开发和执行的方法和系统。本发明的目的由以下技术方案实现:
一种以功能单元为基础的任务程序创建方法,其特征在于,包括以下步骤:
(1)描述程序单元信息;
(2)定义程序单元的输入参数信息;
(3)建立可供选择的脚本逻辑执行引擎列表;
(4)选择脚本逻辑执行引擎,并按所选脚本逻辑执行引擎所对应的脚本语言规范编写程序单元的逻辑体;
(5)将若干程序单元保存在程序单元数据库中,并建立程序单元列表;
(6)从现有的程序单元列表中选择程序单元;
(7)为所选程序单元的输入参数设定引用单元顺序号或常量值;
(8)按彼此关联性将所选程序单元添加到任务的程序单元队列中,并据此获得各程序单元的顺序号;
(9)选择执行终端,并建立任务与执行终端间的关联;
(11)保存任务于任务程序数据库。
所述描述的程序单元信息包括单元名称、创建者、单元类型、单元功能说明、可能抛出的例外的类型名、执行结果类型标识、脚本逻辑执行引擎标识。
上述步骤(2)中定义的输入参数信息包括:参数名及参数类型。
上述步骤(6)中是按用户设定的查询条件,选择出需要的程序单元。
所述引用单元顺序号为已存在于当前创建任务的程序单元队列中的、其输出结果与该输入参数的类型相同的、其它程序单元的顺序号。
所述编写程序单元的逻辑体时,满足以下条件:①逻辑体以参数变量名调用本程序单元的输入参数;②逻辑体内定义的变量及其值只在逻辑体内有效。
一种以功能单元为基础的任务程序的执行方法,其特征在于,包括以下步骤:
(1)建立并保存可供选择的执行终端的列表;
(2)从执行终端的列表中选择执行终端;
(3)将待执行的任务程序与所选择的执行终端进行绑定;
(4)执行终端定期轮询并下载与其绑定的任务;
(5)从任务程序的程序单元队列中取出第一个程序单元;
(6)调用程序单元所对应的脚本逻辑执行引擎,执行该程序单元的逻辑体,并保存执行结果;
(7)根据执行结果,决定下一个程序单元的顺序号,如下一个程序单元不存在,结束本任务;否则,根据顺序号从程序单元队列中取出对应的程序单元,并重复步骤(6)。
在执行方法的步骤(6)之前,判断程序单元是否存在,如是,执行步骤(6);如否,则判断本任务已经结束,返回任务执行结果。
所述判断程序单元是否存在的依据是:执行失败标记是否已设置,和/或,下一个程序单元实例为空;如执行失败标记已设置,则表示本程序单元实例的执行已非正常结束,返回任务执行结果;否则,如下一个程序单元实例为空,则表示本程序单元实例的执行已正常结束,返回任务执行结果;否则,表示本程序单元实例的执行尚未完成,则遍历程序单元中的所有输入参数,如果参数中的引用单元顺序号已定义,用与顺序号对应的程序单元的最近输出结果值对该输入参数进行赋值。
一种以功能单元为基础的任务程序开发和执行系统,其特征在于,包括:
程序单元描述模块,包括:程序单元定义子模块,接受用户输入,实现对程序单元进行概括性描述;逻辑体编辑子模块,接受用户输入,实现对程序单元的逻辑体进行编辑
任务管理模块,包括:任务定义子模块,接受用户输入,实现对任务的定义;接口模块,接受执行终端的查询任务的请求;存储模块,在数据库或文件系统中存取任务。
所述执行终端,包括:读写模块,按一定的协议从任务管理模块中获得任务,并将执行结果保存在任务管理模块;程序运行模块,执行包括在任务中的程序单元。
本发明通过提供一种以功能单元为基础的任务程序的创建和执行方法及系统,达到了以下有益效果:(1)不同计算机语言,无论是编译型的或解析型的语言开发的程序,都能通过组合完成一个新的功能,从而充分发挥不同程序语言的优势,有效利用现有的开发工具和软件库;(2)实现程序设计模块化,模块功能专业化,使程序易于维护,从而提高程序的可靠性和可重用性;(3)采用通用语言,以标准格式对程序单元进行描述,大大提高程序的可读性;(4)统一了界面,使用者将不再需要因选用的程序语言不同而被迫熟悉不同的开发环境;(5)以直观的方式建立功能模块间的联系,而非通过采用特定计算机语言编写代码,以函数调用的方式来实现。
具体实施方式
实施例一:本实施例提供的以功能单元为基础的任务程序创建方法,主要包括创建程序单元的步骤和创建任务的步骤,下面将结合附图作进一步的详细描述。
一、结合图1所示,创建程序单元方法包括以下流程:
101:利用系统提供的人机界面,描述程序单元信息。
此处需要说明的是,人机界面的风格、外观设计和编程方式有多种选择,是本领域技术人员非创造性劳动即可实现的,本实施例对此不做具体限定。此外,所述的程序单元信息包括但不限于以下信息:单元名称,程序单元的名称,在系统范围内不具备唯一性;单元类型,定义程序单元的功能类型;单元功能说明,对本程序单元进行概括性描述,能帮助使用者理解本单元的功能和使用方法;执行结果类型标识,标识执行完成本程序单元实例时所产生的结果的类型;脚本逻辑执行引擎标识,决定用于运行程序单元逻辑体的引擎(Engine);可能抛出的例外的类型名,在本实施例中,以Java语言为例,如java.lang.Exception。
102:定义程序单元的输入参数信息。
所定义的输入参数信息包括:参数名,参数名的命名须符合在步骤101中选定的脚本语言的规范,且该名称在程序单元内必须能唯一标识该输入参数;参数类型名称,例如字符串(string)、数字(numeric)、布尔值(boolean)、复杂对象(json);默认值,为可选项,如不作定义,其值为空(null)。
103:是否有更多输入参数信息需定义,是则执行102,否则,执行104。
需要说明的是,对于具体任务的输入参数的数目,由任务创建者根据任务的要求确定。
104:编辑程序单元逻辑体。
编辑逻辑体之前,先建立可供选择的脚本逻辑执行引擎列表,从列表中选择脚本逻辑执行引擎,并按所选脚本逻辑执行引擎所对应的脚本语言规范编写程序单元的逻辑体。
其中,逻辑体可按参数名引用在步骤102中定义的输入参数;在引用的过程中,如输入参数为复杂对象(json),则逻辑体需附加类型转换的逻辑。
需要说明的是,逻辑体的组织和编辑须符合步骤101所确定的脚本语言的语法规范,并且是一个函数(function)或方法(method)或完整语句(statement)。此外,逻辑体内定义的变量或宏(Macro)或常量的适用范围不能超越逻辑体本身。
105:将若干程序单元保存在程序单元数据库中,在进行数据库操作前,系统将自动产生一个在系统范围内唯一的程序单元码,从而建立程序单元列表。
需要说明的是,本领域技术人员熟知,数据库的选择可以有多种,本实施例不做具体限定。
106:结束。
二、如图2所示,创建任务的流程包括:
201:选择程序单元。
首先,按用户登录系统时的帐户的权限,列举所有的程序单元;然后,按用户设定的查询条件,例如:程序单元的功能、类型、创建者,和或,抛出例外(throw exception)的机率等,选择出需要的程序单元。
202:从选择的程序单元的输入参数列表中,选择需要赋值的输入参数。
需要说明的是,并非所有输入参数都必须进行赋值,用户只需根据具体任务要求来确定需要的输入参数并给其赋值,对于在创建任务过程中未赋值的输入参数,将采用默认值。
203:判断输入参数的赋值是否为其他程序单元的输出,如是,执行步骤204;如否,执行步骤206。
204:选择引用单元(引用单元是指其结果将会被其他程序单元的输入参数引用的程序单元)。
需要说明的是,可供引用的程序单元必须具备以下条件:1.已存在于本任务的程序单元列表中;2.其输出类型须与作为引用方的输入参数的类型相同。
205:设定输入参数与引用单元的关联,然后执行步骤207。
输入参数与引用单元的关联是通过将引用单元顺序号定义为引用单元所拥有的顺序号;例如,假设在任务中已先行确定好了顺序号为1、2、3的程序单元CD1、CD2、CD3,现在正在确定程序单元CD4(其顺序号为4),而CD4的其中一个输入参数arg1需与CD2的输出进行关联,则只需在这一步将arg1的引用单元顺序号定义为4。
206:设定常量值。其中,常量值的长度及语法要求,由该输入参数的类型决定。
207:判断是否需再添加程序单元,如是,执行步骤201;如否,执行步骤208。
208:选择执行终端。从现有列表中选取执行终端,选择的依据包括但不限于执行终端是否配备执行任务中的所有程序单元的脚本逻辑执行引擎。
209:建立任务与执行终端间的关联。
210:保存任务于任务程序数据库。
211:结束。
实施例二:
本实施例在实施例一的基础上提供一种以功能单元为基础的任务程序执行方法,如图3所示,其包括以下步骤:
301:从任务管理模块读取任务。在这一步之前,要预先建立并保存可供选择的执行终端的列表,从执行终端的列表中选择执行终端,将待执行的任务程序与所选择的执行终端进行绑定,执行终端定期轮询并下载与其绑定的任务(具体描述参考实施例一)。
需要说明的是,作为任务的存储和读取方法的具体实现可以多种选择,本实施例对此不做限定,本发明实施例仅以基于WEB Service的体系结构为例进行说明,具体如下:
以Web Service为接口,在客户端运行的实例执行模块,定期以SOAP格式向作为任务空间的Web服务器发出查询请求;服务器端的WebService层程序调用由中间件开发的数据访问层程序;当数据访问层程序发现属于该实例执行模块的任务时,WebService层程序将任务打包城XML字符串,并作为响应返回给实例执行模块。
302:从任务的程序单元列表中读取具有最小顺序号的程序单元。
303:判断程序单元是否存在,如是,执行步骤304;如否,则判断本任务已完成,执行步骤309。
其中,判断的依据是执行失败标记是否已设置,和/或,下一个程序单元实例为空;如执行失败标记已设置,则表示本程序单元实例的执行已非正常结束,执行步骤309;否则,如下一个程序单元实例为空,则表示本程序单元实例的执行已正常结束,执行步骤309;否则,表示本程序单元实例的执行尚未完成,执行步骤304。
304:遍历程序单元中的所有输入参数,如果参数的引用单元顺序号已定义,用与顺序号对应的程序单元的最近输出结果值对该输入参数进行赋值;
305:根据程序单元的脚本逻辑执行引擎标识选择引擎(Engine)。
其中,引擎(Engine)包括Script Engine和command shell两种类型;
需要说明的是,本领域技术人员可获知,Script Engine或command shell的种类有多种,本发明实施例对此不做限定;
306:启动Engine运行逻辑体。
需要说明的是,程序单元的运行结果类型只能为字符串;此外,本领域技术人员可获知,不同逻辑体Engine的启动方法和过程各不相同,本发明实施例对此不做限定,仅以JavaScript Engine在JRE的环境下为例进行说明,具体如下:
创建javax.script.ScriptEngineManager实例;
以参数设为“JavaScript”调用ScriptEngineManager实例的getEngineByName方法,获得ScriptEngine实例;
调用ScriptEngine实例的put方法,将程序单元的所有参数,以名值对注入到ScriptEngine实例的运行环境中;
调用ScriptEngine实例的eval方法,执行逻辑体内容,并将eval方法的返回值作为实例执行结果;
307:保存运行结果到任务的运行结果数据结构中。
308:根据运行结果,确定下一个程序单元,然后执行步骤303。
如运行结果并非逻辑重定向信息,则在最新完成的程序单元的顺序号基础上加1而得出的新的顺序号,并通过该顺序号找到相应的程序单元;如执行结果为逻辑重定向信息,则通过逻辑重定向信息中的顺序号找到相应的程序单元;
309:向任务管理模块返回任务执行结果。
其中,执行终端通过Web Service接口,以SOAP格式任务管理模块发送包括实例执行结果信息在内的任务状态更新请求;任务管理模块的WebService层程序调用基于中间件的数据访问层更新数据库中相应的任务状态记录;
310:结束。
实施例三:
为了以简单而直观的方式创建及执行任务程序,本实施例还提供了一种以功能单元为基础的任务程序创建和执行的系统,如图4所示,该系统包括:程序单元描述模块401,通过人机界面以文字或框图形式对以功能划分的程序单元进行抽象和描述;任务管理模块402,通过人机界面让使用者选择的程序单元,并组合成任务,并将任务发送到指定的执行终端;执行终端403:负责执行任务。
其中,所述程序单元描述模块具体包括:单元概述子模块,接受用户输入,实现对程序单元进行概括性描述;逻辑体定义子模块,接受用户输入,实现对程序单元的逻辑体进行定义。所述任务管理模块包括:任务定义子模块,接受用户输入,实现对任务的定义;接口子模块,接受执行终端的查询任务的请求;存储子模块,在数据库或文件系统中存取任务。所述执行终端包括:读写子模块,按一定的协议从任务管理模块中获得任务,并将执行结果保存在任务管理模块;程序运行子模块,执行包括在任务中的程序单元。
本发明通过提供一种以功能单元为基础的可支持多种程序语言集成的智能设备控制程序的编辑、管理及运行的系统和方法,有益效果在于:
采用脚本语言(Script)编写程序,而且还充分利用脚本语言具有学习周期短,入门容易的特点,使更多非专业程序员参与程序开发;
某些特定任务需要使用特定一种程序语言来实现,或使用到的工具可有效集成以不同计算机语言开发的程序,充分发挥不同程序语言的优势,有效利用现有的开发工具和软件库;
实现程序设计模块化,模块功能专业化,使程序易于维护,从而提高程序的可靠性和可重用性;
采用通用语言,以标准格式对程序单元进行描述,大为提高程序的可读性;
统一了开发界面,使用者不论采用何种脚本语言都将在相同的界面中编辑程序逻辑;
以直观的方式建立功能模块(程序单元)间的关联,而非通过计算机语言中的函数调用语句来访问。
本发明实施例提供的上述技术方案的全部或部分可以通过程序指令相关的硬件来完成,所述程序可以存储在可读取的存储介质中,该存储介质包括:ROM、RAM、磁盘或光盘等各种可以存储程序代码的介质。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在基于本发明创作精神、无需创造性劳动,所作的简单修改、等同替换等,均应属于本发明的揭露范围。