activiti学习之信号边界事件

写在前面

考虑这样的场景,用户提交了工单,该工单等待审批,但是用户发现部分信息填写错误,需要重新填写,此时就可以通过信号边界事件完成,下面来看下如何实现。

1:测试

1.1:流程设计

  • 效果图

在这里插入图片描述

如下是定义信号和使用信号:

在这里插入图片描述

在这里插入图片描述

  • xml
<?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">
    <signal id="changeSignalA" name="changeSignalA" activiti:scope="global"></signal>
    <process id="mySignalBoundarEventA" name="信号边界事件A" isExecutable="true">
        <documentation>signalBoundary</documentation>
        <startEvent id="startevent1" name="Start"></startEvent>
        <endEvent id="endevent1" name="End"></endEvent>
        <userTask id="usertask1" name="填写工单" activiti:assignee="signalUser1">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <userTask id="usertask2" name="审批" activiti:assignee="signalUser2">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <userTask id="usertask3" name="修改工单" activiti:assignee="signalUser3">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
        <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
        <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="usertask1"></sequenceFlow>
        <sequenceFlow id="flow5" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
        <boundaryEvent id="boundarysignal1" name="Signal" attachedToRef="usertask2" cancelActivity="true">
            <signalEventDefinition signalRef="changeSignalA"></signalEventDefinition>
        </boundaryEvent>
        <sequenceFlow id="flow6" sourceRef="boundarysignal1" targetRef="usertask3"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_mySignalBoundarEventA">
        <bpmndi:BPMNPlane bpmnElement="mySignalBoundarEventA" id="BPMNPlane_mySignalBoundarEventA">
            <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
                <omgdc:Bounds height="35.0" width="35.0" x="210.0" y="170.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
                <omgdc:Bounds height="35.0" width="35.0" x="960.0" y="170.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
                <omgdc:Bounds height="55.0" width="105.0" x="420.0" y="160.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
                <omgdc:Bounds height="55.0" width="105.0" x="690.0" y="160.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="boundarysignal1" id="BPMNShape_boundarysignal1">
                <omgdc:Bounds height="30.0" width="30.0" x="728.0" y="202.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
                <omgdc:Bounds height="55.0" width="105.0" x="560.0" y="320.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
                <omgdi:waypoint x="245.0" y="187.0"></omgdi:waypoint>
                <omgdi:waypoint x="420.0" y="187.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
                <omgdi:waypoint x="525.0" y="187.0"></omgdi:waypoint>
                <omgdi:waypoint x="690.0" y="187.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
                <omgdi:waypoint x="560.0" y="347.0"></omgdi:waypoint>
                <omgdi:waypoint x="472.0" y="347.0"></omgdi:waypoint>
                <omgdi:waypoint x="472.0" y="215.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
                <omgdi:waypoint x="795.0" y="187.0"></omgdi:waypoint>
                <omgdi:waypoint x="960.0" y="187.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
                <omgdi:waypoint x="743.0" y="232.0"></omgdi:waypoint>
                <omgdi:waypoint x="612.0" y="320.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</definitions>

1.2:部署流程

/**
 * 部署流程定义
 */
@Test
public void deploy() {
    Deployment deployment = repositoryService.createDeployment() // 创建部署
            .addClasspathResource("com/jh/activiti/signal_boundary.bpmn20.xml") // 加载流程资源文件
            .name("信号边界事件") // 流程名称
            .deploy(); // 部署
    System.out.println("流程部署ID:" + deployment.getId());
    System.out.println("流程部署Name:" + deployment.getName());
}

在这里插入图片描述

在这里插入图片描述

1.3:启动流程实例

// 创建流程实例
@Test
public void createProcessInstance() {
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("mySignalBoundarEventA"); // 流程定义表的KEY字段值
    System.out.println("流程实例ID:" + pi.getId());
    System.out.println("流程定义ID:" + pi.getProcessDefinitionId());

}

1.4:完成任务

如下是填写工单任务:

在这里插入图片描述

  • 完成填写工单任务
@Test
public void completeWithSignal() {
    // 填写工单->审批工单(不完成,直接发出信号)->修改工单->填写工单->审批工单->结束
    // 订阅信号
    /*List<Execution> changeSignalList = runtimeService.createExecutionQuery().signalEventSubscriptionName("changeSignalA").list();
    System.out.println(changeSignalList);
    System.out.println(changeSignalList.size());*/
    taskService.complete("1035007"); // 填写工单
//        runtimeService.signalEventReceived("changeSignalA"); // 审批工单(不完成,直接发出信号)
//        taskService.complete("487503"); // 修改工单
//        taskService.complete("490002"); // 填写工单
//        taskService.complete("492504"); // 审批工单->结束
}

生成审批任务:

在这里插入图片描述

  • 发出信号,让任务重新流转回填写工单
@Test
public void completeWithSignal() {
    // 填写工单->审批工单(不完成,直接发出信号)->修改工单->填写工单->审批工单->结束
    // 订阅信号
    /*List<Execution> changeSignalList = runtimeService.createExecutionQuery().signalEventSubscriptionName("changeSignalA").list();
    System.out.println(changeSignalList);
    System.out.println(changeSignalList.size());*/
//        taskService.complete("1035007"); // 填写工单
    runtimeService.signalEventReceived("changeSignalA"); // 审批工单(不完成,直接发出信号)
//        taskService.complete("487503"); // 修改工单
//        taskService.complete("490002"); // 填写工单
//        taskService.complete("492504"); // 审批工单->结束
}

在这里插入图片描述

后续就可以继续按照正常流程来完成任务了。


版权声明:本文为wang0907原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。