在 Java 代码中来一段 JavaScript?聊聊 Flowable 中的脚本任务

个人感觉脚本任务和我们前面说的 ServiceTask 很像,都是流程走到这个节点的时候自动做一些事情,不同的是,在 ServiceTask 中,流程在这个节点中所做的事情是用 Java 代码写的,在脚本任务中,流程在这个节点中所做的事情则是用其他一些脚本语言如 JavaScript、Groovy、Juel 等写的。

个人感觉脚本任务和我们前面说的 ServiceTask 很像,都是流程走到这个节点的时候自动做一些事情,不同的是,在 ServiceTask 中,流程在这个节点中所做的事情是用 Java 代码写的,在脚本任务中,流程在这个节点中所做的事情则是用其他一些脚本语言如 JavaScript、GroovyJuel 等写的。

前面的文章我们一起玩了 Flowable 中的 ServiceTask,今天我们再来看看 Flowable 中的脚本任务。

1. 脚本任务

个人感觉脚本任务和我们前面说的 ServiceTask 很像,都是流程走到这个节点的时候自动做一些事情,不同的是,在 ServiceTask 中,流程在这个节点中所做的事情是用 Java 代码写的,在脚本任务中,流程在这个节点中所做的事情则是用其他一些脚本语言如 JavaScript、Groovy、Juel 等写的。

脚本任务的图标如下图所示:

图片

2. 实践

写一个简单的例子我们来一起看下。

2.1 JavaScript 脚本

我们先来看用 JavaScript 写这个脚本。

假设我有如下流程图:

图片

中间这个节点就是一个脚本任务。

选中该节点,我们先配置脚本语言是 JavaScript,如下图:

图片

这里也可以使用简写的 js。

然后再点击右边的脚本,配置脚本,如下图:

图片

上面这里我写了两行 JavaScript 脚本:

第一行表示流程执行到这里的时候,需要做一个简单的加法运算,a 和 b 两个变量则需要流程传入进来。

第二行表示往流程中存储一个名为 sum 的变量,变量值就是前面计算的结果,其中 execution 是一个内置变量。这个就类似于我们启动流程时候传入的变量一样。

在 ES6 中我们常用的 let 关键字这里并不支持,这个地方小伙伴们要注意。

配置完成之后,我们下载这个脚本来看下对应的 XML 文件是什么样子:

<process id="demo01" name="测试流程" isExecutable="true">
<documentation>测试流程</documentation>
<startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
<sequenceFlow id="sid-33A78082-C2FD-48BE-8B87-99FB20F0B331" sourceRef="startEvent1" targetRef="sid-8D88DFF6-0F37-42FA-9F94-29FE30536094"></sequenceFlow>
<endEvent id="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></endEvent>
<sequenceFlow id="sid-0698809E-0A6C-4B92-A167-AE96A8CB75F2" sourceRef="sid-8D88DFF6-0F37-42FA-9F94-29FE30536094" targetRef="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></sequenceFlow>
<scriptTask id="sid-8D88DFF6-0F37-42FA-9F94-29FE30536094" scriptFormat="JavaScript" flowable:autoStoreVariables="false">
<script><![CDATA[var sum=a+b;
execution.setVariable("sum",sum);]]></script>
</scriptTask>
</process>

小伙伴们看到,scriptTask 中内嵌了一个 script 节点,里边就是我们自己写的脚本内容。

好啦,接下来小伙伴们就可以部署并启动这个流程了,启动代码如下:

@Test
void test01(){
Map<String, Object> variables = new HashMap<>();
variables.put("a", 99);
variables.put("b", 98);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01", variables);
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}

大家注意启动的时候传递 a 和 b 两个变量。这个流程启动之后,直接就执行结束了,因为流程到达 scriptTask 并不会停止。

不过我们可以在ACT_HI_VARINST表中查看流程运行信息:

图片

可以看到,相关的变量和变量值都保存着。

2.2 Groovy 脚本

看懂了 JavaScript 脚本,Groovy 就好懂了。不过 JavaScript 脚本估计大部分搞 Java 的小伙伴都懂,但是 Groovy 可能会比较陌生,我简单介绍下:

Groovy 是 Apache 旗下的一门基于 JVM 平台的动态/敏捷编程语言,在语言的设计上它吸纳了 Python、Ruby 和 Smalltalk 语言的优秀特性,语法非常简练和优美,开发效率也非常高(编程语言的开发效率和性能是相互矛盾的,越高级的编程语言性能越差,因为意味着更多底层的封装,不过开发效率会更高,需结合使用场景做取舍)。并且,Groovy 可以与 Java 语言无缝对接,在写 Groovy 的时候如果忘记了语法可以直接按 Java 的语法继续写,也可以在 Java 中调用 Groovy 脚本,都可以很好的工作,这有效的降低了 Java 开发者学习 Groovy 的成本。Groovy 也并不会替代 Java,而是相辅相成、互补的关系,具体使用哪门语言这取决于要解决的问题和使用的场景。

如果我们想要在流程中使用 Groovy 脚本,那么首先设置脚本格式为 Groovy:

图片

然后设置脚本内容如下:

图片

这段脚本表示流程执行到这个节点的时候输出一个 "hello groovy"(如果你熟悉 Groovy 脚本的话,就知道这段脚本其实也可以直接写 Java 代码,也能执行)。

另外说一句,使用 Groovy 脚本,千万别忘了加 Groovy 依赖,如下:

<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>3.0.13</version>
</dependency>

2.3 Juel 脚本

Juel​是Java Unified Expression Language的简称,它具有高性能,插件式缓存,小体积,支持方法调用和多参数调用,可插拔等多种特性,它是 JSP2.1 标准 (JSR-245) 中定义的一部分。尽管 EL 表达式是伴随着 JSP 而生,但现在已经可以在非 JS P应用中使用,相关的 API 放在 javax.el 包里面。

其实像我们之前写的${xxx}这种表达式,其实就是 Juel 了。

来一个简单的例子看下。假设我们想在流程中使用 juel,首先设置脚本格式为 juel:

图片

然后就可以设置具体的脚本内容了,如下:

图片

这段脚本就表示调用一个名为 myServiceTask2 的 Bean 中的 hello 方法。

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月6日 15:34
下一篇 2023年5月6日 15:34

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信