activity工作流

github地址(在上面还整合了mp的代码生成器),有用的话给个star被。 Activity工作流的学习,想通过Activity工作流的形式去整合ELK、MQ和SpringCloud。

一、什么是工作流

以请假为例,现在大多数公司的请假流程是这样的: 员工打电话(或网聊)向上级提出请假申请—上级口头同意— 上级将请假记录下来—月底将请假记录上交公司—公司将请假录入电脑

采用工作流技术的公司的请假流程是这样的: 员工使用账户登录系统—点击请假—上级登录系统点击允许

就这样,一个请假流程就结束了 有人会问,那上级不用向公司提交请假记录?公司不用将记录录入电脑?

答案是,用的。但是这一切的工作都会在上级点击允许后自动运行! 这就是工作流技术。 Georgakopoulos给出的工作流定义是: 工作流是将一组任务组织起来以完成某个经营过程: 定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成, 也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完

二、工作流技术的优点

从上面的例子,很容易看出 工作流系统,实现了工作流程的自动化,提高了企业运营效率、 改善企业资源利用、提高企业运作的灵活性和适应性、提高量化考核业务处理的效率、减少浪费(时间就是金钱)。 而手工处理工作流程,一方面无法对整个流程状况进行有效跟踪、了解, 另一方面难免会出现人为的失误和时间上的延时导致效率低下,特别是无法进行量化统计,不利于查询、报表及绩效评估。

三、Java开发者会为什么要学Activity工作流

在Java领域,JBPM和Activity是两个主流的工作流系统, 而Activity的出现无疑将会取代JBPM(Activity的开发者就是从Jbpm开发者出来的)。

四、Activity工作流学习要点

1、1个插件 打开idea 选择 file-settings,打开如下页面,选择左侧Plugins , 然后点击下面的Search…输入actiBPM搜索,安装并重启IDEA

2、1个引擎 ProcessEngine对象,Activity工作流引擎。这是Activiti工作的核心。 负责生成流程运行时的各种实例及数据、监控和管理流程的运行。 所有的操作都是从获取引擎开始的,所以一般会把引擎作为全局变量 ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();1个配置文件 activiti.cfg.xml。Activiti核心配置文件, 配置流程引擎创建工具的基本参数和数据库连接池参数

3、5种数据库表

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。

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

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

ACT_ID_*: 'ID’表示identity。 这些表包含身份信息,比如用户,组等等。

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

ACT_GE_*: 通用数据,用于不同场景下,如存放资源文件。

整体流程:

/**
 * 1、部署流程
 * 2、启动流程实例
 * 3、请假人发出请假申请
 * 4、班主任查看任务
 * 5、班主任审批
 * 6、最终的教务处Boss审批
 */

*使用流程图在activity工作流的情况下生成数据库表*

1、先安装actiBPM插件,然后新建bmp流程图

activiti 导出java activiti7教程_工作流

2、将名字改成bpm20.xml后缀(这里一定要是bpm20否则act_re_procdef表不会插入数据)

activiti 导出java activiti7教程_java_02

3、生成流程图

activiti 导出java activiti7教程_activiti7_03

4、导出流程图

activiti 导出java activiti7教程_java_04

5、新建activiti.cfg.xml,这里特别注意高版本mysql的url一定要使用com.mysql.cj.jdbc.Driver还有nullCatalogMeansCurrent=true

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!--        配置数据库相关-->
<!--        数据库驱动-->
        <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"></property>
<!--        数据库链接-->
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useSSL=false& useUnicode=true& characterEncoding=utf8& serverTimezone=Asia/Shanghai& nullCatalogMeansCurrent=true"></property>
        <property name="jdbcUsername" value="root"></property>
        <property name="jdbcPassword" value="123456"></property>
<!--        数据库表在生成时的依赖-->
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean>


</beans>

6、使用测试类生成23张数据表(这里默认使用resources下的activiti.cfg.xml)

//    使用activity工作流先生成数据库表:23张
    @Test
    void testCreateTable(){
//        使用xml生成activity工作流
        Logger logger = LoggerFactory.getLogger(RestTestApplicationTests.class);
//        获取activity提供的工具类
//        获取这个默认engine时就会自动创建数据库表
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        System.out.println(engine);

    }

7、使用流程表生成审批流程

// 1、部署流程
    @Test
    public void createActivityTask(){
        //获取默认的流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        processEngine.getRepositoryService()//得到库服务
                .createDeployment()//创建部署
                .name("askRest")
                .addClasspathResource("bmp/rest.bpmn20.xml") //导入流程图  !!!!一定要加bpmn20
                .addClasspathResource("bmp/rest.bpmn20.png")   //导入流程文件!!!!一定要加bpmn20
                .deploy();   //开始部署
    }

8、启用流程图生成的审批流程

//2、启用创建的流程图进行审批
@Test
    public void testStartProcessInstance(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //act_re_procdef表里的id,如果没生成,去看上一步,真是哔了狗
        processEngine.getRuntimeService()
                .startProcessInstanceById("myProcess_1:1:4");
    }

9、请假人发起申请

//3、请假人发出请假申请
@Test
    public void testAsk(){
//        获取activity7的引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//    查看act_ru_task表,然后把id给上,发起请假申请
    processEngine.getTaskService().complete("2505");

    }

10、老师查看审批流程

//    4、老师查看请假要求
@Test
public void queryTask(){
//        获得流引擎
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//    创造搜索,下面的teacher是我们在创建bpmn的时候写的assignee值
    List<Task> student = engine.getTaskService().createTaskQuery()
            .taskAssignee("office")
            .list();
    for (Task task : student) {
        System.out.println(task);
    }
}

11、老师通过审批,后续的审批一样了,都是通过10步的查询(改下teacher成要查询的人)然后进行审批

//5、班主任审批
@Test
public void testFinishTask_manager(){
//        获取流引擎
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//    这里的id是上面查询生成的请假申请id
    engine.getTaskService()
            .complete("10002");  //查看act_ru_task表,或者通过上面查询获得
}

执行几次10和11的操作后,如图:

activiti 导出java activiti7教程_activiti 导出java_05

补充一个maven库:

<?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.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zsp</groupId>
    <artifactId>rest-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rest-test</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>

    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</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-webflux</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>



        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>7.1.0.M6</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>7.1.0.M6</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jackson-core-asl</artifactId>
                    <groupId>org.codehaus.jackson</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-lang3</artifactId>
                    <groupId>org.apache.commons</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-lang3</artifactId>
                    <groupId>org.apache.commons</groupId>
                </exclusion>
            </exclusions>

        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.2</version>
        </dependency>
        <!--        mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.23</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!--        MP的代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!--        MP的代码生成器依赖-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>

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

</project>