一.简介
ServiceTask 从名字上看就是服务任务,它的图标是像下面这样,截图如下:
ServiceTask 一般由系统自动完成,当流程走到这一步的时候,不会自动停下来,而是会去执行我们提前在 ServiceTask 中配置好的方法。
二.绘制流程图
首先绘制一个流程图,来看一下 ServiceTask 要处理。流程图截图如下:
中间这个就是一个 ServiceTask。
当流程执行到 ServiceTask 的时候,具体要做哪些事情?有三种不同的方式来设置这里的任务,下面分别来细说。
三. 监听类
首先可以设置一个监听类,这个监听类有一个硬性规定就是需要实现 JavaDelegate 接口,代码如下:
public class MyServiceTask implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
System.out.println("========MyServiceTask==========");
}
}
在这个监听类中可以完成一些操作,通过这个 execution 也可以获取到在流程节点之间传输的变量。
这个类定义好之后,接下来我们在流程定义的时候,配置这个类的全路径即可,截图下图:
下载这个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:class="org.javaboy.flowableidm.MyServiceTask"></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>
在 ServiceTask 标签中的 flowable:class=“org.javaboy.flowableidm.MyServiceTask” 就表示 ServiceTask 执行的服务类。
配置完成后,可以部署并启动这个流程,由于这个流程除了开始和结束,就这一个节点,所以流程一启动就自动结束了。不过在这个过程中,可以看到控制台打印出来了日志,说明这个 ServiceTask 确实是执行了。
四. 委托表达式
也可以配置委托表达式。
委托表达式是指将一个实现了 JavaDelegate 接口的类注册到 Spring 容器中,然后我们在流程节点的配置中不用写完整的类名了,只需要写 Spring 容器中的 Bean 名称即可。 代码如下:
@Component
public class MyServiceTask implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
System.out.println("========MyServiceTask==========");
}
}
这个类注册到 Spring 容器中的默认名称是类名首字母小写,即 myServiceTask。
现在在流程图中,可以按照如下方式进行配置,截图如下:
下载这个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:delegateExpression=“${myServiceTask}” 就表示执行的一个表达式。
配置完成后,可以部署并启动这个流程,由于这个流程除了开始和结束,就这一个节点,所以流程一启动就自动结束了。不过在这个过程中,可以看到控制台打印出来了日志,说明这个 ServiceTask 确实是执行了。
注:委托表达式,一定是 JavaDelegate 接口的实现类,将这个实现类注册到 Spring 容器中,然后在使用的时候,根据 Bean 的名称从 Spring 容器中查找即可。