Activiti的学习

目录

一. 工作流介绍 

1.1 介绍

2.2 Activiti的使用步骤

1.部署activiti

2.流程定义

3.流程定义的部署

4.启动流程实例

5.用户查询待办任务

6.用户办理任务

7.流程结束

3.3 Activiti的数据库支持

3.3.1 表的介绍

3.3.2 类的介绍

4.4 流程符号的介绍

4.4.1 事件

4.4.2 活动

4.4.3 网关

5.5 流程

5.5.1 流程设计

5.5.2 流程部署

5.5.3启动流程实例

5.5.4 查询个人的待办任务

5.5.5 查询个人已完成的任务

5.5.6 使用zip包进行部署 打包

回顾

二. SpringBoot整合Activiti

1.1 pom文件

1.2 Activiti的Controller层

1.3 service层

1.4 serviceImpl

1.6 Application

1.7 serviceTask



一. 工作流介绍 

1.1 介绍

工作流(workflow), 就是通过计算机对业务流程的自动化执行, 它主要解决的是 "使在多个参与者之间按照某种预定义的规则自动进行传递文档, 信息或任务的过程, 从而实现某个预期的业务目标, 或者促使此目标的实现"

​ Activiti是一个工作流引擎(作者: Tom Baeyens), activiti可以将业务系统中复杂的业务流程抽取出来, 使用专门的建模语言BPMN2.0进行定义, 业务流程按照预先定义的流程进行执行, 实现了系统的流程由activiti进行管理, 减少业务系统由于流程变更进行系统升级改造的工作量, 从而提高系统的健壮性, 同时减少系统开发维护成本.

​ BPMN(Business Process Model AndNotation) 业务流程模型和符号

Bpmn图形其实是通过xml表示流程, .bpmn文件使用文本编辑器打开

2.2 Activiti的使用步骤

1.部署activiti

​ Activiti是一个工作流引擎(jar包api), 业务系统访问 activiti的接口, 就可与你方便的操作流程的相关数据, 这样就可以把工作流环境与业务系统的环境集成在一起

2.流程定义

使用相关的建模工具定义业务流程(.bpmn文件) 画流程图

3.流程定义的部署

​ activiti部署业务流程定义(.bpmn文件), 使用activiti提供的api把流程内容存储起来, 在activiti执行过程可以查阅定义的内容, activiti执行把流程定义内容存储在数据库

4.启动流程实例

​ 流程实例(Processinstance), 启动一个流程实例表示一次业务流程的运行,

​ 比如请假流程, 张三请假, 与李四请假, 两个流程, 两个不同的实例, 两个流程互不影响

5.用户查询待办任务

​ 因为系统的业务流程已经交给activiti管理, 通过activiti就可以查询当前执行的流程执行到了哪里, 当前用户需要办理什么任务, 这是activiti帮我们管理, 不需要开发人员写sql

6.用户办理任务

​ 用户查询代办任务后, 就可以办理某个任务了, 如果是审批流程, 还需要其他用户审核, 这个过程activiti也帮助我们完成

7.流程结束

​ 当任务办理完成没有下一个节点任务, 这个流程实例就是完成了

3.3 Activiti的数据库支持

生成activiti提供的默认方式创建mysql表, 会创建25张表

 
public class TestCreate{ 
@Test 
public void testCreateDbTable(){
 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 System.out.prinln (processEngine); 
}} 

3.3.1 表的介绍

​ act开头,

​ act_ge_ 通用类型数据

​ act_hi_ 历史数据, 历史的流程实例, 历史的任务

​ act_re_ 流程定义的内容, 及一些静态资源

​ act_ru_ 运行时需要操作的一些表, 流程变量, 一些运行时的数据

3.3.2 类的介绍

RepositoryService 可以操作部署相关的业务, 就是act_re这些表

RuntimeService 可以帮助我们操纵act_ru这些表

HistoryService 可以帮助我们去操纵跟历史相关的act_hi 这些表

怎么使用:

​ 利用ProcessEngine. 就可以进行调用,

activiti的配置文件

4.4 流程符号的介绍

4.4.1 事件

4.4.2 活动

4.4.3 网关

排他网关: 只有一条路径会被选择, 当两个为true时, 会执行第一个为true的线路, 排他网关与条件顺序流结合使用, default指定默认顺序流, 当所有条件都不满足时, 会执行默认顺序流

并行网关:(+) 所有路径都会被同时选择

​ 拆分: 并行执行所有的输出顺序流, 为每一条顺序流创建一个并行的线路

​ 合并: 所有的并行网关拆分完成的线路均在此等候, 直到所有线路执行完毕才继续向下执行

包容网关:(o)

​ 可以同时执行多条线路, 也可以在网关上设置条件

​ 拆分 -- 计算每条线路上的表达式, 当表达式结果为true时, 创建一个并行线路继续执行

​ 合并 -- 所有从并行网关拆分并执行完成的线路均在此等候, 直到所有的线路都执行完成后才继续向下执行

事件网关:

​ 专门为中间捕获事件设置的, 允许设置多个输出流指向不同的中间捕获事件, 当流程执行到事件网关后, 流程处于等待状态, 需要等待抛出事件才能将等待状态装换为活动状态

4.4.4 流向

​ 指的是连接两个流程节点的连线,

5.5 流程

5.5.1 流程设计

每个流程都有一个唯一的key, 绘制bpmn图, 为每一个节点指定负责人

可以将.bpmn文件改为以.xml文件结尾, 使用idea的

就可以将其变为

可以导出到桌面为png文件

5.5.2 流程部署

流程部署的三张表

public class ActivitiTest {
    /**
     * 测试流程部署* 
     */
    
    @Test
    public void testDeployment(){
        /**
         * 1. 创建ProcessEngine 流程引擎* 
         */
        ProcessEngine ProcessEngine = ProcessEngines.getDefaultProcessEngine();
        /**
         * 2.  获取RepositoryService* 
         */
        RepositoryService repositoryService  =  processEngine.getRepositoryService();
        /**
         * 3. 使用service进行了流程的部署 把bpmn 和png 部署到流程中 
         */
        Deployment  deployment   =    repositoryService.createDeployment()
                .name("出差申请流程")
                .addClasspathResource("bpmn/evection.bpmn")
                .addClassPathResource("bpmn/evection.png")
                .deploy();
        /**
         * 4. 输出部署信息* 
         */
        System.out.println("部署流程id="+ deployment.getId());
        System.out.println("部署流程名字="+ deployment.getName());
        
    }
}

 

5.5.3启动流程实例

/**
 * * 启动流程实例
 */
public class TestHua {

    public void testStartProcess() {
        // 1. 创建ProcessEngine
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取RunTimeService
        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
        // 3. 根据定义的id启动流程  
        ProcessInstance myEvection = runtimeService.startProcessInstanceById("myEvection");
        // 4. 输出内容
        System.out.println("流程定义id = " + myEvection.getProcessDefinitionId());
        System.out.println("流程实例id = " + myEvection.getId());
        System.out.println("当前活动的ID: " + myEvection.getActivityId());
    }
}

会发生改变的表

5.5.4 查询个人的待办任务

 /**
     *查询个人待办任务
     **/
    @Test
    public void testFindPersonalTaskList(){
        // 1. 获取流程引擎
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取taskService
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 3. 根据流程key 和 任务负责人 查询任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("myEvection")
                .taskAssignee("zhangsan")
                .list();
        // 4. 输出
        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());
        }

    }

查询个人待执行的sql

5.5.5 查询个人已完成的任务

/**
     * 查询已办任务
     * */
    public void completTask(){
        // 1. 获取流程引擎
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取taskService
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 3. 根据任务id完成任务
        taskService.complete("22253");
        
    }

在 act_hi_taskinst 表中

会发生改变的表

经理审批, 对应的assignee jerry 经理名字 到了哪一个审批人, 名字就变一下

 /**
     * * 审批人审批项目
     */
    public void completTasksa(){
        // 1. 获取流程引擎
        // 2. 获取操作任务的任务
        // 3. 完成任务 参数任务id 完成张三的任务
        // 2. 获取taskService
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 3. 根据流程key 和 任务负责人 查询任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection")
                .taskAssignee("jerry")
                .singleResult();
        // 4. 输出

            System.out.println("流程实例id = " + task.getProcessInstanceId());
            System.out.println("任务id = " + task.getId());
            System.out.println("任务负责人 = " + task.getAssignee());
            System.out.println("任务名称 = " + task.getName());

    }

当审批流程走完了了

act_ru_task 就会为null

5.5.6 使用zip包进行部署 打包

zip文件包含 bpmn 与 png文件

回顾

Bpmn图形其实是通过xml表示流程, .bpmn文件使用文本编辑器打开

二. SpringBoot整合Activiti

     1.1 pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>activi-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>activi-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <activiti.version>6.0.0</activiti.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <!-- Activiti 流程图 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-common-rest</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- Activiti 在线设计 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-modeler</artifactId>
            <version>5.22.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-web</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-config</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-core</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-crypto</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-web</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-webmvc</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>activation</artifactId>
                    <groupId>javax.activation</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-io</artifactId>
                    <groupId>commons-io</groupId>
                </exclusion>
            </exclusions>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
package com.example.actividemo;


import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.JavaDelegate;

public class ServiceTask1 implements JavaDelegate {
    //流程变量
    private Expression text1;

    //重写委托的提交方法
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("serviceTask1 已经执行已经执行!");
        String value1 = (String) text1.getValue(execution);
        System.out.println(value1);
        execution.setVariable("var1", new StringBuffer(value1).reverse().toString());
    }
}

package com.example.actividemo;


import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.JavaDelegate;

public class ServiceTask2 implements JavaDelegate {
    //流程变量
    private Expression text2;

    //重写委托的提交方法
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("serviceTask2 已经执行已经执行!");
        String value1 = (String) text2.getValue(execution);
        System.out.println(value1);
        execution.setVariable("var1", new StringBuffer(value1).reverse().toString());
    }
}

1.2 Activiti的Controller层

package com.example.actividemo;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/activiti")
public class ActivitiController {

    @Autowired
    private ActivityConsumerService activityConsumerService;

    /**
     * 注册流程
     *
     * @return
     */
    @RequestMapping("/createDeployment")
    public Boolean createDeployment() {
        return activityConsumerService.createDeployment();
    }

    /**
     * 启动流程
     *
     * @return
     */
    @RequestMapping("/startActivityDemo")
    public Boolean startActivityDemo() {
        return activityConsumerService.startActivityDemo("test01");
    }

    /**
     * 获取待办
     *
     * @return
     */
    @RequestMapping("/getTaskList")
    public List getTaskList() {
        return activityConsumerService.getTaskList();
    }

    /**
     * 提交
     *
     * @param taskId
     * @return
     */
    @RequestMapping("/complete")
    public boolean complete(String taskId) {
        return activityConsumerService.complete(taskId);
    }

    /**
     * 根据流程id直接结束流程
     *
     * @return
     * @paramru
     */
    @RequestMapping("/deleteProcessInstance")
    public boolean deleteProcessInstance(String runId) {
        return activityConsumerService.deleteProcessInstance(runId);
    }


}

1.3 service层

package com.example.actividemo;


import java.util.List;

public interface ActivityConsumerService {
    boolean createDeployment();

    boolean startActivityDemo(String key);

    List getTaskList();

    boolean complete(String taskId);

    boolean deleteProcessInstance(String runId);
}

1.4 serviceImpl

package com.example.actividemo;


import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("activityService")
public class ActivityConsumerServiceImpl implements ActivityConsumerService {

    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private HistoryService historyService;
    @Autowired
    private RepositoryService repositoryService;

    /**
     * 注册一个流程
     *
     * @return
     */
    @Override
    public boolean createDeployment() {
        DeploymentBuilder builder = repositoryService.createDeployment();
        builder.addClasspathResource("test01.bpmn20.xml");
        builder.deploy();
        return true;
    }

    /**
     * 查询待办
     *
     * @return
     */
    public List getTaskList() {
        return historyService.createHistoricActivityInstanceQuery().list();
    }


    /**
     * 根据流程key开启一个流程
     *
     * @param key
     * @return
     */
    @Override
    public boolean startActivityDemo(String key) {
        ProcessInstance test01 = runtimeService.startProcessInstanceByKey(key);
        String id = test01.getId();
        System.out.println("流程id=" + id);
        return true;
    }

    /**
     * 根据任务id提交任务
     *
     * @param taskId
     * @return
     */
    @Override
    public boolean complete(String taskId) {
        taskService.complete(taskId);
        return true;
    }

    /**
     * 根据流程id直接结束流程
     *
     * @param runId
     * @return
     */
    @Override
    public boolean deleteProcessInstance(String runId) {
        runtimeService.deleteProcessInstance(runId, "结束");
        return true;
    }


}

1.6 Application

package com.example.actividemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication(exclude = {
        org.activiti.spring.boot.SecurityAutoConfiguration.class
})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

1.7 serviceTask

package com.example.actividemo;


import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.JavaDelegate;

public class ServiceTask1 implements JavaDelegate {
    //流程变量
    private Expression text1;

    //重写委托的提交方法
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("serviceTask1 已经执行已经执行!");
        String value1 = (String) text1.getValue(execution);
        System.out.println(value1);
        execution.setVariable("var1", new StringBuffer(value1).reverse().toString());
    }
}

package com.example.actividemo;


import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.JavaDelegate;

public class ServiceTask2 implements JavaDelegate {
    //流程变量
    private Expression text2;

    //重写委托的提交方法
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("serviceTask2 已经执行已经执行!");
        String value1 = (String) text2.getValue(execution);
        System.out.println(value1);
        execution.setVariable("var1", new StringBuffer(value1).reverse().toString());
    }
}

1.8 项目的配置文件

server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/activi_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=88888888
spring.activiti.check-process-definitions=false
spring.activiti.process-definition-location-prefix=classpath:*
spring.activiti.process-definition-location-suffixes=.bpmn20.xml

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值