此 Mendix 微流引擎:它是如何工作的?
- 2013 年 10 月 7 日
- 分钟阅读
在这篇博文中,我想解释一下微流引擎如何在你的 Mendix 应用程序。首先,我将简要介绍微流是什么以及它们如何帮助您建模应用程序,然后我将解释它们背后的技术。
一个介绍
在 Mendix 平台使用创建应用程序模型 Mendix 业务建模器。我们不生成代码,而是在服务器运行时启动应用程序时解释此模型。这种方法有各种优点,例如能够 可视化调试,即使在远程环境中。
如果您之前构建过微流,那么理解本文会很有帮助,但我也会解释一下它们是什么。如果您已经知道如何使用微流,可以直接跳到 行动.
引用我们的文献, “微流允许你表达应用程序的逻辑” 和 “它以一种视觉化的方式表达了传统上以文本程序代码形式呈现的内容”换句话说,微流允许您轻松地向应用程序中的流程添加复杂的业务逻辑,而无需编写代码。 Mendix 是关于业务和 IT 之间的协作,微流通过让具有业务头脑的人深入了解应用程序的设计方式而提供很大帮助。
微流定义了高层级的活动。一个非常简单的例子可能如下所示:

在 Java 代码中,可以写成以下代码。'else' 语句并非绝对必要,但更接近于微流中的表达方式。

下面给出一个更具体的例子:

如需了解更多关于微流控技术的信息,您可以访问以下网站: https://world.mendix.com/display/refguide4/Microflows.
但这一切是如何运作的呢?好吧,现在让我们开始吧。
行动
微流是一种 行动服务器中的操作由一个接口定义,该接口具有可执行的基本属性。这是通过 行动经理;此类负责以各种方式执行操作。它可以同步、异步地执行操作,也可以安排在将来执行,并处理所有线程复杂性。
服务器中定义了各种类型的操作。其中一些是供内部使用的,例如删除过期会话的操作。其他操作可以由开发人员使用,甚至可以使用 Mendix。 例子是 对象删除 or xpath 查询 操作。如果你曾经创建过自己的 Java 操作,你可能已经注意到它扩展了 UserAction 并且必须实现该方法 executeAction.
现在我们知道微流是可以执行的动作,但是我们如何获取这个类的实例呢?
构建微流结构
当服务器启动时,它将首先读取包含应用程序模型的文件。该模型包含项目中的所有文档,包括微流。服务器将构建这些微流文档的结构,这些结构比平面模型信息更容易、更快地用于实例化实际微流。举几个例子,在构建这些结构后,调用另一个微流的微流将直接指向该微流的结构,而不是模型中的标识符,嵌套循环的内容将呈现为单独的微流结构。
完成后,我们会得到一堆微流结构。这些结构代表了在建模器中绘制的微流,并包含表示开始事件、结束事件、中断事件或(最后但同样重要的) 活动.

这些微流对象通过以下方式相互连接: 流动:绘制微流时连接各个块的线。微流对象可以包含传入流和传出流。
如果您熟悉微流,并且现在正在想,“嘿,但是循环或网关呢?”,这些也会呈现为活动。关于这个话题,我们最近介绍的错误事件可以被视为一种特殊类型的结束事件。
如前所述,嵌套循环的内容也会被渲染为微流结构。对于循环的每次迭代,都会实例化另一个微流。你说实例化?我们来看一下……
实例化并运行微流
在执行某个微流之前,我们会使用之前构建的结构快速实例化该微流。对于微流的特定实例,我们需要以下信息: 输入变量 和 上下文 微流程的上下文。上下文包含各种信息,包括执行此微流程的用户。
所以,整体情况是这样的:

创建实例后,动作管理器将执行微流。它最终会遇到 活动...
微流活动
正如我之前所说,一些(或者实际上是大多数)微流对象是 活动微流活动的一些示例是更改对象、给出打开表单的指令、基于模板生成文档或导入 XML。
活动定义了 execute 方法。微流实例被传递给此方法,以便我们可以执行诸如查找 范围 这种微流。
以下是一个微流活动的示例:导出 XML。如果您本身就是程序员,您就会明白它的作用。

它将从微流范围中检索上下文和微流变量,获取 XML 映射的标识符,获取参数对象,然后决定是导出字符串并返回此值,还是写入文件。我们不会深入讨论实际执行该任务的方法的内部工作原理,但您应该明白了。
建立 Mendix 5,我们正在使用 操作系统 作为模块系统。不同的组件现在可以将其活动插入微流引擎中。例如,“文档生成器”组件插入“生成文档”活动,“Web UI”组件插入“显示消息”等活动。
网关 是一种特殊的活动,在建模时以不同的方式绘制。网关表示微流中的流程分割。它可以是 独家分割 或 遗产分割独占拆分的默认选项是解析一个表达式。基于这个表达式,微流可以随后进行拆分。最简单的情况是布尔表达式(真或假),但您也可以根据枚举值进行拆分。那么它是如何工作的呢?好吧,我们得先看看微流表达式。
微流表达式
In Mendix 我们已经定义了自己的表达语言。定义可以在 维基百科上的数据: “编程语言中的表达式是显式值、常量、变量、运算符和函数的组合,这些组合根据特定编程语言的特定优先级和关联规则进行解释,计算并生成(在有状态的环境中返回)另一个值。这个过程就像数学表达式一样,称为求值。值可以是各种类型,例如数字、字符串和逻辑值。”
我们用以下方式编写了表达语言的语法 蚂蚁金服 并用它来生成解析器和 抽象语法树。引用他们的网站, “ANTLR(另一种语言识别工具)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。”
您可以在我们的 文件.
表达式可以在各种地方使用,例如:在“更改对象”活动中为属性赋值,在结束事件中返回变量,或者在前面提到的排他拆分中。我们来看一个例子。假设您有一个包含电影数据库的应用程序,用户可以在其中搜索电影的各种属性。

此网关中的表达式为“Movie/Length > 180”。在遵循“true”值的微流路径中,您可以将此特定电影限定为较长。
那么,这样的表达式最终会如何被评估呢?
一旦触发网关操作,它将发出命令来评估表达式。这是一个非常简单的二进制表达式,它将进入二进制表达式类并找到所使用的运算符,在本例中是“大于”符号。找到此运算符后,它将进入算术或比较表达式的方法。在获取表达式左侧和右侧的类型并确保值不为空后,它将输入相关运算符的代码并进行比较。最终的代码很简单 value = longExpr1 > longExpr2.
接下来发生的事情是,该值被传回网关操作,网关操作决定接下来要执行微流的哪条路径。这部特定的电影可能被标记为很长,而打算在雨天晚上待在家里的用户将能够找到完美的活动。
结语
这基本上总结了我们的微流引擎如何运作的基本原理。通过使用微流,您不必担心诸如如何调用 Web 服务、如何在具有所有相关安全约束的数据库上执行 SQL 查询或如何在客户端上打开表单等问题。微流引擎以您可以添加到应用程序中的简单活动的形式提供这些功能。
希望您喜欢我的分享。