一.简介
ServiceTask 从名字上看就是服务任务,它的图标是像下面这样,截图如下:
ServiceTask 一般由系统自动完成,当流程走到这一步的时候,不会自动停下来,而是会去执行我们提前在 ServiceTask 中配置好的方法。
二.绘制流程图
首先绘制一个流程图,来看一下 ServiceTask 要处理。流程图截图如下:
中间这个就是一个 ServiceTask。
当流程执行到 ServiceTask 的时候,具体要做哪些事情?有三种不同的方式来设置这里的任务,下面分别来细说。
三. 表达式
也可以使用表达式。表达式就是一个普通类的普通方法,将这个普通类注册到 Spring 容器中,然后表达式中还可以执行这个类中的方法,类似下面这样,任意定义一个 Java 类,代码如下:
@Component
public class MyServiceTask2 {
public void hello() {
System.out.println("========MyServiceTask2==========");
}
}
然后在流程图中按照如下方式进行配置,截图下图:
完整的表达式是 ${myServiceTask2.hello()}
下载这个XML文件,这个配置对应的 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-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8"></sequenceFlow>
<serviceTask id="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" flowable:expression="${myServiceTask2.hello()}"></serviceTask>
<endEvent id="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></endEvent>
<sequenceFlow id="sid-0698809E-0A6C-4B92-A167-AE96A8CB75F2" sourceRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" targetRef="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></sequenceFlow>
</process>
可以看到,表达式的内容是 flowable:expression="${myServiceTask2.hello()}。
配置完成后,可以部署并启动这个流程,由于这个流程除了开始和结束,就这一个节点,所以流程一启动就自动结束了。不过在这个过程中,可以看到控制台打印出来了日志,说明这个 ServiceTask 确实是执行了。
四.类中字段
在绘制流程图的时候,还可以为类设置一个字段。例如给 ServiceTask 的执行类设置一个 username 字段,截图如下:
更改
设置完成后,下载这个XML文件,这个配置对应的 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-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8"></sequenceFlow>
<serviceTask id="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" flowable:delegateExpression="${myServiceTask}">
<extensionElements>
<flowable:field name="username">
<flowable:string><![CDATA[javaboy]]></flowable:string>
</flowable:field>
</extensionElements>
</serviceTask>
<endEvent id="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></endEvent>
<sequenceFlow id="sid-0698809E-0A6C-4B92-A167-AE96A8CB75F2" sourceRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" targetRef="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></sequenceFlow>
</process>
可以看到,这里通过 extensionElements 节点描述了额外的信息。
接下来,就可以在 Java 类中访问到得到这个变量了,代码如下:
@Component
public class MyServiceTask implements JavaDelegate {
Expression username;
@Override
public void execute(DelegateExecution execution) {
System.out.println("username.getExpressionText() = " + username.getExpressionText());
System.out.println("username.getValue(execution) = " + username.getValue(execution));
System.out.println("========MyServiceTask==========");
}
}