🍋脚本组件
LiteFlow支持脚本节点的创建。支持热刷新脚本,支持QLExpress和Groovy两种脚本的编写。
关于这两种脚本语言的语法,可能提前大家要稍加熟悉,这里给出两个教程:
QLExpress语法教程 (opens new window)
# 如何定义
脚本节点定义是在规则文件中,你需要做如下定义(这里以xml文件格式举例):
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<nodes>
<node id="s1" name="普通脚本" type="script">
<![CDATA[
a=3;
b=2;
defaultContext.setData("s1",a*b);
]]>
</node>
<node id="s2" name="选择脚本" type="switch_script">
<![CDATA[
count = defaultContext.getData("count");
if(count > 100){
return "a";
}else{
return "b";
}
]]>
</node>
<node id="s3" name="条件脚本" type="if_script">
<![CDATA[
return false;
]]>
</node>
</nodes>
<chain name="chain1">
THEN(a, b, c, s1);
</chain>
<chain name="chain2">
THEN(d, SWITCH(s2).to(a, b));
</chain>
<chain name="chain3">
THEN(d, IF(s3, b, c));
</chain>
</flow>
要注意的是,type
分为三种:
script
:普通脚本节点,脚本里无需返回。
switch_script
:选择脚本节点,脚本里需要返回选择的节点Id。
if_script
:条件脚本节点,脚本里需要返回true/false
你可以在示例的位置进行编写动态脚本来处理业务逻辑。
提示
这里示例是传入的上下文bean是默认的DefaultContext
,如果是你自定义的上下文Bean,请调用相应的方法来设置和获取数据。
# 文件脚本的定义
LiteFlow从2.6.4开始支持了脚本文件的定义。你除了可以把脚本内容写在配置文件中,也可以写在文件中。如果大的脚本就推荐写在文件中。毕竟IDE对文件的语法高亮和代码提示做的也相对友好。编写脚本会更加方便。
要注意的是,目前LiteFlow仅支持classpath内的脚本文件,这里无法定义绝对路径。以后可能会支持。
你可以这样定义(这里以xml文件格式举例):
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<nodes>
<node id="s1" name="普通脚本" type="script" file="xml-script-file/s1.groovy"/>
<node id="s2" name="选择脚本" type="switch_script" file="xml-script-file/s2.groovy"/>
<node id="s3" name="条件脚本" type="switch_script" file="xml-script-file/s3.groovy"/>
</nodes>
<chain name="chain1">
THEN(a, b, c, s1)
</chain>
<chain name="chain2">
THEN(d, IF(s3, b, c));
</chain>
</flow>
# 如何与java变量进行交互
因为LiteFlow组件与组件之间的数据交互都在上下文中,所以在脚本语言中,你可以通过你定义数据上下文的className的驼峰形式来获取数据。
比如你的上下文类叫OrderContext
,那么脚本中的就用orderContext
这个关键字来获取数据或调用方法。
如果你是多上下文,同样的,你也可以在脚本中用多个上下文来获取数据或调用context内部的逻辑方法。
如果想获得流程初始参数,脚本内置了requestData
关键字。
如果你的脚本在隐式流程中,想获取当前隐式流程的入参,则应该用subRequestData
关键字。
普通脚本组件,脚本中无需返回值。只需要把结果设置到context
即可(这和普通的java编写的组件是一致的)。
而条件脚本节点,则需要在脚本中返回条件路由到的节点ID,返回String类型(这也和java编写的选择组件是一致的)。
# 如何选择脚本框架
LiteFlow采用SPI机制进行选择脚本框架来动态编译你的脚本。
QLExpress脚本,你需要额外依赖:
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-script-qlexpress</artifactId>
<version>2.8.5</version>
</dependency>
Groovy脚本,你需要额外依赖:
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-script-groovy</artifactId>
<version>2.8.5</version>
</dependency>
你只需要依赖相应的脚本框架即可,SPI会动态选择你依赖的脚本框架进行编译解析你的脚本
# 脚本运行性能如何
LiteFlow对所有的脚本在启动时就进行了预编译,所以每次执行时无需编译的,运行性能和java不会差别太多。
# 如何动态刷新脚本
提供了编码形式的刷新,刷新后可以重新编译脚本
ScriptExecutorFactory.loadInstance().getScriptExecutor().load(nodeId, script);