前言
近期在开发一个基于Activiti
基础实现的工作流平台,发现目前的工作流引擎都是不太符合国内的一些业务需求的,例如国内的驳回,抄送目前流行的工作流引擎都没有具体的实现。在这里记录一下相关的大致实现方案。
这里分享的是抄送业务,驳回、会签、或签功能会在其他文章中分享,若相应文章编写完毕,会在文章最下方放上相应连接。
抄送业务实现
- 基本思路 - 监听器实现
可以通过给抄送节点添加监听器,进而在通过自己的业务实现数据库消息表的添加。 - 技术难点
- 需要在监听器中拿到
Spring IOC
容器中的service, - 多实例的抄送(抄送多人)
- 需要在监听器中拿到
- 实现方案
-
拿到
Spring IOC
delegateExpression
类型的监听器 ,该属性的值为Spring IOC
中bean的名字。
工具添加
BPMN文件添加
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1585975437203" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema"> <process id="testListener6" isClosed="false" isExecutable="true" name="测试监听器" processType="None"> <startEvent id="_2" name="StartEvent"/> <endEvent id="_3" name="EndEvent"/> <userTask activiti:exclusive="true" id="_4" name="创建申请"> <extensionElements> <activiti:taskListener delegateExpression="#{TestListener}" event="create"/> </extensionElements> </userTask> <userTask activiti:exclusive="true" id="_5" name="审核申请"> </userTask> <sequenceFlow id="_6" sourceRef="_2" targetRef="_4"/> <sequenceFlow id="_7" sourceRef="_4" targetRef="_5"/> <sequenceFlow id="_8" sourceRef="_5" targetRef="_3"/> </process> </definitions>
核心代码-注意
extensionElements
是包裹在userTask
标签内部的<extensionElements> <activiti:taskListener delegateExpression="#{TestListener}" event="create"/> </extensionElements>
-
相关代码-监听器代码,这里要注意Bean的名字。
@Component("TestListener") public class TestListener implements TaskListener { @Autowired TaskService taskService; @Override public void notify(DelegateTask delegateTask) { System.out.println("delegateTask.getAssignee() = " + delegateTask.getAssignee()); System.out.println("delegateTask.getId() = " + delegateTask.getId()); System.out.println("=--------------------------------="); taskService.complete(delegateTask.getId()); } }
-
接下在监听其中编写相应逻辑即可 ,大致思路是 拿到当前task的一些信息,查询要抄送的人的信息,然后通过Spring IOC
中拿到的service进行相应的业务逻辑添加(消息表新增),然后对该节点进行一个通过。