activiti入门学习之单机Demo演示

一、什么是Activiti?

  Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。说白了activiti是一个业务流程管理引擎,会沿着设计者设计好的流程,一步一步的执行下去,直到终点。

二、activiti配置讲解

  • 使用idea开发,需要安装bpmn插件

  activiti入门学习之单机Demo演示

  • pom文件
      <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-model</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-converter</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti.cloud</groupId>
            <artifactId>activiti-cloud-services-api</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
  •  activiti配置文件    

  activiti入门学习之单机Demo演示

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd
						http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="jdbcUrl"  value="jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/>
        <property name="jdbcUsername" value="root"/>
        <property name="jdbcPassword" value="root"/>
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>
  • activiti所需的25张表
    public static void main(String[] args) {
//        ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//        ProcessEngine processEngine = cfg.buildProcessEngine();
//        System.out.println(processEngine);


//创建方式二  采用默认配置,xml和bean的id  processEngineConfiguration
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        System.out.println(defaultProcessEngine);
    }

  activiti入门学习之单机Demo演示

  ACT_RE_*: RE表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)

  ACT_RU_*: RU表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

  ACT_HI_*: HI表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。

  ACT_GE_*: GE 表示 general。通用数据, 用于不同场景下。

  • activiti提供的service介绍

  RepositoryService activiti 的资源管理类

  RuntimeService activiti 的流程运行管理类

  TaskService activiti 的任务管理类

  HistoryService activiti 的历史管理类

  ManagerService activiti 的引擎管理类

三、流程图定义

  • 流程定制

activiti入门学习之单机Demo演示  activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

  • 导出图片

  导出图片之前需要先将idea的文件配置成utf-8,不然流程定义中的文字会出现乱码的情况

activiti入门学习之单机Demo演示      activiti入门学习之单机Demo演示

  然后将创建的bpmn后缀名给为xml  activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

  如果没有提前修改idea配置文件为utf-8的话,这里会出现乱码

activiti入门学习之单机Demo演示

  然后在将之前修改成xml的后缀名在修改成bpmn

activiti入门学习之单机Demo演示

四、单机演示Demo

 1、流程定义到数据库中,此操作影响的表

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到 RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //开始部署
        Deployment deployment = repositoryService.createDeployment()
                //添加资源
                .addClasspathResource("bpmn/holiday.xml")
                .addClasspathResource("bpmn/holiday.png")
                .name("请假流程审批")
                .deploy();
        System.out.println("流程部署id:" + deployment.getId());

        System.out.println("流程部署名称:" + deployment.getName());
    }
  • 部署信息

activiti入门学习之单机Demo演示 

  •  流程定义的信息,唯一的key

activiti入门学习之单机Demo演示 

  • 定义的bpmn文件和png文件

activiti入门学习之单机Demo演示

 2、启动流程实例,此操作影响的表

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //创建流程实例  需要知道流程定义的key
        ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday");

        System.out.println("流程部署ID "+holiday.getDeploymentId());
        System.out.println("流程实例ID "+holiday.getId());
        System.out.println("流程的Key "+holiday.getBusinessKey());
        System.out.println("活动Id "+holiday.getActivityId());
    }
  • 已完成的活动信息

activiti入门学习之单机Demo演示

  • 参与者信息

activiti入门学习之单机Demo演示

  • 流程实例

activiti入门学习之单机Demo演示

  • 任务实例

activiti入门学习之单机Demo演示

  • 执行表

activiti入门学习之单机Demo演示

  • 参与者信息

activiti入门学习之单机Demo演示

  • 任务

activiti入门学习之单机Demo演示

 3、查询任务

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
        TaskService taskService = processEngine.getTaskService();


        //根据流程定义的key和负责人查询当前用户的任务列表
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("holiday")
                .taskAssignee("wanwu")
                .list();
        for (Task task : list) {
            System.out.println("流程实例Id "+task.getProcessInstanceId());
            System.out.println("任务Id "+task.getId());
            System.out.println("负责人名称 "+task.getAssignee());
            System.out.println("任务名称 "+task.getName());

        }

    }

 activiti入门学习之单机Demo演示

 4、处理任务

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //处理任务   任务ID2505,上面已经查询到的
        taskService.complete("2505");

    }
  • 影响的表和启动实例的时候差不多

activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

  这个表只存储当前流程的下一个执行任务

 

5、流程定义的查询

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //得到ProcessDefinitionQuery对象   可以认为是一个查询器
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

        //设置流程定义的Key
        List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("holiday")
                //设置排序方式 默认是根据流程定义的版本号排序
                .orderByProcessDefinitionVersion().desc()
                .list();

        for (ProcessDefinition processDefinition : holiday) {
            System.out.println("流程定义的ID " +processDefinition.getId());
            System.out.println("流程定义名称 " +processDefinition.getName());
            System.out.println("流程定义Key " +processDefinition.getKey());
            System.out.println("流程定义的版本号 " +processDefinition.getVersion());
            System.out.println("流程部署的ID  " +processDefinition.getDeploymentId());
        }
    }

activiti入门学习之单机Demo演示

 6、删除已部署的流程

 

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //执行删除   参数是部署ID
        //repositoryService.deleteDeployment("2501");

        
        //如果流程没有执行完成 删除时候回出错,如果强制删除也是可以的是级联删除
        //级联删除   执行但为完成的也是可以删除的   true会先删除没有完成的流程节点,最后删除流程定义信息
        repositoryService.deleteDeployment("2501",true);

    }

 

 activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

activiti入门学习之单机Demo演示

  流程删除和流程部署影响的表一样的

 7、流程定义资源查看

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到HistoryService
        HistoryService historyService = processEngine.getHistoryService();

        HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();

        //查询条件
        historicActivityInstanceQuery.processInstanceId("5001");

        //执行流程
        List<HistoricActivityInstance> list = historicActivityInstanceQuery
                .orderByHistoricActivityInstanceStartTime().asc()
                .list();
        for (HistoricActivityInstance historicActivityInstance : list) {
            System.out.println(historicActivityInstance.getActivityId());
            System.out.println(historicActivityInstance.getActivityName());
            System.out.println(historicActivityInstance.getProcessDefinitionId());
            System.out.println(historicActivityInstance.getProcessInstanceId());

        }

    }

  activiti入门学习之单机Demo演示

 8、使用压缩包部署Activiti

  将流程图和bpmn文件压缩成zip格式的

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到 RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //转换ZipInputStream流对象
        InputStream is = ActivitiZipDeployment.class.getClass().getClassLoader().getResourceAsStream("bpmn/holiday.zip");

        ZipInputStream zipInputStream = new ZipInputStream(is);

        //开始部署
        Deployment deployment = repositoryService.createDeployment()
                //添加资源
               .addZipInputStream(zipInputStream)
                .name("请假流程审批Zip")
                .deploy();
        System.out.println("流程部署id:" + deployment.getId());

        System.out.println("流程部署名称:" + deployment.getName());
    }

五、总结

  没有多么厉害的东西,只是简单的activiti入门。具体的概念什么的也没有涉及到。主要是自己也在学习中。后面也会不断的学习,不断的总结吧

 

 

上一篇:flowable 走过的流程图节点描红线


下一篇:activiti05