当前位置: 首页 > 科技观察

执行Flowable服务任务的三种方式

时间:2023-03-16 11:44:56 科技观察

我和小伙伴聊了下Flowable中的ReceiveTask和UserTask。今天我们就来看看另一个常见的Task-->ServiceTask。1、ServiceTaskServiceTask顾名思义就是一个服务任务,其图标一般如下:ServiceTask通常由系统自动完成。当流程执行到这一步时,不会自动停止,而是会执行。ServiceTask中配置的方法。2.实践下面通过一个简单的例子来看看ServiceTask是如何工作的。假设我有一个简单的流程图如下:中间的是一个ServiceTask。流程执行到ServiceTask时,具体应该做什么?这里设置任务的方式有3种,我们分别来看。2.1监听器类首先,我们可以建立一个监听器类。这个监听器类有一个硬性规定,它需要实现JavaDelegate接口,如下:我的服务任务==========”);}}在这个监听类中,我们可以完成一些操作,通过这个执行,我们还可以获得进程节点变量之间传递的数据。定义好这个类之后,我们可以在定义流程的时候配置这个类的全路径,如下图:这个配置对应的XML内容如下:测试流程朋友看到了,ServiceTask标签中的flowable:类=“org.javaboy.flowableidm.MyServiceTask”是指SserviceTask执行的服务类配置完成后,我们就可以部署启动流程了。由于这个进程除了start和end只有一个节点,所以进程一开始就会自动结束。但是在这个过程中,我们可以看到控制台打印出了日志,说明确实执行了ServiceTask。2.2委托表达式我们也可以配置委托表达式。委托表达式是指在Spring容器中注册一个实现了JavaDelegate接口的类,然后我们在流程节点的配置中就不需要写完整的类名了,只需要在Spring中写Bean名即可容器。像这样:@ComponentpublicclassMyServiceTaskimplementsJavaDelegate{@Overridepublicvoidexecute(DelegateExecutionexecution){System.out.println("========MyServiceTask==========");}}这个类在Spring容器中注册的默认名称是类名的首字母小写,即myServiceTask。现在我们在流程图中,我们可以这样配置:对应的XML文件如下:可以看到flowable:delegateExpressinotallow="${myServiceTask}"表示要执行的表达式。测试过程同2.1节,这里不再赘述。最后总结一下,委托表达式一定是JavaDelegate接口的实现类。在Spring容器中注册这个实现类,然后在使用时根据bean的名字从Spring容器中查找。2.3表达式我们也可以使用表达式。表达式是普通类的普通方法。在Spring容器中注册这个普通类,然后在表达式中执行这个类中的方法,类似下面,任意定义一个Java类:@ComponentpublicclassMyServiceTask2{publicvoidhello(){System.out.println("========MyServiceTask2==========”);}}然后在流程图中配置如下:表达式有部分内容被隐藏,完整的表达式为${myServiceTask2.hello()}。对应的XML文件如下:>sequenceFlow>可以看到表达式的内容是可流动的:expressinotallow="${myServiceTask2.hello()}。测试方法同2.1节,这里不再赘述。3.类中的字段可能有朋友注意到,我们在画流程图的时候,也可以给类设置一个字段。比如我想为ServiceTask的执行类设置一个用户名字段,如下:设置完成后,对应的XML如下:测试过程可以看到extensionElements节点描述了附加信息,接下来我们可以访问这个变量在Java类中,如下:@ComponentpublicclassMyServiceTaskimplementsJavaDelegate{Expressionusername;@Overridepublicvoidexecute(DelegateExecutionexecution){System.out.println("username.getExpressionText()="+username.getExpressionText());System.out.println("username.getValue(execution)="+username.getValue(execution));System.out.println("========MyServiceTask==========");}}如果你想获取username对应的值,在上面的代码中,宋大哥为你演示了两种方式。不过需要注意的是,这种在类中设置字段的方式适用于2.1和2.2小节的情况不适用于2.3小节的情况。