Camunda

一、Camunda教程
请点击此处
比上面还详细的教程

二、生成的数据表说明
1、总介绍
(1) act_re_*: 're'表示流程资源存储,这个前缀的表包含了流程定义和流程静态资源(图片,规则等),共5张表。
(2) act_ru_*: 'ru'表示流程运行时。 这些运行时的表,包含流程实例,任务,变量,Job等运行中的数据。 Camunda只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录, 这样运行时表的数据量最小,可以最快运行。共15张表。
(3)act_id_*: 'id'表示组织用户信息,比如用户,组等,共6张表。
(4)act_hi_*: 'hi'表示流程历史记录。 这些表包含历史数据,比如历史流程实例,变量,任务等,共18张表。
(5)act_ge_*: 'ge'表示流程通用数据, 用于不同场景下,共3张表。

2、每个表介绍
(1)流程资源存储类

  • act_re_case_def:CMMN案例管理模型定义表
  • act_re_decision_def:DMN决策模型定义表
  • act_re_decision_req_def :决策需求定义表
  • act_re_deployment:流程部署表
  • act_re_procdef:BPMN流程模型定义表

(2)流程运行类

  • act_ru_authorization:流程运行时权限授予的表(是否使用与是否开启"camunda.bpm.authorization.enabled" : "true" or "false"有关)
  • act_ru_batch:流程执行批处理表
  • act_ru_case_execution:CMMN案例运行执行表
  • act_ru_case_sentry_part:CMMN案例运行时哨兵部分表
  • act_ru_event_subscr:流程事件订阅表
  • act_ru_execution:BPMN流程运行时记录表(运行时流程执行实例表,与流程实例并不一样)
  • act_ru_ext_task:流程任务消息执行表(运行时外部任务信息表)
  • act_ru_filter:流程定义查询配置表(运行时过滤器表)
  • act_ru_identitylink:运行时流程人员表
  • act_ru_incident:运行时异常事件表(工作流引擎突发事件表)
  • act_ru_job:流程运行时作业表
  • act_ru_jobdef :流程作业定义表
  • act_ru_meter_log:流程运行时度量日志表
  • act_ru_task:流程运行时任务表(最常用的表之一,每一个流程实例开启后,到达的每一个task都会生成在这里,也就是任务实例)
  • act_ru_variable:流程运行时变量表(在开启流程实例或者在流程推进时传入的参数,在流程未结束前,都会存储在这里,但是并不是每个节点的变量变化都在这里,比如一个布尔值的confirm如果多次传入,这里也只会存在一个confirm,但是在act_hi_detail表中会有每个节点中confirm变化的值)

(3)用户信息类

  • act_id_group:审批组信息表
  • act_id_info:用户扩展信息表
  • act_id_membership:用户和审批组之间的关系的表
  • act_id_tenant:租户信息表
  • act_id_tenant_member:用户租户关系表
  • act_id_user:用户信息表

(4)流程历史记录类

  • act_hi_actinst:历史的活动实例表
  • act_hi_attachment:历史的流程附件表
  • act_hi_batch:历史的批处理记录表
  • act_hi_caseactinst:历史的CMMN活动实例表
  • act_hi_caseinst:历史的CMMN实例表
  • act_hi_comment:历史的流程审批意见表
  • act_hi_dec_in:历史的DMN变量输入表
  • act_hi_dec_out:历史的DMN变量输出表
  • act_hi_decinst:历史的DMN实例表,包含有关决策的单个评估的信息,包括输入和输出值
  • act_hi_detail:历史的流程运行时变量详情记录表
  • act_hi_ext_task_log:历史的流程任务消息执行表
  • act_hi_identitylink:历史的流程运行过程中用户关系
  • act_hi_incident:历史的流程异常事件记录表
  • act_hi_job_log:历史的流程作业记录表
  • act_hi_op_log:历史的用户操作记录表,包含有关用户执行的操作的信息的日志条目,这用于记录操作,如创建新任务、完成任务等
  • act_hi_procinst:历史的流程实例
  • act_hi_taskinst:历史的任务实例
  • act_hi_varinst:历史的流程变量记录表

(5)流程通用数据类

  • act_ge_bytearray:流程引擎二进制数据表
  • act_ge_property:流程引擎属性配置表
  • act_ge_schema_log:数据库脚本执行日志表

3、每个表中字段说明
(1)act_ge_bytearray(流程引擎二进制数据表)

  • id:主键
  • rev_:版本
  • name_:名称
  • deployment_id_:部署id
  • bytes_:字节内容
  • generated_:是否系统生成(0用户创建,null系统创建)
  • tenant_id_:租户id
  • type_:类型
  • create_time_:创建时间
  • root_proc_inst_id_:流程实例根id
  • removal_time_:删除时间

(2)act_ge_property(流程引擎属性配置表)

  • name_:名称
  • value_:值
  • rev_:版本

(3)act_ge_schema_log(数据库脚本执行日志表)

  • id_:主键
  • timestamp_:时间戳
  • version_:版本

(4)act_hi_actinst(历史的活动实例表)

  • id_:主键
  • parent_act_inst_id_:父节点实例id
  • proc_def_key_:流程定义key
  • proc_def_id_:流程定义id
  • root_proc_inst_id_:流程实例根id
  • proc_inst_id_:流程实例id
  • execution_id_:执行实例id
  • act_id_:节点id
  • task_id_:任务id
  • call_proc_inst_id_:调用外部的流程实例id
  • call_case_inst_id_:调用外部的案例实例id
  • act_name_:节点名称
  • acr_type_:节点类型
  • assignee_:办理人
  • start_time_:开始时间
  • end_time_:结束时间
  • duration_:耗时
  • act_inst_state_:活动实例状态
  • sequence_counter_:序列计数器
  • tenant_id_:租户id
  • removal_time_:删除时间

(5)act_hi_comment(历史流程审批意见表)

  • id_:主键
  • type_:类型
  • time_:时间
  • user_id_:处理人id
  • task_id_:任务id
  • root_proc_inst_id_:流程实例根id
  • proc_inst_id_:流程实例id
  • action_:行为类型
  • messages_:基本内容
  • full_msg_:全部内容
  • tenant_id_:租户id
  • removal_time_:删除时间

(6)act_hi_detail(历史的流程运行详情表)

  • id:主键
  • type_:类型
  • proc_def_key_:流程定义key
  • proc_def_id_:流程定义id
  • root_proc_inst_id_:流程实例根id
  • proc_inst_id_:流程实例id
  • execution_id_:流程执行id
  • case_def_key_:案例定义key
  • case_def_id_:案例定义id
  • case_inst_id_:案例实例id
  • case_execution_id_:案例执行id
  • task_id_:任务id
  • act_inst_id_:节点实例id
  • var_inst_id_:流程变量记录id
  • name_:名称
  • var_type_:变量类型
  • rev_:版本
  • time_:时间戳
  • bytearray_id_:二进制数据对应id
  • double_:double类型值
  • long_:long类型值
  • text_:文本类型值
  • text2_:文本类型值2
  • sequence_counter_:序列计数器
  • tenant_id_:租户id
  • operation_id_:操作id
  • removal_time_:删除时间

(7)act_hi_identitylink(历史的流程运行过程中用户表)

  • id_:主键
  • timestamp_:时间戳
  • type_:类型
  • user_id_:用户id
  • group_id_:用户组id
  • task_id_:任务id
  • root_proc_inst_id_:流程实例根id
  • proc_def_id_:流程定义id
  • operation_type_:操作类型
  • assigner_id_:分配者id
  • proc_def_key_:流程定义key
  • tenant_id_:租户id
  • removal_time_:删除时间

(8)act_hi_procinst(历史的流程实例表)

  • id_:主键
  • proc_inst_id_:流程实例id
  • business_key_:业务key
  • proc_def_key_:流程定义key
  • pro_def_id_:流程定义id
  • start_time_:开始时间
  • end_time_:结束时间
  • removal_time_:删除时间
  • duration_:耗时
  • start_user_id_:启动人id
  • start_act_id_:启动节点id
  • end_act_id_:结束节点
  • super_process_instance_id_:父流程实例id
  • root_proc_inst_id_:流程实例根id
  • super_case_instance_id_:父案例实例id
  • case_inst_id_:案例实例id
  • delete_reason_:删除原因
  • tenant_id_:租户id
  • state_:状态

(9)act_hi_taskinst(历史的任务实例表)

  • id_:主键
  • task_def_key_:任务定义key
  • proc_def_key_:流程定义key
  • proc_def_id_:流程定义id
  • root_proc_inst_id_:流程实例根id
  • proc_inst_id_:流程实例id
  • execution_id_:流程执行id
  • case_def_key_:案例定义key
  • case_def_id_:案例定义id
  • case_inst_id_:案例实例id
  • case_execution_id_:案例执行id
  • act_inst_id_:节点实例id
  • name_:名称
  • parent_task_id_:父任务id
  • description_:描述
  • owner_:委托人id
  • assignee_:办理人id
  • start_time_:开始时间
  • end_time_:结束时间
  • duration_:耗时
  • delete_reason_:删除原因
  • priority_:优先级
  • due_date_:超时时间
  • follow_up_date_:跟踪时间
  • tenant_id_:租户id
  • removal_time_:删除时间

(10)act_hi_varinst(历史的流程变量表)

  • id_:主键
  • proc_def_key_:流程定义key
  • proc_def_id_:流程定义id
  • root_proc_inst_id_:流程实例根id
  • proc_inst_id:流程实例id
  • execution_id_:流程执行id
  • act_inst_id:节点实例id
  • case_def_key_:案例定义key
  • case_def_id_:案例定义id
  • case_inst_id_:案例实例id
  • case_execution_id_:案例执行id
  • task_id_:任务id
  • name_:名称
  • var_type_:变量类型
  • create_time_:创建时间
  • rev_:版本
  • bytearrary_id_:二进制数据id
  • double_:double类型值
  • long_:long类型值
  • text_:文本类型值
  • text2_:文本类型值2
  • tenant_id_:租户id
  • state_:状态
  • removal_time_:删除时间

(11)act_id_user(用户表)

  • id_:主键
  • rev_:版本
  • first_:姓
  • last_:名
  • emall_:邮件
  • pwd_:密码
  • salt_:盐值
  • lock_exp_time_:锁定过期时间
  • attempts_:尝试次数
  • picture_id_:图片id

(12)act_id_group(群组表)

  • id_:主键
  • rev_:版本
  • name_:组名称
  • type_:组类型(SYSTEM系统、WORKFLOW业务)

(13)act_id_membership(用户与群组关系表)

  • user_id_:用户id
  • group_id_:组id

(14)act_re_deployment(流程部署表)

  • id_:主键
  • name_:流程名称
  • deploy_time_:部署时间
  • source_:来源
  • tenant_id_:租户id

(15)act_re_procdef(流程定义表)

  • id_:主键
  • rev_:版本
  • category_:流程定义的Namespace分类
  • name_:流程定义名称
  • key_:流程定义key
  • version_:流程定义版本号
  • deployment_id_:部署id
  • resource_name_:资源名称
  • dgrm_resource_name_:gram资源名称
  • has_start_form_key_:是否有启动表单
  • suspension_state_:流程挂起
  • tenant_id_:租户id
  • version_tag_:版本标签
  • startable_:是否是可启动流程

(16)act_ru_event_subscr(流程事件订阅表)

  • id_:主键
  • rev_:版本
  • event_type_:事件类型
  • event_name_:事件名称
  • execution_id_:执行id
  • pro_inst_id:流程实例id
  • activity_id_:节点id
  • configuration_:配置
  • created_:创建时间
  • tenant_id_:租户id

(17)act_ru_execution(流程运行时表)

  • id_:主键
  • rev_:版本
  • root_proc_inst_id_:流程实例根id
  • proc_inst_id_:流程实例id
  • business_key_:业务key
  • parent_id_:流程父实例id
  • proc_def_id_:流程定义id
  • super_exec_:父流程实例对应的执行
  • super_case_exec_:父案例实例对应的执行
  • case_inst_id_:案例实例id
  • act_id_:节点id
  • act_inst_id:节点实例id
  • is_active_:是否激活
  • is_concurrent_:是否并行
  • is_scope_是否多实例范围
  • is_event_scope_:是否事件多实例范围
  • suspension_state_:挂起状态
  • cached_ent_state_:缓存状态
  • sequence_counter_:序列计数器
  • tenant_id_:租户id

(18)act_ru_identitylink(流程运行时表)

  • id_:主键
  • rev_:版本
  • group_id_:用户组id
  • type_:类型
  • user_id_:用户id
  • task_id_:任务id
  • proc_def_id_:流程定义id
  • tenant_id_:租户id

(19) act_ru_incident( 运行时异常记录表)

  • id_:主键
  • rev_:版本
  • incident_timestamp_:事件时间戳
  • incident_msg_:事件信息
  • incident_type_:事件类型
  • execution_id_:流程执行id
  • activity_id_:节点id
  • proc_inst_id_:流程实例id
  • proc_def_id_:流程定义id
  • cause_incident_id_:事件原因id
  • root_cause_incident_id_:事件原因根id
  • configuration_:事件配置
  • tenant_id_:租户id
  • job_def_id_:job定义id

(20)act_ru_job( 流程运行时作业表)

  • id_:主键
  • rev_:版本
  • type_:类型
  • lock_exp_time_:锁定过期时间
  • lock_owner_:锁定用户
  • exclusive_:独占标识
  • execution_id_:执行id
  • process_instance_id_:流程实例id
  • process_def_id_:流程定义id
  • process_def_key_:流程定义key
  • retries_:重试次数
  • exception_stack_id_:异常堆栈id
  • exception_msg_:异常信息
  • duedate_:截止时间
  • repeat_:重复
  • handler_type_:处理类型
  • handler_cfg_:处理配置
  • deployment_id_:部署id
  • suspension_state_:挂起状态
  • job_def_id_:作业定义id
  • priority_:作业优先级
  • sequence_counter_:序列计数器
  • tenant_id:租户id
  • create_time_:创建时间

(21)act_ru_jobdef( 流程作业定义表)

  • job_type_:job类型
  • job_configuration_:job配置
  • suspension_state_:挂起状态
  • job_priority:优先级

(22)act_ru_task( 流程运行时任务表)

  • execution_id_:流程执行id
  • proc_inst_id_:流程实例id
  • proc_def_id_:流程定义id
  • case_execution_id_:案例执行id
  • case_inst_id_:案例实例id
  • case_def_id_:案例定义id
  • parent_task_id_:父任务id
  • description_:描述
  • task_def_key_:任务定义key
  • owner_:委托人
  • assignee_:办理人
  • delegation:委托状态
  • priority_:优先级
  • due_date_:截止时间
  • follow_up_date_:跟踪时间
  • suspension_state_:挂起状态

(23)act_ru_variable( 流程运行时变量表)

  • execution_id_:流程执行id
  • proc_inst_id_:流程实例id
  • case_exrcution_id_:案例执行id
  • case_inst_id_:案例实例id
  • task_id_:任务id
  • bytearray_id_:二进制内容id
  • double_:double类型值
  • long_:long类型值
  • text_:文本
  • text2:文本2
  • var_scope_:变量范围
  • sequence_counter_:序列计数器
  • is_concurrent_local_:是否并发

三、springboot集成camunda部署教程以及说明
1、创建springboot项目,并且导入依赖

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zjy.workflow</groupId>
    <artifactId>camunda-springboot-testdemo</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.7.9</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.camunda.bpm</groupId>
                <artifactId>camunda-bom</artifactId>
                <version>7.19.0</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <!--  流程引擎 在Rest服务接口的依赖中有了-->
<!--        <dependency>-->
<!--            <groupId>org.camunda.bpm.springboot</groupId>-->
<!--            <artifactId>camunda-bpm-spring-boot-starter</artifactId>-->
<!--            <version>7.17.0</version>-->
<!--        </dependency>-->

        <!--  Rest服务接口-->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
        </dependency>

        <!--  web界面模块,就是那个驾驶舱登录界面,不需要可以不导入-->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
        </dependency>

        <dependency>
            <groupId>org.camunda.bpm</groupId>
            <artifactId>camunda-engine-plugin-spin</artifactId>
        </dependency>

        <dependency>
            <groupId>org.camunda.spin</groupId>
            <artifactId>camunda-spin-dataformat-all</artifactId>
        </dependency>

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

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

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.12</version>
        </dependency>

        <!--mysql-->
<!--        <dependency>-->
<!--          <groupId>mysql</groupId>-->
<!--          <artifactId>mysql-connector-java</artifactId>-->
<!--          <version>5.1.47</version>-->
<!--        </dependency>-->

        <!--postgresql-->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.21</version>
        </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-log4j2</artifactId>
            <version>2.6.1</version>
        </dependency>
    </dependencies>

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

</project>

2、创建application.yml

server:
  port: 8088

spring:
  application:
    name: camunda-springboot-testdemo
  datasource:
    # postgresql
    url: jdbc:postgresql://192.168.126.130:5432/postgres?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useSSL=false
    type: com.alibaba.druid.pool.DruidDataSource
    username: postgres
    password: root
    driver-class-name: org.postgresql.Driver
  sql:
    init:
      mode: always

    # mysql
#    url: jdbc:mysql://39.103.217.57:3306/camunda2?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&useOldAliasMetadataBehavior=true
#    driver-class-name: com.mysql.jdbc.Driver
#    username: root
#    password: root

camunda:
  bpm:
    admin-user:
      id: demo
      password: demo
    auto-deployment-enabled: false # 关闭springboot继承好的自动部署功能

3、创建日志输出log4j2.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--monitorInterval属性值(秒数)为一个非零值来让Log4j每隔指定的秒数来重新读取配置文件,可以用来动态应用Log4j配置-->
<Configuration status="debug" monitorInterval="30">
    <!--用来自定义一些变量-->
    <Properties>
        <!--变量定义-->
        <Property name="myPattern" value="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<!--        <Property name="dir_url">d:/logs</Property>-->
    </Properties>
    <!--使用Appenders元素可以将日志事件数据写到各种目标位置-->
    <Appenders>
        <!-- 默认打印到控制台 -->
        <Console name="ConsoleAppend" target="SYSTEM_OUT">
            <!-- 默认打印格式 -->
            <PatternLayout pattern="${myPattern}"/>
        </Console>
        <!-- 打印到日志文件上 -->
<!--        <File name="FileAppend" fileName="${dir_url}/fileLog.log" bufferedIO="true" immediateFlush="true">-->
<!--            <PatternLayout>-->
<!--                <pattern>${myPattern}</pattern>-->
<!--            </PatternLayout>-->
<!--        </File>-->
    </Appenders>
    <!--定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <Loggers>
        <!-- 默认打印日志级别为 error -->
        <Root level="INFO">
            <AppenderRef ref="ConsoleAppend"/>
            <AppenderRef ref="FileAppend"/>
        </Root>
    </Loggers>
</Configuration>

4、使用流程设计器,设计一个bpmn流程,并保存到resources目录下


image.png

image.png

(1)预约维修节点


image.png

(2)师傅上门维修节点
image.png

(3)公司电话回访节点
image.png

(4)查看评分节点


image.png

5、创建service
(1)预约维修节点
package com.zjy.workflow.service;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Service;

/**
 * @创建人 zjy
 * @文件名 ReserveRepairService
 * @创建时间 2023/10/20
 * @描述 预约维修
 */
@Service
public class ReserveRepairService implements JavaDelegate {

    private final Logger logger = LogManager.getLogger(ReserveRepairService.class);

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        logger.info("进入到预约家电维修环节~");
        String currentActivityName = execution.getCurrentActivityName();
        String currentActivityId = execution.getCurrentActivityId();
        logger.info("当前活动名称:" + currentActivityName + "\n当前活动id:" + currentActivityId);
    }
}

(2)师傅上门维修节点

package com.zjy.workflow.service;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Service;

/**
 * @创建人 zjy
 * @文件名 DoingRepairService
 * @创建时间 2023/10/23
 * @描述 师傅上门维修
 */
@Service("doRepair")
public class DoingRepairService implements JavaDelegate {

    private final Logger logger = LogManager.getLogger(DoingRepairService.class);

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        logger.info("进入到师傅上门维修环节~");
        String currentActivityName = execution.getCurrentActivityName();
        logger.info("当前活动名:" + currentActivityName);
        execution.setVariable("repairName","小王");
    }
}

(3)公司电话回访和查看评分节点

package com.zjy.workflow.service;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Service;

/**
 * @创建人 zjy
 * @文件名 TelCallService
 * @创建时间 2023/10/23
 * @描述 公司电话回访和查看评分
 */
@Service("telCall")
public class TelCallService {

    private final Logger logger = LogManager.getLogger(TelCallService.class);

    // 公司电话回访
    public int doCall(DelegateExecution execution) {
        logger.info("公司电话回访~");
        Object repairName = execution.getVariable("repairName");
        logger.info("您对" + repairName.toString() + "打了几分?");
        logger.info("您对" + String.valueOf(repairName) + "打了几分?");
        return 10;
    }

    // 查看评分
    public void getScore(DelegateExecution execution) {
        logger.info("查看评分~");
        String s = String.valueOf(execution.getVariable("repairName"));
        Object score = execution.getVariable("score");
        logger.info("顾客对" + s + "的评分:" + (int)score);
    }
}

6、创建controller

package com.zjy.workflow.controller;

import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/flow")
public class FlowController {

    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private RuntimeService runtimeService;

    // 说明:springboot项目在依赖camunda-bpm-spring-boot-starter中已经实现了自动部署的功能,
    // 所以我们不用在执行下面的controller方法去手动部署流程了,在启动项目的时候,springboot项目
    // 会自动帮我们部署好resources目录下的所有流程
    @GetMapping("/deploy")
    public String deplopy(){
        Deployment deploy = repositoryService.createDeployment()
                .name("部署的第一个流程") // 定义部署文件的名称
                .addClasspathResource("LoanApproval.bpmn") // 绑定需要部署的流程文件
                .deploy();// 部署流程
        return deploy.getId() + ":" + deploy.getName();
    }

    @GetMapping("/startFlow/{processKey}")
    public void startFlow(@PathVariable String processKey) {
        runtimeService.startProcessInstanceByKey(processKey); // 这里的方法是ByKey!
    }
}

7、启动项目测试。
8、部署说明
说明:有三种部署方式。
(1)代码方法(手动部署)

@Autowired
private RepositoryService repositoryService;

 @GetMapping("/deploy")
    public String deplopy(){
        Deployment deploy = repositoryService.createDeployment()
                .name("部署的第一个流程") // 定义部署文件的名称
                .addClasspathResource("LoanApproval.bpmn") // 绑定需要部署的流程文件
                .deploy();// 部署流程
        return deploy.getId() + ":" + deploy.getName();
    }

(2)通过依赖camunda-bpm-spring-boot-starter自动部署
导入依赖

<dependency>
           <groupId>org.camunda.bpm.springboot</groupId>
          <artifactId>camunda-bpm-spring-boot-starter</artifactId>
          <version>7.17.0</version>
</dependency>

启动项目,就自动将resources目录下的所有流程部署好了。
可以通过修改配置来关闭自动部署:

camunda:
  bpm:
      auto-deployment-enabled: false # 关闭自动部署

(3)使用processes.xml配置文件实现自动部署
在resources目录下新建META-INF目录,在META-INF目录下新建processes.xml

<process-application
        xmlns="http://www.camunda.org/schema/1.0/ProcessApplication"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <process-archive>
        <process-engine>default</process-engine>
        <!-- 默认会扫描resource(及其子目录下)的*.bpmn, *.cmmn, *.dmn文件 -->
        <!-- 可通过<resource/>指定其他的需要一同部署的资源文件-->
        <!-- 注:formKey中路径需和resource路径一致,如:camunda-forms:deployment:bpmn/payment_confirm.form -->
        <!-- 注:通过Modeler作为附件一起部署,formKey格式为:camunda-forms:deployment:payment_confirm.form -->
        <!--<resource>bpmn/PaymentInitForm.form</resource>
        <resource>bpmn/PaymentConfirmForm.form</resource>-->
        <properties>
            <property name="isDeleteUponUndeploy">false</property>
            <property name="isScanForProcessDefinitions">true</property>
        </properties>
    </process-archive>
</process-application>

然后在项目启动类上使用注解 @EnableProcessApplication,启动项目,也可以把resources目录下的所有流程成功部署。
注意:使用processes.xml配置文件实现自动部署,必须使用注解 @EnableProcessApplication 才能生效,不然不会自动部署。

9、节点参数介绍
(1)Service Task(自动执行节点)
1)Implementation
a. Java Class
需要实现JavaDelegate接口,并将实现了JavaDelegate接口的类的全路径填写到Java class一栏;
b. Delegate expression
需要实现JavaDelegate接口,然后将实现了JavaDelegate接口的类使用注解注入到容器中(可以起个别名),然后将类的名字开头变小写填入Delegate expression一栏(如果使用了别名,就填别名),它会自动执行execute的方法;
c. Expression
将类注入到容器中(可以起个别名),类中方法的参数为DelegateExecution execution,然后在Expression一栏填入类名开头变小写.方法名(execution),Result variable为方法的返回值变量名;
a、b、c填入例子可以查看上面部署流程。
(2)并行
1)nrOfActiviteInstances:当前活动的实例数量,即还没有完成的实例数量;
2)loopCounter:循环计数器,办理人在列表中的索引;
3)nrOfInstances:多实例任务中总共的实例数;
4)nrOfCompletedInstances:已经完成的实例数量。
可以通过设置Completion Condition 为${nrOfCompletedInstances == 2}表示任意两个人完成审批。

10、流程执行过程说明
每个节点执行时,都会先执行下一个节点的User assignment、Task listeners等,目的是将设置好的数据,比如下一个节点审批人,审批策略等传给前端。

四、外部任务订阅
1、项目git地址:https://gitee.com/zuo-junyuan/camunda.git
2、项目介绍
(1)bpmn是:RomeInvades.bpmn,在src/main/resources/bpmn/zjy/RomeInvades.bpmn;
(2)只实现三个业务节点,最后那个用户节点没有去实现(主要针对的是业务节点的外部任务实现),第一个业务是Decide On Direction of Expansion,是使用nodejs实现的外部任务;

Snipaste_2024-01-14_14-37-47.png

Snipaste_2024-01-14_14-39-51.png

(3)说明:启动项目,登录驾驶舱查看,有这个工作流了,启动流程,如果没有外部任务去获取订阅这个启动的流程,流程就会一直卡在第一个Decide On Direction of Expansion节点上,无法往下执行,只有当启动订阅了这个主题的外部任务启动后,才会往下执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容