Flowable-任务-脚本任务

✨✨✨ 最好用的Flowable流程设计器


定义

脚本任务(Script Task)是一种自动执行的活动。当流程执行到达脚本任务时,会执行相应的
脚本,完毕后继续执行后继路线。脚本任务无须人为参与,可以通过定义脚本实现自定义的业务逻辑。

图形标记

脚本任务显示为一个普通任务(圆角矩形),左上角是一个脚本小图标,如图所示:

在这里插入图片描述

XML标记

脚本任务由 scriptTask 元素定义,需要指定 script 和 scriptFormat,例如:

<scriptTask id="scriptTask1" name=" " scriptFormat="groovy">
 <script>
 sum = 0
 for (i in inputArray) {
 sum += i
 }
 </script>
</scriptTask>

其中,scriptFormat 属性表示脚本格式,其值必须兼容 JSR-223(Java 平台的脚本语言),Flowable
支持三种脚本任务类型:javascript、groovy、juel。默认情况下,javascript 已经包含在 JDK 中,因
此不需要额外的依赖。如果想使用其它兼容 JSR-223 的脚本引擎,需要把对应的 jar 包添加到
classpath 下,并使用合适的名称。比如,Flowable 单元测试经常使用 groovy,因为其语法与 Java十
分相似。脚本任务通过 script 子元素配置需要执行的脚本。
需要注意的是,groovy 脚本引擎放在 groovy-all.jar 中。在 groovy 2.0 版本之前,脚本引擎是
groovy jar 的一部分,因此,使用时必须添加如下依赖:

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

使用示例

在这里插入图片描述

XML内容

<process id="JavaScriptDynamicScriptTaskProcess" name="任务-脚本任务" isExecutable="true">
    <startEvent id="a3be4f7ffcaa34d91847e02d1d3ae4506" />
    <sequenceFlow id="a5c28b30e0b984b37a14113371149b0ad" sourceRef="a3be4f7ffcaa34d91847e02d1d3ae4506" targetRef="aea9fea5480ca4231a961dd3696580336" />
    <scriptTask id="aea9fea5480ca4231a961dd3696580336" name="脚本JavaScript" scriptFormat="JavaScript" flowable:autoStoreVariables="false">
        <script>var sum = a + b;
            execution.setVariable("sum", sum);  </script>
    </scriptTask>
    <userTask id="Activity_0f27pu9" name="任务审批" flowable:assignee="${applyer}">
        <extensionElements>
            <flowable:formData />
            <flowable:assigneeType>static</flowable:assigneeType>
        </extensionElements>
    </userTask>
    <endEvent id="Event_1m6e3rb" />
    <sequenceFlow id="Flow_0fomqtm" sourceRef="Activity_0f27pu9" targetRef="Event_1m6e3rb" />
    <sequenceFlow id="Flow_0f808iq" sourceRef="aea9fea5480ca4231a961dd3696580336" targetRef="Activity_0rmiwin" />
    <sequenceFlow id="Flow_01o6dpp" sourceRef="Activity_0rmiwin" targetRef="Activity_0ihtdoy" />
    <scriptTask id="Activity_0rmiwin" name="脚本Groovy" scriptFormat="groovy" flowable:autoStoreVariables="false">
        <script>amass = a * b;
            execution.setVariable("amass", amass);</script>
    </scriptTask>
    <scriptTask id="Activity_0ihtdoy" name="脚本EL" scriptFormat="juel" flowable:resultVariable="reslut" flowable:autoStoreVariables="false">
        <script>${amass+sum}</script>
    </scriptTask>
    <sequenceFlow id="Flow_0vy1824" sourceRef="Activity_0ihtdoy" targetRef="Activity_03detgh" />
    <scriptTask id="Activity_03detgh" name="结果逻辑组合" scriptFormat="groovy" flowable:autoStoreVariables="true">
        <script>applyer = "";
            if(reslut&gt;10000){
            applyer = "张三";
            }else{
            applyer = "李四";
            }</script>
    </scriptTask>
    <sequenceFlow id="Flow_1bgd7y7" sourceRef="Activity_03detgh" targetRef="Activity_0f27pu9" />
</process>

界面配置

在这里插入图片描述

视频地址:

脚本任务

演示demo

脚本任务

本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎

### Flowable 中的服务任务使用方法及相关问题 #### 服务任务简介 在 Flowable 工作流引擎中,服务任务是一种用于执行特定业务逻辑的任务类型。它通常被用来调用外部系统、执行脚本或触发某些操作。通过定义服务任务,可以实现自动化的工作流处理。 --- #### 配置服务任务的方式 服务任务可以通过 BPMN 文件中的 `<serviceTask>` 节点来配置,并指定其行为方式。以下是常见的几种配置和服务任务的使用场景: 1. **Java 类型的服务任务** 可以为服务任务分配一个 Java 类作为处理器。该类需实现 `org.flowable.engine.delegate.JavaDelegate` 接口。 ```java public class MyServiceTask implements JavaDelegate { @Override public void execute(DelegateExecution execution) { System.out.println("Executing service task with variable: " + execution.getVariable("myVar")); } } ``` 在 BPMN 文件中声明如下: ```xml <serviceTask id="task1" name="My Service Task" flowable:class="com.example.MyServiceTask"/> ``` 2. **表达式驱动的服务任务** 如果不需要编写额外的 Java 类,可以直接使用 Spring 表达式语言 (SpEL) 来动态设置任务的行为。 ```xml <serviceTask id="task2" name="Expression Service Task" flowable:expression="${myBean.doSomething(execution)}"/> ``` 3. **Shell 或 Script 执行的服务任务** 支持嵌入 JavaScript、Groovy 等脚本来完成简单的计算或数据转换。 ```xml <serviceTask id="scriptTask" flowable:type="script"> <extensionElements> <flowable:field name="scriptFormat"><string>javascript</string></flowable:field> <flowable:field name="script"><string>logger.log('Script executed');</string></flowable:field> </extensionElements> </serviceTask> ``` --- #### 常见问题及其解决办法 1. **无法找到自定义的服务任务类** 当尝试部署包含自定义服务任务流程时,可能会遇到类似 “Class not found” 的错误。这通常是由于类路径不正确引起的。 解决方案:确保自定义类已打包到项目的依赖项中,并且能够被加载器识别[^1]。 2. **服务任务抛出异常但未被捕获** 默认情况下,如果服务任务内部发生了异常(如 IO 错误),Flowable 将会抛出 `FlowableException` 并终止当前实例运行。 解决方案:可以在捕获异常的地方显式记录日志或者重新抛出自定义异常以便于调试。 3. **并行网关下的服务任务同步失败** 若多个分支都含有独立的服务任务,则可能因为资源竞争而导致部分任务未能正常结束。 解决方案:合理设计并发控制机制;例如利用数据库锁或分布式事务协调工具来保障一致性[^3]。 4. **Spring Bean 注入失效** 对于基于 Spring 的项目环境来说,有时即使已经正确定义了 bean 却仍然报错找不到对应对象。 解决方案:确认上下文中确实存在目标 bean 实例以及名称匹配无误的同时也要注意版本兼容性问题[^2]。 --- ```python def example_script(): print("This is an embedded script running within a Flowable service task.") ``` --- #### 总结 通过对上述内容的学习可以看出,在实际开发过程中针对不同需求可以选择合适的方式来实现各自的功能模块。无论是采用标准 API 还是借助第三方库都可以极大地提升工作效率同时降低维护成本。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值