Activiti 6.0 核心API

857 阅读3分钟

本章概述

流程引擎及服务

image-20210213212426748.png

流程引擎存储服务

RepositoryService

  • 管理流程定义文件xml及静态的服务
  • 对特定的流程的暂停和激活
  • 流程定义启动权限管理
  • 部署文件构造器DeploymentBuilder
  • 部署文件查询器DeploymentQuery
  • 流程定义文件查询对象ProcessDefinitionQuery
  • 流程部署文件对象Deployment
  • 流程定义文件对象ProcessDefinittion
  • 流程定义的Java格式BpmnModel(BpmnModel是纯Java的数据结构List或者Map )

流程存储服务-RepositoryService

  • RepostoryServiceTest

     private static final Logger LOGGER = LoggerFactory.getLogger(RepostoryServiceTest.class);
    
        @Rule
        public ActivitiRule activitiRule = new ActivitiRule();
    
        @Test
        public void testRepostory() {
            RepositoryService repositoryService = activitiRule.getRepositoryService();
            // 第一次部署
            DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
            deploymentBuilder.name("测试部署资源")
                    .addClasspathResource("my-process.bpmn20.xml")
                    .addClasspathResource("second_approve.bpmn20.xml");
            // 第二次部署
            DeploymentBuilder deployment1 = repositoryService.createDeployment();
            deployment1.name("测试部署资源")
                    .addClasspathResource("my-process.bpmn20.xml")
                    .addClasspathResource("second_approve.bpmn20.xml");
            deployment1.deploy();
    
            Deployment deploy = deploymentBuilder.deploy();
            LOGGER.info(" deploy ={}", deploy);
            DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
            List<Deployment> deployments = deploymentQuery
    //                .deploymentId(deploy.getId())
                    .orderByDeploymenTime().asc()
                    .listPage(0, 100);
            for (Deployment deployment : deployments) {
                LOGGER.info("deployment = {}", deployment);
            }
            LOGGER.info("deployments.size() = {}", deployments.size());
            List<ProcessDefinition> definitionList = repositoryService.createProcessDefinitionQuery()
    //                .deploymentId(deployment.getId())
                    .orderByProcessDefinitionKey().asc()
                    .listPage(0, 100);
            for (ProcessDefinition processDefinition : definitionList) {
                LOGGER.info("processDefinition= {},version ={}, key = {},id ={}", processDefinition, processDefinition.getVersion()
                        , processDefinition.getKey()
                        , proce
                            
                            ssDefinition.getId());
            }
        }
    
  • 测试结果

image-20210216153443546.png

  • 6个生成文件部署资料如下图

image-20210216154146139.png

  • testSuspend
 @Test
    @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
    public void testSuspend() {
        RepositoryService repositoryService = activitiRule.getRepositoryService();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .singleResult();
        LOGGER.info("processDefinition.id = {}", processDefinition.getId());
        repositoryService.suspendProcessDefinitionById(processDefinition.getId());
        try {
            LOGGER.info("开始启动");
            activitiRule.getRuntimeService().startProcessInstanceById(processDefinition.getId());
            LOGGER.info("启动成功");

        } catch (Exception e) {
            LOGGER.info("启动失败");
            LOGGER.info(e.getMessage(), e);
        }
        repositoryService.activateProcessDefinitionById(processDefinition.getId());
        LOGGER.info("开始启动");
        activitiRule.getRuntimeService().startProcessInstanceById(processDefinition.getId());
        LOGGER.info("启动成功");
    }

image-20210216162041448.png

image-20210216162106918.png

    @Test
    @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
    public void testCandidateStarter() {
        RepositoryService repositoryService = activitiRule.getRepositoryService();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .singleResult();
        LOGGER.info("processDefinition.id = {}", processDefinition.getId());
        repositoryService.addCandidateStarterUser(processDefinition.getId(), "user");
        repositoryService.addCandidateStarterGroup(processDefinition.getId(), "groupM");
        List<IdentityLink> identityLinks = repositoryService.getIdentityLinksForProcessDefinition(processDefinition.getId());
        for (IdentityLink identityLink : identityLinks) {
            LOGGER.info("identityLink", identityLink);
        }
        repositoryService.deleteCandidateStarterGroup(processDefinition.getId(), "groupM");
        repositoryService.deleteCandidateStarterUser(processDefinition.getId(), "user");
    }

image-20210216162311422.png

流程运行控制服务

RuntimeService

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

RuntimeService 启动流程及变量管理

  • 启动流程的常用方式(id,key,message)

  • 启动流程可选参数(businessKey,varibles,teandId)

    • businessKey是唯一标致
  • 变量(variables)的设置和获取

  • 代码如下

    public class RuntimeServiceTest {
        private static final Logger LOGGER = LoggerFactory.getLogger(RuntimeServiceTest.class);
    
        @Rule
        public ActivitiRule activitiRule = new ActivitiRule();
    
    
        @Test  // 根据key去启动
        @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
        public void testStartProcess() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            HashMap<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            ProcessInstance processInstance = runtimeService
                    .startProcessInstanceByKey("my-process", variables);
            LOGGER.info("processInstance =  {}", processInstance);
        }
    
        @Test  // 根据id去启动
        @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
        public void testStartProcessById() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            ProcessDefinition processDefinition = activitiRule.getRepositoryService()
                    .createProcessDefinitionQuery().singleResult();
    
            HashMap<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            ProcessInstance processInstance = runtimeService
                    .startProcessInstanceById(processDefinition.getId(), variables);
            LOGGER.info("processInstance =  {}", processInstance);
        }
    
        @Test  // 根据流程实例去启动
        @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
        public void testProcessInstanceBuilder() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            HashMap<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder();
            ProcessInstance processInstance = processInstanceBuilder.businessKey("businessKey001")
                    .processDefinitionKey("my-process")
                    .variables(variables)
                    .start();
            /*ProcessInstance processInstance = runtimeService
                    .startProcessInstanceByKey("my-process", variables);
            */
            LOGGER.info("processInstance =  {}", processInstance);
        }
    
        @Test
        @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
        public void testVariables() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            HashMap<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            variables.put("key2", "value2");
            ProcessInstance processInstance = runtimeService
                    .startProcessInstanceByKey("my-process", variables);
    
            runtimeService.setVariable(processInstance.getId(), "key3", "values3");
            runtimeService.setVariable(processInstance.getId(), "key2", "values2_1");
    
            Map<String, Object> variables1 = runtimeService.getVariables(processInstance.getId());
            LOGGER.info("variables1 =  {}", variables1);
        }
    
        @Test
        @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
        public void testProcessInstanceQuery() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            HashMap<String, Object> variables = Maps.newHashMap();
            variables.put("key1", "value1");
            variables.put("key2", "value2");
            ProcessInstance processInstance = runtimeService
                    .startProcessInstanceByKey("my-process", variables);
            LOGGER.info("processInstance =  {}", processInstance);
            ProcessInstance processInstance1 = runtimeService.createProcessInstanceQuery()
                    .processInstanceId(processInstance.getId()).singleResult();
            List<Execution> executions = runtimeService.createExecutionQuery()
                    .listPage(0, 100);
            for (Execution execution : executions) {
                LOGGER.info("execution = {}", execution);
            }
    
        }
    }
    

    流程实例与执行流

  • 流程实例(ProcessInstance)表示一次工作流业务的数据实体

  • 执行流(Execution)表示流程实例中具体执行路径

  • 流程实例接口继承执行流

流程触发

  • 使用trigger触发ReceiveTask节点
  • 触发信号捕获事件signalEventReceived
  • 触发消息捕获事件messageEventReceived

流程触发Trigger

image-20210216194926891.png

  • Java代码
@Test
    @org.activiti.engine.test.Deployment(resources = {"my-process-trigger.bpmn20.xml"})
    public void testTrigger() {
        RuntimeService runtimeService = activitiRule.getRuntimeService();
        // 开启流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process");

        Execution execution = runtimeService.createExecutionQuery().activityId("someTask").singleResult();

        LOGGER.info("execution = {}", execution);
        runtimeService.trigger(execution.getId());

        execution = runtimeService.createExecutionQuery().activityId("someTask").singleResult();
        LOGGER.info("execution = {}", execution);

    }
  • my-process-trigger.bpmn20.xml

     <process id="my-process">
    
            <startEvent id="start"/>
            <sequenceFlow id="flow1" sourceRef="start" targetRef="someTask"/>
    
            <!--		<userTask id="someTask" name="Activiti is awesome!" />-->
            <receiveTask id="someTask"/>
            <sequenceFlow id="flow2" sourceRef="someTask" targetRef="end"/>
    
            <endEvent id="end"/>
    
        </process>
    

image-20210216204139348.png

流程触发signalEventRecvied

image-20210216204308396.png

  • Java代码

        @Test
        @org.activiti.engine.test.Deployment(resources = {"my-process-signal-received.bpmn20.xml"})
        public void testSignalEventReceived() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process");
            Execution execution = runtimeService.createExecutionQuery().signalEventSubscriptionName("my-signal").singleResult();
            LOGGER.info("execution = {}", execution);
            runtimeService.signalEventReceived("my-process");
            execution = runtimeService.createExecutionQuery().signalEventSubscriptionName("my-signal").singleResult();
            LOGGER.info("execution = {}", execution);
        }
    

image-20210216210830550.png

  • my-process-signal-received.bpmn20.xml

     <signal id="messageStart" name="my-message"></signal>
        <process id="my-process">
    
            <startEvent id="start"/>
            <sequenceFlow id="flow1" sourceRef="start" targetRef="message-received"/>
            <intermediateCatchEvent id="message-received">
                <signalEventDefinition signalRef="messageStart"/>
            </intermediateCatchEvent>
            <!--        <userTask id="someTask" name="Activiti is awesome!"/>-->
            <sequenceFlow id="flow2" sourceRef="message-received" targetRef="end"/>
    
            <endEvent id="end"/>
    
        </process>
    

流程触发messageEventRecevied

image-20210216210929273.png

  • Java代码

        @Test
        @org.activiti.engine.test.Deployment(resources = {"my-process-message-received.bpmn20.xml"})
        public void testMessageEventReceived() {
            RuntimeService runtimeService = activitiRule.getRuntimeService();
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-message");
            Execution execution = runtimeService.createExecutionQuery().messageEventSubscriptionName("my-message").singleResult();
            LOGGER.info("execution = {}", execution);
            runtimeService.signalEventReceived("my-process");
            execution = runtimeService.createExecutionQuery().messageEventSubscriptionName("my-message").singleResult();
            LOGGER.info("execution = {}", execution);
        }
    
  • my-process-message-received.bpmn20.xml

<signal id="messageStart" name="my-message"></signal>
    <process id="my-process">

        <startEvent id="start"/>
        <sequenceFlow id="flow1" sourceRef="start" targetRef="message-received"/>
        <intermediateCatchEvent id="message-received">
            <signalEventDefinition signalRef="messageStart"/>
        </intermediateCatchEvent>
        <!--        <userTask id="someTask" name="Activiti is awesome!"/>-->
        <sequenceFlow id="flow2" sourceRef="message-received" targetRef="end"/>

        <endEvent id="end"/>

    </process>

image-20210216214918448.png

任务管理服务(TaskService)

  • 对用户任务(UserTask)管理和流程控制
  • 设置用户任务(UserTask)的权限信息(拥有者,候选人,办理人)
  • 针对用户任务添加任务附件,任务评论和事件评论

TaskService对Task管理和流程控制

  • Task对象创建,删除

  • 查询Task,并驱动Task节点完成执行

  • Task相关参数 变量(variable)设置

  • Java代码

     @Test
        @Deployment(resources = {"my-process-task.bpmn20.xml"})
        public void testTaskService() {
            HashMap<String, Object> variables = Maps.newHashMap();
            variables.put("message", "my test message!!!");
            ProcessInstance processInstance = activitiRule.getRuntimeService()
                    .startProcessInstanceByKey("my-process", variables);
    
            TaskService taskService = activitiRule.getTaskService();
            Task task = taskService.createTaskQuery().singleResult();
            LOGGER.info("task = {}", ToStringBuilder.reflectionToString(task, ToStringStyle.JSON_STYLE));
            LOGGER.info("task.description = {}", task.getDescription());
    
        }
    
  • my-process-task.bpmn20.xml

        <process id="my-process">
    
            <startEvent id="start"/>
            <sequenceFlow id="flow1" sourceRef="start" targetRef="someTask"/>
            <userTask id="someTask" name="Activiti is awesome!"
                      activiti:candidateUsers="jimmy,user1,user2">
                <documentation>some Task ${message}</documentation>
            </userTask>
            <sequenceFlow id="flow2" sourceRef="someTask" targetRef="end"/>
    
            <endEvent id="end"/>
    
        </process>
    

image-20210216230622751.png