美文网首页
Activiti流程引擎及服务2-流程运行控制服务(Runtim

Activiti流程引擎及服务2-流程运行控制服务(Runtim

作者: 安安汐而 | 来源:发表于2019-08-21 12:42 被阅读0次

    Demo项目代码:
    https://gitee.com/AnAnXiEr/activiti6-demo

    启动流程及对流程数据的控制
    流程实例(ProcessInstance)与执行流(Execution)查询
    触发流程操作、接收消息和信号

    RuntimeService启动流程及变量管理

    • 启动流程的常用方法(id,key,message)
    • 启动流程的可选参数(businessKey,variables,tenantId)businessKey:业务传过来的唯一单号、variables:上下文参数变量Map(string,object)、tenantId:多用户标志
    • 变量(variables)的设置和获取

    RuntimeService流程实例与执行流

    • 流程实例(ProcessInstance)表示一次工作流业务的数据实体
    • 执行流(Execution)表示流程实例中的具体的执行路径
    • 流程实例接口继承与执行流

    RuntimeService流程触发

    • 使用trigger触发ReceiveTask节点


      image.png
    • 触发信号捕获事件signalEventReceived


      image.png
    • 触发消息捕获事件messageEventReceived(必须指定流程的Id)


      image.png

    代码

    RuntimeServiceTest.java

    package com.imooc.activiti.activitidemo.coreapi;
    
    import com.google.common.collect.Maps;
    import org.activiti.engine.RepositoryService;
    import org.activiti.engine.RuntimeService;
    import org.activiti.engine.repository.Deployment;
    import org.activiti.engine.repository.DeploymentBuilder;
    import org.activiti.engine.repository.DeploymentQuery;
    import org.activiti.engine.repository.ProcessDefinition;
    import org.activiti.engine.runtime.Execution;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.activiti.engine.runtime.ProcessInstanceBuilder;
    import org.activiti.engine.task.IdentityLink;
    import org.activiti.engine.test.ActivitiRule;
    import org.junit.Rule;
    import org.junit.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * @Description RepostoryService测试
     * @Author 胡浩
     * @Date 2019/8/21
     **/
    public class RuntimeServiceTest {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(RuntimeServiceTest.class);
    
        @Rule
        public ActivitiRule activitiRule = new ActivitiRule("config/activiti_mdc.cfg.xml");
    
        /**
         * 各种方式对流程启动的控制
         * 通过key启动
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process.bpmn20.xml")
        public void testStartProcessByKey() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            //参数
            Map<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            //每次流程部署、id会发生变化,key不会变化
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process", variables);
            LOGGER.info("processInstance = {}", processInstance);
        }
    
        /**
         * 各种方式对流程启动的控制
         * 通过Id启动
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process.bpmn20.xml")
        public void testStartProcessById() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            ProcessDefinition processDefinition = activitiRule.getRepositoryService()
                    .createProcessDefinitionQuery().singleResult();
            //参数
            Map<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            //每次流程部署、id会发生变化,key不会变化
            ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), variables);
            LOGGER.info("processInstance = {}", processInstance);
        }
    
        /**
         * 各种方式对流程启动的控制
         * 通过ProcessInstanceBuilder启动
         * 通过构造器启动
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process.bpmn20.xml")
        public void testStartProcessByProcessInstanceBuilder() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            //参数
            Map<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
    
            //通过构造器启动
            ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder();
            ProcessInstance processInstance = processInstanceBuilder.businessKey("businessKey001")
                    .processDefinitionKey("my-process")
                    .variables(variables)
                    .start();
    
            LOGGER.info("processInstance = {}", processInstance);
        }
    
        /**
         * 各种方式对流程启动的控制
         * 通过message启动流程
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process-message.bpmn20.xml")
        public void testProcessByMessage() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            ProcessInstance processInstance = runtimeService.startProcessInstanceByMessage("my-message");
            LOGGER.info("processInstance = {} ", processInstance);
        }
    
        /**
         * 查询、修改变量
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process.bpmn20.xml")
        public void testVariables() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            //参数
            Map<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            variables.put("key2", "value2");
            variables.put("key3", "value3");
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process", variables);
            LOGGER.info("启动成功processInstance = {}", processInstance);
            //新增参数
            runtimeService.setVariable(processInstance.getId(), "key4", "value4");
            //修改老参数
            runtimeService.setVariable(processInstance.getId(), "key2", "value2_1");
    
            //查询变量
            Map<String, Object> variables1 = runtimeService.getVariables(processInstance.getId());
            LOGGER.info("variables1 = {}", variables1);//{key1=value1, key2=value2_1, key3=value3, key4=value4}
        }
    
        /**
         * 流程实例进行查询
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process.bpmn20.xml")
        public void testProcessInstanceQuery() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            //参数
            Map<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process", variables);
            LOGGER.info("启动成功processInstance = {}", processInstance);
    
            //根据流程实例id查询
            ProcessInstance processInstanceById = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
            //根据业务唯一标识查询
            ProcessInstance processInstanceByBusinessKey = runtimeService.createProcessInstanceQuery().processDefinitionKey("businessKey001").singleResult();
    
        }
    
        /**
         * 流程对象进行查询
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process.bpmn20.xml")
        public void testExecutionQuery() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            //参数
            Map<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process", variables);
            LOGGER.info("启动成功processInstance = {}", processInstance);
    
            List<Execution> executions = runtimeService.createExecutionQuery().listPage(0, 100);
            //会查出来2条、一条是流程实例ProcessInstance,一条是Execution
            for (Execution execution : executions) {
                LOGGER.info("execution = {} ", execution);
            }
    
        }
    
    
        /**
         * RuntimeService流程触发
         * 使用trigger触发ReceiveTask节点
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process-trigger.bpmn20.xml")
        public void testTrigger() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process");
    
            //查询到tlApprove的执行流
            Execution tlApprove = runtimeService.createExecutionQuery().activityId("tlApprove").singleResult();
            LOGGER.info("执行前tlApprove = {} ", tlApprove);
    
            //执行
            runtimeService.trigger(tlApprove.getId());
    
            //查询到tlApprove的执行流
            Execution tlApprove1 = runtimeService.createExecutionQuery().activityId("tlApprove").singleResult();
            LOGGER.info("执行后tlApprove1 = {} ", tlApprove1);//执行后tlApprove1 = null,流程已經执行完了
        }
    
        /**
         * RuntimeService流程触发
         * 触发信号捕获事件signalEventReceived
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process-signal-received.bpmn20.xml")
        public void testSignalEventReceived() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process");
    
            //查询到信号my-signal
            Execution execution = runtimeService.createExecutionQuery()
                    .signalEventSubscriptionName("my-signal")
                    .singleResult();
            LOGGER.info("execution = {} ", execution);
    
            //触发信号
            runtimeService.signalEventReceived("my-signal");
    
            //再查询到信号my-signal
            Execution execution1 = runtimeService.createExecutionQuery()
                    .signalEventSubscriptionName("my-signal")
                    .singleResult();
            LOGGER.info("执行后execution = {} ", execution1); //执行后execution = null,流程已經执行完了
        }
    
        /**
         * RuntimeService流程触发
         * 触发消息捕获事件messageEventReceived(必须指定流程的Id)
         */
        @Test
        @org.activiti.engine.test.Deployment(resources = "coreapi/my-process-message-received.bpmn20.xml")
        public void testMessageEventReceived() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process");
    
            //查询到my-message
            Execution execution = runtimeService.createExecutionQuery()
                    .messageEventSubscriptionName("my-message")
                    .singleResult();
            LOGGER.info("execution = {} ", execution);
    
            //触发信号
            runtimeService.messageEventReceived("my-message", processInstance.getId());
    
            //再查询到my-message
            Execution execution1 = runtimeService.createExecutionQuery()
                    .messageEventSubscriptionName("my-message")
                    .singleResult();
            LOGGER.info("执行后execution = {} ", execution1); //执行后execution = null,流程已經执行完了
        }
    
    
    }
    
    

    my-process-trigger.bpmn20.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/processdef">
        <process id="my-process" name="二级审批流程" isExecutable="true">
            <documentation>MDC test process</documentation>
            <startEvent id="startEvent" name="开始"/>
    
            <sequenceFlow id="sid-905AF026-9221-4C80-AF9A-29C581E59503" sourceRef="startEvent"
                          targetRef="tlApprove"/>
            <!--<userTask id="tlApprove" name="主管审批"/>-->
            <receiveTask id="tlApprove"></receiveTask>
    
            <sequenceFlow id="sid-905AF026-9221-4C80-AF9A-29C581E59505" sourceRef="tlApprove"
                          targetRef="endEventCancel"/>
    
            <endEvent id="endEventCancel" name="取消"/>
        </process>
    </definitions>
    

    my-process-signal-received.bpmn20.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/processdef">
        <!--信号-->
        <signal id="signalStart" name="my-signal"></signal>
    
        <process id="my-process" name="二级审批流程" isExecutable="true">
            <documentation>MDC test process</documentation>
            <startEvent id="startEvent" name="开始"/>
    
            <sequenceFlow id="sid-905AF026-9221-4C80-AF9A-29C581E59503" sourceRef="startEvent"  targetRef="signal-received"/>
    
            <intermediateCatchEvent id="signal-received">
                <signalEventDefinition signalRef="signalStart"/>
            </intermediateCatchEvent>
    
            <sequenceFlow id="sid-905AF026-9221-4C80-AF9A-29C581E59505" sourceRef="signal-received"  targetRef="endEventCancel"/>
    
            <endEvent id="endEventCancel" name="取消"/>
        </process>
    
    </definitions>
    

    my-process-message-received.bpmn20.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/processdef">
        <!--信号-->
        <message id="messageStart" name="my-message"></message>
    
        <process id="my-process" name="二级审批流程" isExecutable="true">
            <documentation>MDC test process</documentation>
            <startEvent id="startEvent" name="开始"/>
    
            <sequenceFlow id="sid-905AF026-9221-4C80-AF9A-29C581E59503" sourceRef="startEvent"  targetRef="message-received"/>
    
            <intermediateCatchEvent id="message-received">
                <messageEventDefinition messageRef="messageStart"/>
            </intermediateCatchEvent>
    
            <sequenceFlow id="sid-905AF026-9221-4C80-AF9A-29C581E59505" sourceRef="message-received"  targetRef="endEventCancel"/>
    
            <endEvent id="endEventCancel" name="取消"/>
        </process>
    
    </definitions>
    

    my-process-message.bpmn20.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/processdef">
        <!--信号-->
        <message id="messageStart" name="my-message"></message>
    
        <process id="my-process" name="二级审批流程" isExecutable="true">
            <documentation>MDC test process</documentation>
            <startEvent id="startEvent" name="开始">
                <messageEventDefinition messageRef="messageStart"/>
            </startEvent>
    
            <sequenceFlow id="sid-905AF026-9221-4C80-AF9A-29C581E59503" sourceRef="startEvent"  targetRef="tlApprove"/>
    
            <userTask id="tlApprove" name="主管审批"/>
    
            <sequenceFlow id="sid-905AF026-9221-4C80-AF9A-29C581E59505" sourceRef="tlApprove"  targetRef="endEventCancel"/>
    
            <endEvent id="endEventCancel" name="取消"/>
        </process>
    
    </definitions>
    
    

    相关文章

      网友评论

          本文标题:Activiti流程引擎及服务2-流程运行控制服务(Runtim

          本文链接:https://www.haomeiwen.com/subject/ycxbsctx.html