二、生成的数据表说明
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目录下
(1)预约维修节点
(2)师傅上门维修节点
(3)公司电话回访节点
(4)查看评分节点
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实现的外部任务;
(3)说明:启动项目,登录驾驶舱查看,有这个工作流了,启动流程,如果没有外部任务去获取订阅这个启动的流程,流程就会一直卡在第一个Decide On Direction of Expansion节点上,无法往下执行,只有当启动订阅了这个主题的外部任务启动后,才会往下执行。