Activiti工作流知识点:

1.工作流环境搭建

1.1下载插件:
activiti插件下载
https://plugins.jetbrains.com/plugin/7429-actibpm/versions
然后将插件添加到 IDE
在这里插入图片描述

然后将插件安装到IDE中,
在这里插入图片描述
1.2 安装成功以后新建文件,里面会有这样的文件名字;
1.3 创建数据库:MySQL
在这里插入图片描述
单独一个数据库,会有25张表;

创建一个springboot项目:
Activiti主要配置pom;

 <!--activiti-->
		<dependency>
		    <groupId>org.activiti</groupId>
		    <artifactId>activiti-engine</artifactId>
		    <version>5.22.0</version>
		</dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>7.1.0</version>
        </dependency>
        <!--bpmn模型-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-model</artifactId>
            <version>7.1.0</version>
        </dependency>
        <!--bpmn转换-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-converter</artifactId>
            <version>7.1.0</version>
        </dependency>
        <!--bpmn 转换json-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>7.1.0</version>
        </dependency>
        <!--bpmn布局-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>7.1.0</version>
        </dependency>

其他配置pom.xml文件配置:

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        
        <!--连接池-->
        <dependency>
            <groupId>connons-dbcp</groupId>
            <artifactId>connons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>connons-io</groupId>
            <artifactId>connons-io</artifactId>
            <version>2.6</version>
        </dependency>
        
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        
        <!--log-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>

log4j配置文件:

log4j.rootCategory=DEBUG,console,logfile
log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#文件输出的相关设置
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=E:\Activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

Activiti.cfg.xml配置文件

<?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">

    <!-- 这里可以使用 链接池 dbcp-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql:///activiti" />
        <property name="username" value="root" />
        <property name="password" value="root" />
        <property name="maxActive" value="3" />
        <property name="maxIdle" value="1" />
    </bean>

    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!-- 引用数据源 上面已经设置好了-->
        <property name="dataSource" ref="dataSource" />
        <!-- activiti数据库表处理策略 -->
        <property name="databaseSchemaUpdate" value="true"/>   false
    </bean>
</beans>

开始创建表结构:

public class TextCreateTable {
    @Test
    public void textCreateTable(){
        //默认创建方式
        ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
        System.out.println(processEngine);
        //通用创建方式
      //  ProcessEngineConfiguration processEngineConfiguration=ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
       // System.out.println(processEngineConfiguration);

    }
}

表创建成功:
在这里插入图片描述

|<h2>通用数据
|[ACT_GE_BYTEARRAY]	|通用的流程定义和流程资源
|[ACT_GE_PROPERTY]	|系统相关属性
|<h2>流程历史记录		|
|[ACT_HI_ACTINST]	|历史的流程实例
|[ACT_HI_ATTACHMENT]|	历史的流程附件
|[ACT_HI_COMMENT]|	历史的说明性信息
|[ACT_HI_DETAIL]|	历史的流程运行中的细节信息
|[ACT_HI_IDENTITYLINK]|	历史的流程运行过程中用户关系
|[ACT_HI_PROCINST]	|历史的流程实例
|[ACT_HI_TASKINST]	|历史的任务实例
|[ACT_HI_VARINST]	|历史的流程运行中的变量信息
|<h2>流程定义表	|	
|[ACT_RE_DEPLOYMENT]	|部署单元信息
|[ACT_RE_MODEL]|	模型信息
|[ACT_RE_PROCDEF]|	已部署的流程定
|<h2>运行实例表		
|[ACT_RU_EVENT_SUBSCR]	|运行时事件|
|[ACT_RU_EXECUTION]	|运行时流程执行实例
|[ACT_RU_IDENTITYLINK]	|运行时用户关系信息,存储任务节点与参与者的相关信息
|[ACT_RU_JOB]	|运行时作业
|[ACT_RU_TASK]|	运行时任务
|[ACT_RU_VARIABLE]	|运行时变量表

在这里插入图片描述

BPMN:
在这里插入图片描述
Connection—连接
Event—事件
Task—任务
Gateway—网关
Container—容器
Boundary event—边界事件
Intermediate event- -中间事件

在这里插入图片描述
部署到数据库中:

  /**
     *将bpmn和png放到数据库里
     */
    @Test
    public void testDeployment(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、使用RepositoryService进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("bpmn/Leave.bpmn") // 添加bpmn资源
                .addClasspathResource("bpmn/Leave.myLeave.png")  // 添加png资源
                .name("出差申请流程")
                .deploy();//插进数据库里面
//        4、输出部署信息
        System.out.println(deployment.getClass());
       System.out.println("流程部署id:" + deployment.getId());
       System.out.println("流程部署名称:" + deployment.getName());
    }

将压缩包部署到数据库中:

   /**
   * zip压缩包方式来上传
   */
  @Test
  public void deployProcessByZip() {
      // 定义zip输入流
      ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
      InputStream inputStream = this
              .getClass()
              .getClassLoader()
              .getResourceAsStream(
                      "bpmn/Leave.myLeave.zip");
      ZipInputStream zipInputStream = new ZipInputStream(inputStream);
      // 获取repositoryService
      RepositoryService repositoryService = processEngine
              .getRepositoryService();
      // 流程部署
      Deployment deployment = repositoryService.createDeployment()
              .addZipInputStream(zipInputStream)
              .deploy();
      System.out.println("流程部署id:" + deployment.getId());
  }

启动流程实例:

 /**
     * 启动流程实例
     */
    @Test
    public void testStartProcess(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        3、根据流程定义Id启动流程
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey("my");

//        输出内容
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例id:" + processInstance.getId());
        System.out.println("当前活动Id:" + processInstance.getActivityId());
        System.out.println(processInstance.getName());
    }
查询当前个人任务

  /**
   * 查询当前个人待执行的任务
   */
  @Test
  public void testFindPersonalTaskList() {
//        任务负责人
      String assignee = "a";
      ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        创建TaskService
      TaskService taskService = processEngine.getTaskService();
//        根据流程key 和 任务负责人 查询任务
      List<Task> list = taskService.createTaskQuery()
              .processDefinitionKey("my") //流程Key
              .taskAssignee(assignee)//只查询该任务负责人的任务
              .list();
      System.out.println("---------------");
      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());
          System.out.println("--------------------");

      }
  }

完成任务:

// 完成任务
    @Test
    public void completTask(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取taskService
        TaskService taskService = processEngine.getTaskService();

//        根据流程key 和 任务的负责人 查询任务
//        返回一个任务对象
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") //流程Key
                .taskAssignee("zhangsan")  //要查询的负责人
                .singleResult();

//        完成任务,参数:任务id
        taskService.complete(task.getId());
    }  

查询流程定义:

    /**
   * 查询流程定义
   */
  @Test
  public void queryProcessDefinition(){
      //        获取引擎
      ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        repositoryService
      RepositoryService repositoryService = processEngine.getRepositoryService();
//        得到ProcessDefinitionQuery 对象
      ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//          查询出当前所有的流程定义
//          条件:processDefinitionKey =evection
//          orderByProcessDefinitionVersion 按照版本排序
//        desc倒叙
//        list 返回集合
      List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myEvection")
              .orderByProcessDefinitionVersion()
              .desc()
              .list();
//      输出流程定义信息
      for (ProcessDefinition processDefinition : definitionList) {
          System.out.println("流程定义 id="+processDefinition.getId());
          System.out.println("流程定义 name="+processDefinition.getName());
          System.out.println("流程定义 key="+processDefinition.getKey());
          System.out.println("流程定义 Version="+processDefinition.getVersion());
          System.out.println("流程部署ID ="+processDefinition.getDeploymentId());
      }

  }

删除流程:

public void deleteDeployment() {
  // 流程部署id
  String deploymentId = "1";
  
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 通过流程引擎获取repositoryService
  RepositoryService repositoryService = processEngine
    .getRepositoryService();
  //删除流程定义,如果该流程定义已有流程实例启动则删除时出错
  repositoryService.deleteDeployment(deploymentId);
  //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
  //repositoryService.deleteDeployment(deploymentId, true);
 }  

下载流程:

import org.apache.commons.io.IOUtils;

@Test
    public void deleteDeployment(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        根据部署id 删除部署信息,如果想要级联删除,可以添加第二个参数,true
        repositoryService.deleteDeployment("1");
    }

    public void  queryBpmnFile() throws IOException {
//        1、得到引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("myEvection")
                .singleResult();
//        4、通过流程定义信息,得到部署ID
        String deploymentId = processDefinition.getDeploymentId();
//        5、通过repositoryService的方法,实现读取图片信息和bpmn信息
//        png图片的流
        InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
//        bpmn文件的流
        InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
//        6、构造OutputStream流
        File file_png = new File("d:/evectionflow01.png");
        File file_bpmn = new File("d:/evectionflow01.bpmn");
        FileOutputStream bpmnOut = new FileOutputStream(file_bpmn);
        FileOutputStream pngOut = new FileOutputStream(file_png);
//        7、输入流,输出流的转换
        IOUtils.copy(pngInput,pngOut);
        IOUtils.copy(bpmnInput,bpmnOut);
//        8、关闭流
        pngOut.close();
        bpmnOut.close();
        pngInput.close();
        bpmnInput.close();
    }  

查看历史流程:

    /**
     * 查看历史信息
     */
    @Test
    public void findHistoryInfo(){
//      获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取HistoryService
        HistoryService historyService = processEngine.getHistoryService();
//        获取 actinst表的查询对象
        HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//        查询 actinst表,条件:根据 InstanceId 查询
//        instanceQuery.processInstanceId("2501");
//        查询 actinst表,条件:根据 DefinitionId 查询
        instanceQuery.processDefinitionId("myEvection:1:4");
//        增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
        instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//        查询所有内容
        List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
//        输出
        for (HistoricActivityInstance hi : activityInstanceList) {
            System.out.println(hi.getActivityId());
            System.out.println(hi.getActivityName());
            System.out.println(hi.getProcessDefinitionId());
            System.out.println(hi.getProcessInstanceId());
            System.out.println("<==========================>");
        }
    } 
    

大概流程:

在这里插入图片描述

******发现错误“

数据库乱码:在连接数据库后面添加   characterEncoding=UTF-8
 <property name="url" value="jdbc:mysql:///activiti?characterEncoding=UTF-8"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天至少八杯水i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值