首页 > 其他分享 >activiti 常用方法封装及测试

activiti 常用方法封装及测试

时间:2022-10-26 17:58:27浏览次数:65  
标签:封装 String activiti 流程 processInstanceId 环节 测试 println processEngine

  Activiti 项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),提供技术实现。

  对于开发者来说,Activiti 就是一套 BPMN2.0 标准的流程引擎,通过 Activiti 实现流程的驱动及各类操作。

  这里对(简单场景)常用的方法进行了简单的封装与测试。

   /**
     * @Description 部署流程
     * name:流程名称
     * category:流程类别
     * fileName:流程文件名称
     */
    @Override
    public String deploy(String name, String category, String fileName) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
                .createDeployment()//创建一个部署对象
                .name(name)//添加部署名称
                .category(category)
                .addClasspathResource("processes/" + fileName)//从classpath的资源中加载,一次只能加载一个文件
                .deploy();//完成部署
        System.out.println("<------ 流程部署成功 ------>");
        System.out.println("部署ID:" + deployment.getId());
        System.out.println("部署名称:" + deployment.getName());
        return deployment.getId();
    }

    /**
     * @Description 启动一个流程且设置实例全局变量,并返回启动的流程实例的 ID
     * processDefineId 流程定义 ID
     * processName 流程实例命名
     * globalParamsMap 流程实例的全局变量
     */
    @Override
    public String startProcess(String processDefineId, String processName, Map globalParamsMap) {
        if (null == processDefineId || processDefineId.length() == 0)
            throw new NullPointerException("processInstanceId is null!");
        if (null == processName || processName.length() == 0)
            throw new NullPointerException("processName is null!");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        ProcessInstance instance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefineId,
                globalParamsMap);
        //为流程定义设置名称
        processEngine.getRuntimeService().setProcessInstanceName(instance.getId(), processName);
        return instance.getId();
    }

    /**
     * @Description 根据流程实例 ID 获取当前环节
     */
    @Override
    public List<Task> getCurrentNode(String processInstanceId) {
        if (null == processInstanceId || processInstanceId.length() == 0)
            throw new NullPointerException("processInstanceId is null!");
        if (this.isProcessFinish(processInstanceId))
            throw new RuntimeException("instance : " + processInstanceId + " is over!");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        List<Task> task =
                processEngine.getTaskService().createTaskQuery().processInstanceId(processInstanceId).active().list();
        return task;
    }

    /**
     * @Description 完成任务并设置实例全局变量
     * processInstanceId:流程实例中当前办理节点的 ID
     * globalParamsMap:流程实例的全局变量
     */
    @Override
    public void completeNode(String taskId, Map globalParamsMap) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        taskService.complete(taskId, globalParamsMap);
    }

    /**
     * @Description 查看流程是否已结束
     * processInstanceId 流程实例 ID
     */
    @Override
    public boolean isProcessFinish(String processInstanceId) {
        if (null == processInstanceId || processInstanceId.length() == 0)
            throw new NullPointerException("processInstanceId is null!");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        HistoricProcessInstance historicProcessInstance =
                processEngine.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
        if (Objects.isNull(historicProcessInstance)) throw new NullPointerException("processInstance is not exsits");
        if (Objects.isNull(historicProcessInstance.getEndTime())) return false;
        else return true;
    }

    /**
     * @Description 为实例设置流程变量
     */
    @Override
    public void setInstanceParams(String processInstanceId, Map map) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        runtimeService.setVariables(processInstanceId, map);
    }

    /**
     * @Description 获取实例中的流程变量
     */
    @Override
    public Map<String, Object> getInstanceParams(String processInstanceId) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        Map<String, Object> variables = runtimeService.getVariables(processInstanceId);
        System.out.println("  <------ 实例中的变量 ------>  ");
        variables.forEach((k, v) -> {
            System.out.println(k + " " + v);
        });
        return variables;
    }

    /**
     * @Description 设置环节节点的 local 变量
     */
    @Override
    public void setTaskLocalParams(String taskId, String k, String v) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        taskService.setVariableLocal(task.getId(), k, v);
        System.out.println("设置 local 变量成功 : " + k + " : " + v);
    }


    /**
     * @Description 获取环节节点的 local 变量
     */
    @Override
    public String getTaskLocalParams(String taskId, String k) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        String v = taskService.getVariableLocal(task.getId(), k).toString();
        return v;
    }

  简单实现一个监听器

/**
 * 任务监听器用于在特定的任务相关事件发生时,执行自定义的Java逻辑或表达式
 * 任务监听器支持下列属性:
 * event(事件)(必填):任务监听器将被调用的任务事件类型。可用的事件有:
 * create(创建):当任务已经创建,并且所有任务参数都已经设置时触发。
 * assignment(指派):当任务已经指派给某人时触发。请注意:当流程执行到达用户任务时,create事件触发前,首先触发assignment事件。这看起来不是自然顺序,但是有实际原因的:当收到create
 * 事件时,我们通常希望查看任务的所有参数,包括办理人。
 * complete(完成):当任务已经完成,从运行时数据中删除前触发。
 * delete(删除):在任务即将被删除前触发。请注意当任务通过completeTask正常完成时也会触发
 * class:需要调用的代理类。这个类必须实现 org.activiti.engine.delegate.TaskListener 接口
 * expression:(不能与class属性一起使用):指定在事件发生时要执行的表达式。可以为被调用的对象传递 DelegateTask 对象与事件名(使用 task.eventName )作为参数
 * delegateExpression:可以指定一个能够解析为 TaskListener 接口实现类对象的表达式。与服务任务类似
 */

@Slf4j
public class TemplateListener implements TaskListener {

    private static final long serialVersionUID = 3654543511891213996L;

    @Override
    public void notify(DelegateTask delegateTask) {

        // 事件名称
        String eventName = delegateTask.getEventName();
        if (EVENTNAME_CREATE.endsWith(eventName)) {
            System.out.println(" >>>>>> create <<<<<< ");
        } else if (EVENTNAME_ASSIGNMENT.endsWith(eventName)) {
            System.out.println(" >>>>>> assignment <<<<<< ");
        } else if (EVENTNAME_COMPLETE.endsWith(eventName)) {
            System.out.println(" >>>>>> complete <<<<<< ");
        } else if (EVENTNAME_DELETE.endsWith(eventName)) {
            System.out.println(" >>>>>> delete <<<<<< ");
        }

        System.out.println("creatTime: " + DateUtils.dateToStr(delegateTask.getCreateTime()));
        // 获取流程定义id
        System.out.println("processDefinitionId: " + delegateTask.getProcessDefinitionId());
        // 实例 ID
        System.out.println("processInstanceId: " + delegateTask.getProcessInstanceId());
        // 执行路径 ID,execution 和 分支是一对一的关系,有多少个分支就有多少个execution,介于 processInstance 与 task 之间
        // 是 processInstance 的分支、是 task 的执行环境
        // execution 与 processInstance:启动流程,会创建流程实例,此是会在act_ru_execution中保存数据(主流程数据、子流程数据),
        // 如果只有一个流程分支的话,还会在此表中创建一条子流程数据,会引用主流程数据的id(processInstanceId),
        // 如果有多个分支就会创建多个子流程数据
        // execution 与 task:从级别上来说,execution相当于task的执行环境,execution是包含task的
        System.out.println("executionId: " + delegateTask.getExecutionId());
        // 任务 ID
        System.out.println("taskId: " + delegateTask.getId());
        // 任务名称
        System.out.println("taskName: " + delegateTask.getName());
        // 描述信息
        System.out.println("description: " + delegateTask.getDescription());
        // 优先级
        System.out.println("Priority 0-100: " + delegateTask.getPriority());
    }
}

  画个流程测试下,流程图如下:

  单一网关的判断条件:

 

 

 条件分支的判断条件:

  对其中的环节 3 配置了上面的示例监听器

 

  测试方法,部署流程

    //部署流程
    @Test
    public void testDeploy() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
                .createDeployment()//创建一个部署对象
                .name("请假流程")//添加部署名称
                .category("测试流程类别")
                .addClasspathResource("processes/MyProcess.bpmn20.xml")//从classpath的资源中加载,一次只能加载一个文件
                .deploy();//完成部署
        System.out.println("部署ID:" + deployment.getId());
        System.out.println("部署名称:" + deployment.getName());
    }

  测试方法,启动流程并不断执行任务,知道流程办结

 @Test
    public void tst() {
        String processDefineId = "Process_1qa45id";

        Map params = new HashMap();
        params.put("type", "1");
        params.put("level5", "1");

        String instanceId = activitiService.startProcess(processDefineId, "测试流程实例1", params);
        System.out.println("流程启动成功,实例 ID:" + instanceId);
        activitiService.getInstanceParams(instanceId);

        while (!activitiService.isProcessFinish(instanceId)) {
            dealOneLevel(instanceId);
        }

        System.out.println(activitiService.isProcessFinish(instanceId) ? "已办结" : "未办结");
    }

    public void dealOneLevel(String instanceId) {
        System.out.println("");
        List<Task> taskList = activitiService.getCurrentNode(instanceId);
        for (int i = 0; i < taskList.size(); i++) {
            Task task = taskList.get(i);
            System.out.println(" <------ 环节办理 ------> ");
            System.out.println("当前环节ID:" + task.getId());
            System.out.println("当前环节名称:" + task.getName());
            System.out.println("流程开始时间:" + DateUtils.dateToStr(task.getCreateTime()));
            System.out.println("受理人/办理人:" + task.getAssignee());
            System.out.println("委托人:" + task.getOwner());
            activitiService.completeNode(task.getId(), new HashMap());
        }
    }

  流程的执行过程:

流程启动成功,实例 ID:800001
  <------ 实例中的变量 ------>  
level5 1
type 1

 <------ 环节办理 ------> 
当前环节ID:800009
当前环节名称:环节1
流程开始时间:2022-10-26 16:49:38
受理人/办理人:环节1办理人
委托人:null

 <------ 环节办理 ------> 
当前环节ID:800016
当前环节名称:环节2.1
流程开始时间:2022-10-26 16:49:38
受理人/办理人:环节2办理人1
委托人:null
 <------ 环节办理 ------> 
当前环节ID:800019
当前环节名称:环节2.2
流程开始时间:2022-10-26 16:49:38
受理人/办理人:环节2办理人2
委托人:null
 <------ 环节办理 ------> 
当前环节ID:800022
当前环节名称:环节2.3
流程开始时间:2022-10-26 16:49:38
受理人/办理人:环节2.3办理人
委托人:null
 <------ 环节办理 ------> 
当前环节ID:800025
当前环节名称:环节2.4
流程开始时间:2022-10-26 16:49:38
受理人/办理人:环节2.4办理人
委托人:null

 <------ 环节办理 ------> 
当前环节ID:800032
当前环节名称:环节3
流程开始时间:2022-10-26 16:49:38
受理人/办理人:环节3办理人
委托人:null
 >>>>>> complete <<<<<< 
creatTime: 2022-10-26 16:49:38
processDefinitionId: Process_1qa45id:11:797504
processInstanceId: 800001
executionId: 800014
taskId: 800032
taskName: 环节3
description: null
Priority 0-100: 50

 <------ 环节办理 ------> 
当前环节ID:800036
当前环节名称:环节4.1
流程开始时间:2022-10-26 16:49:38
受理人/办理人:环节4.1办理人
委托人:null

 <------ 环节办理 ------> 
当前环节ID:800039
当前环节名称:环节5
流程开始时间:2022-10-26 16:49:38
受理人/办理人:环节5办理人
委托人:null
已办结

 

标签:封装,String,activiti,流程,processInstanceId,环节,测试,println,processEngine
From: https://www.cnblogs.com/niuyourou/p/16829347.html

相关文章