Activiti (2) - 动态分配流程任务执行人

接着 BPMN 2.0 - Activiti, 开始测试动态分配流程任务执行人.

方式一

  1. 添加一个单个task级别的listener: ManagerTaskListenerHandler

    1
    2
    3
    4
    5
    6
    7
    public class ManagerTaskListenerHandler implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
    String assignee = "Tom";
    delegateTask.setAssignee(assignee);
    }
    }
  2. 创建工作流, 并配置taskListener如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?xml version="1.0" encoding="UTF-8"?>
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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"
    typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
    targetNamespace="http://www.activiti.org/test">
    <process id="userDynamicTask2" name="动态任务处理2" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <endEvent id="endevent1" name="End"></endEvent>
    <userTask id="休假" name="休假">
    <extensionElements>
    <activiti:taskListener event="create"
    class="org.wangy.bpmn.demo.v1.bpmn.ManagerTaskListenerHandler"></activiti:taskListener>
    </extensionElements>
    </userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="休假"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="休假" targetRef="endevent1"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_userDynamicTask2">
    <bpmndi:BPMNPlane bpmnElement="userDynamicTask2" id="BPMNPlane_userDynamicTask2">
    <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
    <omgdc:Bounds height="35.0" width="35.0" x="0.0" y="10.0"></omgdc:Bounds>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
    <omgdc:Bounds height="35.0" width="35.0" x="268.0301705943553" y="9.999999999999968"></omgdc:Bounds>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape bpmnElement="休假" id="BPMNShape_休假">
    <omgdc:Bounds height="55.0" width="105.0" x="99.01508529717765" y="0.0"></omgdc:Bounds>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
    <omgdi:waypoint x="357.0" y="145.0"></omgdi:waypoint>
    <omgdi:waypoint x="357.0" y="180.0"></omgdi:waypoint>
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
    <omgdi:waypoint x="357.0" y="235.0"></omgdi:waypoint>
    <omgdi:waypoint x="357.0" y="270.0"></omgdi:waypoint>
    </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
    </definitions>
  3. 发布上述工作流

    1
    myService.createDynamicWorkflow("test import xml workflow 2", BPMNResourceType.BPMN_20, bpmnXML);
  4. 测试 - 任务被自动分配给了”Tom”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    @Test public void test2UserTask() {
    // 获取RuntimeService服务对象的实例
    String processDefinitionKey = "userDynamicTask2";

    // 自动执行与Key相对应的流程的最高版本
    ProcessInstance processInstance = myService.startProcess(processDefinitionKey);
    String processInstanceId = processInstance.getId();
    logger.info("processInstanceId:" + processInstance.getId());

    // 获取TaskService服务对象的实例
    String assignee = "Tom";
    List<Task> tasks = myService.getTasks(assignee);
    Assert.assertEquals(1, tasks.size()); // 在ManagerTaskListenerHandler中, task已经本全部分配给了"Tom"

    Task task = tasks.get(0);
    logger.info("taskName:" + task.getName());
    logger.info("taskAssignee:" + task.getAssignee());
    Assert.assertEquals("休假", task.getName());

    // 完成任务
    myService.completeTask(task.getId());

    // 检查结束状态
    ProcessInstance pInstance = myService.findProcessInstance(processInstanceId);
    Assert.assertNull(pInstance);
    logger.info("动态任务处理流程2,使用自定义任务分配处理器方式成功执行!");
    }
  5. 测试 - 分配给其他人的任务也会被自动分配给”Tom”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    @Test public void test3UserTask() {
    // 获取RuntimeService服务对象的实例
    String processDefinitionKey = "userDynamicTask2";

    // 自动执行与Key相对应的流程的最高版本
    String assignee = "Jeff";
    ProcessInstance processInstance = myService.startProcess(processDefinitionKey, assignee);
    String processInstanceId = processInstance.getId();
    logger.info("processInstanceId:" + processInstance.getId());

    // 获取TaskService服务对象的实例
    List<Task> tasks = myService.getTasks(assignee);
    Assert.assertEquals(0, tasks.size()); // 在ManagerTaskListenerHandler中, task已经本重新分配给分配给了"Tom"了

    assignee = "Tom";
    tasks = myService.getTasks(assignee);
    Assert.assertEquals(1, tasks.size()); // 在ManagerTaskListenerHandler中, task已经本全部分配给了"Tom"

    Task task = tasks.get(0);
    logger.info("taskName:" + task.getName());
    logger.info("taskAssignee:" + task.getAssignee());
    Assert.assertEquals("休假", task.getName());

    // 完成任务
    myService.completeTask(task.getId());

    // 检查结束状态
    ProcessInstance pInstance = myService.findProcessInstance(processInstanceId);
    Assert.assertNull(pInstance);
    logger.info("动态任务处理流程2,使用自定义任务分配处理器方式成功执行!");
    }

方式二

  1. 采用上例中的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?xml version="1.0" encoding="UTF-8"?>
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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"
    typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
    targetNamespace="http://www.activiti.org/test">
    <process id="userDynamicTask1" name="动态任务处理1" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="休假" name="休假" activiti:assignee="${person}"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="休假"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow2" sourceRef="休假" targetRef="endevent1"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_userDynamicTask1">
    <bpmndi:BPMNPlane bpmnElement="userDynamicTask1" id="BPMNPlane_userDynamicTask1">
    <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
    <omgdc:Bounds height="35.0" width="35.0" x="189.5" y="194.5"></omgdc:Bounds>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape bpmnElement="休假" id="BPMNShape_休假">
    <omgdc:Bounds height="55.0" width="105.0" x="155.5" y="276.5"></omgdc:Bounds>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
    <omgdc:Bounds height="35.0" width="35.0" x="191.5" y="398.5"></omgdc:Bounds>
    </bpmndi:BPMNShape>
    <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
    <omgdi:waypoint x="357.0" y="145.0"></omgdi:waypoint>
    <omgdi:waypoint x="357.0" y="180.0"></omgdi:waypoint>
    </bpmndi:BPMNEdge>
    <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
    <omgdi:waypoint x="357.0" y="235.0"></omgdi:waypoint>
    <omgdi:waypoint x="357.0" y="270.0"></omgdi:waypoint>
    </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
    </definitions>
  2. 添加一个全局Listener:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public class TaskListenerTestHandler implements ActivitiEventListener {
    //~ Static fields/initializers ---------------------------------------------------------------------------------------

    /** TODO: DOCUMENT ME! */
    public static final Logger LOGGER = LoggerFactory.getLogger(TaskListenerTestHandler.class);

    //~ Methods ----------------------------------------------------------------------------------------------------------

    /**
    * @see org.activiti.engine.delegate.event.ActivitiEventListener#isFailOnException()
    */
    @Override public boolean isFailOnException() {
    return false;
    }

    //~ ------------------------------------------------------------------------------------------------------------------

    /**
    * @see org.activiti.engine.delegate.event.ActivitiEventListener#onEvent(org.activiti.engine.delegate.event.ActivitiEvent)
    */
    @Override public void onEvent(ActivitiEvent event) {
    LOGGER.info("Activiti Event --> type: {}, process instance: {}", event.getType(), event.getProcessInstanceId());

    switch (event.getType()) {
    case TASK_CREATED: {
    ActivitiEntityEventImpl evt = (ActivitiEntityEventImpl) event;
    String assignee = "Tom";
    TaskEntity entity = (TaskEntity) evt.getEntity();
    entity.setAssignee(assignee);
    break;
    }

    default: { }
    }


    }
    }
  3. 配置Listener

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Autowired public void init(ProcessEngineConfigurationImpl processEngineConfiguration) {
    List<ActivitiEventListener> eventListeners = processEngineConfiguration.getEventListeners();

    if (Objects.isNull(eventListeners)) {
    eventListeners = new ArrayList<>();
    processEngineConfiguration.setEventListeners(eventListeners);
    }

    eventListeners.add(new TaskListenerTestHandler());
    }
  4. 测试, 测试代码和例子二中的 第4步第5步 一样


参考:

  1. http://blog.csdn.net/wei763328075qq/article/details/51596621