页面树结构
转至元数据结尾
转至元数据起始

前面的几章主要介绍DWF在前端的脚本编程能力,从本章开始介绍DWF提供后端脚本支持能力。

1. 脚本基础

1.1 为什么要提供后端脚本

所谓“后端”主要是指脚本对应的程序是在DWF的服务器端执行的,下图展示了DWF服务器在内网的一个拓扑关系,在右侧的内部局域网一般是在防火墙保护下进行通讯,例如:大数据文件系统,大数据分析集群等。

DWF的服务器也会部署在这些集群组件相同的内部网段之中,然而前端脚本是运行在浏览器端,无法通过公网访问后端局域网内部的组件。

后端脚本由于运行在服务器端,所以就有机会与这些内部组件进行通讯,从而协调内部集群配合开展工作。

除此之外,后端脚本由于是直接在DWF服务器中运行的,就有机会完成一些必须同时完成的批量任务,例如:一次性对几个类型的数据进行操作的事务性任务。

图-DWF前后端脚本的执行位置示意

在DWF中后端脚本也使用JavaScript语言编程,所以在前端脚本学习过程中取得的技能仍然可以在后端脚本编制过程中复用。

1.2 在哪里编写后端脚本

在DWF的模型定制工具内,可以在数据模型、功能模型和流程中编写后端脚本:

  1. 数据模型:当实体类,关联类对象的在增、删、改的时候可以允许附加后台事件,调用脚本完成特定任务。
    1. 例如:设备创建的时候在后台检查代号是否重复。
  2. 功能模型:后端脚本可以通过操作绑定的方式执行,在表单上的事件或者按钮均可触发后端脚本。
    1. 例如:通过后端脚本激活一个Spark的批量任务。
  3. 流程模型:流程的活动在开始前和完成后可以允许绑定指定的全局操作,进行一些处理工作。
    1. 例如:工单审核通过后自动变更状态为“已通过”。
    2. 例如:检查流程中对象是否合格,否则阻止流程向下推进。
    3. 流程整体结束以后进行善后的处理。

下面首先介绍后端脚本的一些全局变量。

1.3 后端脚本保留字

系统变量

为支持后端脚本,DWF在调用时,预先提供了一些内置的对象,通过总体入口可以访问一系列DWF提供的功能:

  • this: 和前端脚本一样,后端所有涉及DWF的变量总入口。

和前端脚本一样,后端脚本执行的时候也提供了一些全局的环境变量。

  • this.user:对象,表示当前登录用户,用户具备的属性和前端脚本中this.user具备的属性一致。
  • this.env:对象,表示当前上下文的环境信息,上下文中具备的属性和前端脚本中this.env具备的属性一致。
  • this.env.appConfig:数组,用于进行应用配置的数组,脚本编写人员可以通过在application.proprities里扩展以。

此外,为了在后端提供调试和日志的能力,DWF的后端脚本提供了如下的系统变量:

  • this.logger:对象,用于进行调试的脚本输,典型的使用方法是:

数据操作保留字

为了操作DWF中的数据,进行配套的增删改查等任务,后端脚本将所有对象的操作进行了封装。

  • this.obj:当对象发生变化,例如:增删改,可以引用到该变量的取值。
  • this.oldObj:发生删除或修改的时候原有的对象引用。
  • this.selectedObjs:当DWF前端表单中存在多对象控件,例如:表格,的时候,会自动将表单设定的缺省表格中被选中的对象作为数组回传。
  • this.omf:omf是对象管理框架(object management framework)的缩写,是DWF后端用于对对象进行增删改查的函数调用入口,数据操作的方法有:
    • getByOid(oid, classname):通过字符串类型的oid参数后的指定类型的对象。
    • handleQueryData(query, classname):返回批量结果,其中query表示快速查询,classname可以为关联类、实体类。
    • edit(targetObject, classname):更新数据库中的指定类型对象。
    • create(targetObject, classname):创建数据库中的指定类型对象。
    • delete(targetObject, classname):删除数据库中的指定类型对象。

文件操作保留字

在DWF中,还有一类LocalFile类型,代表文件、图片、视频等非结构化数据,在后端DWF也提供了一整套接口用于操纵这些文件。

  • this.omf
    • getFilePath(oid, classname, attrbutename):用于返回localfile属性文件所在路径
    • getString(oid, classname, attributename):用于将文件的内容包装为base64编码字符串返回
    • getByteArray(oid, classname, attributename):用于将文件的内容包装为字节数组返回
    • setLocalFile(oid, classname, attributename, filepath):用于将本地的特定文件设置到对象的localfile属性上

直接访问数据库

除了DWF提供的操作之外,后端还有可能需要通过SQL语句直接操作DWF配套的PostgreSQL数据库,为此后端脚本还提供了一个专用入口。

  • this.em:em是数据库中的实体管理器(entity manager)的缩写,专门用于封装底层数据库的调用,如果需要在后端调用数据库的操作,例如:执行SQL语句或者调用存储过程。

在服务器执行脚本

如果需要在服务器端执行脚本,例如:启动一个分析算法或者启动一个后台集群任务,可以使用this.sh

  • this.sh:对象,用于启动操作系统内部的命令行脚本,
    • execute(cmd):执行字符串cmd指定的脚本,典型的使用方法是:this.sh.execute(“echo hello world! ”)。

后端结果返回

最后,后端执行的结果如果需要返回,可以使用this.res变量,对齐赋值以后前端会取得后端执行的结果。

2. 脚本调试

目前,后端脚本的调试比前端脚本复杂,需要通过this.logger来将需要的内容输出到日志中,比如this.logger.info(“…”),this.logger.error(“…”)打出日志,然后查看并且分析日志实现调试。

2.1 查看日志网页

第一种方式查看日志比较简单,打开建模工具或者应用前端,右上角的用户信息按钮下拉菜单中找到“查看日志”,点击后会弹出网页并且显示最近的日志输出。

图-浏览应用服务日志

这种方式的局限性是每次只能查看少量日志,如果调试时间很长就需要进入后端服务器,查看日志文件。

2.2 查看日志文件

查看日志文件需要得到登录服务器的权限,如下图所示,在进入服务器后,找到DWF部署文件夹(一般是/opt/dwf3.0-deploy),会存在两个日志文件:

  • dwf-app.log:在DWF的应用服务启动后输出的日志。
  • dwf-modeler.log:在DWF模型的后端服务启动后输出的日志。

图-DWF部署服务器日志文件查看

如果需要实时滚动的查看日志,通过命令行也可以实时查看日志的变化情况:

#滚动查看应用服务的日志
tail -f /opt/dwf3.0-deploy/dwf-app.log
#滚动查看模型服务的日志
tail -f /opt/dwf3.0-deploy/dwf-modeler.log

图-查看应用服务日志

3. 小结

本章重点介绍了后端脚本的概念,执行位置和存在的必要性。

之后介绍了DWF后端脚本的全局保留字以及针对数据模型、流程模型的专用保留字。

最后介绍了如何通过浏览日志网页和浏览日志文件的方法进行后端脚本调试。

下一章,将重点结合设备管理应用中的工单和设备之间的联动关系维护,介绍如何利用后端脚本扩展DWF数据模型。

  • 无标签