前言
之前,想到这样一个情景,用一个脚本来描述一个服务的操作,这样做的好处是,业务逻辑落到了配置文件。业务变化时只需通过修改配置,而不需要重新编译系统。
最近几天,由于工作需要,转到了服务器的研发,刚好碰上这一应用场合,终于有机会完成这一脚本的设计。
IOS简介
IOS是In/Out
Script(输入/输出脚本)的简称,在我的设计中,用in,out,script3个节点来描述一个服务调用。
设计目标
采用XML作为服务的描述语言,因为目前XML解析的库已非常完善,采用XML能够省去大量的语法解析工作;
一个服务对外界的元素是输入参数和输出参数,所以定义了In,Out两个节点分别描述;
一个服务应该包含多个操作,这些操作有先后关系,赋值关系;
服务的多个操作应该支持顺序,分支,循环3个基本的执行方式;
服务执行过程中会产生临时变量,要支持临时变量的存放;
必须保证服务的多个操作的事务性;
服务的内部错误处理。
服务脚本节点定义
set节点
定义输入/输出参数:name参数名称
io节点
定义Invoke/Out操作:i执行脚本,o输出变量
if/elseif/else节点
定义条件执行节点:i执行判断脚本
foreach节点
定义循环遍历执行节点:i获取父项脚本,o输出子项变量
throwerror节点
定义引发异常节点:i获取异常信息脚本
error节点
定义错误处理节点
完整的服务脚本
<servicename="">------【服务节点】name:服务名称
<in>------【输入参数】
<setname=""/>
</in>
<out>------【输出参数】
<setname=""/>
</out>
<scriptt="false">------【服务脚本】t:transaction事务控制
<ioi=""o=""/>
<ioi=""o=""/>
<ifi="">
<ioi=""o=""/>------if结果为true时执行
<ioi=""o=""/>
<elseifi="">
<ioi=""o=""/>------elseif结果为true时执行
<ioi=""o=""/>
</elseif>
<else>
<ioi=""o=""/>------if/elseif所有结果为false时执行
<ioi=""o=""/>
</else>
</if>
<foreachi=""o="">
<ioi=""o=""/>------i值必须是可遍历的数据类型,o值是遍历时的子项
<ioi=""o=""/>
</foreach>
<throwerrori=""/>------引发异常能控制事务回滚
<error>
<ioi=""o=""/>
<ioi=""o=""/>
</error>
</script>
</service>
服务脚本引擎
用来解析执行服务脚本,是服务器的一个子模块。
服务脚本例子
例子1:创建实体对象服务
<servicename="NewEntity">
<in>
<setname="Type"/>
</in>
<out>
<setname="New"/>
</out>
<scriptt="true">
<ioi="CreateEntity(@Type)"o="New"/>
<ioi="CreateDTS()"o="New.DTS"/>
<ioi="InsertEntity(@New)"o="P1"/>
<ifi="!@P1">
<ioi="Null()"o="New"/>
</if>
<error>
<ioi="Error()"o="New"/>
</error>
</script>
</service>
例子2:带文件操作和数据库操作,并且有事务控制的例子
<servicename="CreateSheet">
<in>
<setname="Template"type="string"/>
<setname="Items"type="manifest"/>
</in>
<out>
<setname="DTS"/>
<setname="Error"/>
</out>
<scriptt="true">
<!--创建文件映射?-->
<ioi="CreateEntity('EBM.Data.File')"o="File"/>
<ioi="CreateDTS()"o="File.DTS"/>
<ioi="FormatDate(Date(),'yyyyMMdd')"o="File.Folder"/>
<ioi="@File.DTS"o="File.Name"/>
<ioi="'.fxl'"o="File.Ext"/>
<ioi="GetDriver()"o="File.Driver"/>
<ioi="ToFullPath(Concat(@File.Folder,'/',@File.Name,@File.Ext),
@File.Driver)" o="SavePath"/>
<!--创建文件-->
<ioi="ToFullPath(@Template)"o="Path"/>
<ioi="LoadSheet(@Path)"o="Sheet"/>
<ioi="FillSheet(@Sheet,
@Items)"o="Sheet"/>
<ioi="InvokeSheet(@Sheet)"o="Sheet"/>
<!--写文件-->
<ioi="WriteText(@SavePath,
@Sheet)"o="Success"/>
<!--入库-->
<ioi="InsertEntity(@File)"o="Success"/>
<ifi="!@Success">
<throwerrori="'错䨪误¨®:êoInsertEntity(@File)'"/>
</if>
<!--
<throwerror i="'事务回滚测试'"/>
-->
<ioi="@File.DTS"o="DTS"/>
<error>
<ioi=""o="DTS"/>
<ioi="Error()"o="Error"/>
</error>
</script>
</service>
相关文章
EBM专栏
分享到:
相关推荐
3ds_max_script_高级编程——使用脚本制作动画
git仓库————迁移脚本
3DS MAX高级编程——使用脚本制作动画。不错的教材
Flash中动作面板与动作脚本的应用——动作脚本中的术语.pdf 学习资料 复习资料 教学资源
ASP.NET Core微服务(一)——【完整API搭建及访问过程】——sql脚本
恺撒加密的python实现,CTF必备,小游戏很好,恺撒加解密(Caesar cipher)——python脚本实现
使用脚本批量修改本地管理员密码,大大方便了网络管理员工作
Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令.pdf
录制脚本编程代码
大麦IOS端抢票辅助脚本 用这个脚本抢到过多次,需要搭配stay软件使用 当前可能检测脚本不安全,有需要的可以自己下载的修改测试
Java脚本语言工具——scriptpad 使用的演示可以参考我的博客: http://blog.csdn.net/froole 执行方法: Windows下,鼠标双击jar文件 其他系统包括在内,或者用java -jar命令来执行
简单的ARP主机扫描工具,通过ARP协议配合Python中的socket模块,对某个局域网内的主机进行简单扫描,并输出存活的主机
学习tcl脚本编程,根据介绍进行实践,可以在本软件上直接试运行tcl脚本。学习tcl的不二选择!!!
一个基于cmd脚本的mp3压制程序。可将大多数常见音乐格式压缩成vbr动态码率最高质量mp3格式。适合音乐网站等大批量压制音乐专辑使用,技术较差可能有各类问题请见谅! 【支持】 1.wav、flac、ape、tak、tta、wv、mpc...
01 实现背景 1、os模块,实现文件的重命名、创建新文件夹操作 2、datetime模块,用于获取当前年、月、日 ...3、shutil模块,用于移动文件 ...1、找出当前目录下超过3个月未操作过的文件,并将其重命名,在原本...
当遇到svn: E155009: Failed to run the WC DB work queue associated with错误时需要用到的SQLite数据库打开工具。此工具是2018.08.15下载的官网最新版本。
一个基于cmd脚本,简单的mp3压制程序。可将大多数常见音乐格式压缩成vbr动态码率最高质量mp3格式。适合音乐网站等大批量压制音乐专辑使用,技术较差可能有各类问题请见谅! 【支持】 1.wav、flac、ape、tak、tta、wv...
人力资源管理系统(下)该系统有两部分,第一部分为系统源码,第二部分为数据库脚本。
c#远程调用linux服务器的Python脚本(csdn)————程序