工作流-Activiti7
SpringBoot和Activiti7
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M4</version>
</dependency>
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.1.0.M4</version>
<type>pom</type>
</dependency>
- 运行后没有生成数据库表,在数据库访问的JDBC URL上添加配置:nullCatalogMeansCurrent=true
在使用mysql-connect 8.+以上版本的时候需要添加
nullCatalogMeansCurrent=true
参数,否则在使用mybatis-generator生成表对应的xml等时会扫描整个服务器里面的全部数据库中的表,而不是扫描对应数据库的表。因此mysql会扫描所有的库来找表,如果其他库中有相同名称的表,activiti就以为找到了,本质上这个表在当前数据库中并不存在。
- 调用接口是报缺少字段Activiti自身问题。
alter table ACT_RE_DEPLOYMENT add column PROJECT_RELEASE_VERSION_ varchar(255) DEFAULT NULL;
alter table ACT_RE_DEPLOYMENT add column VERSION_ varchar(255) DEFAULT NULL;
流程部署/流程定义/流程实例
流程部署:act_ge_bytearray,act_re_deployment
流程定义:act_re_procdef
运行时流程执行实例:act_ru_execution
任务
任务:act_ru_task
运行时参与人员节点:act_ru_identitylink
流程变量:act_ru_variable
历史
历史记录:act_hi_*
流程网关
- 排他网关 (x) ——只有一条路径会被选择。
- 流程执行到该网关时,按照输出流的顺序逐个计算,当条件的计算结果为true时,继续执行当前网关的输出流;如果多条线路计算结果都是 true,则会执行第一个值为 true 的线路。如果所有网关计算结果没有true,则引擎会抛出异常。
- 排他网关需要和条件顺序流结合使用,default 属性指定默认顺序流,当所有的条件不满足时会执行默认顺序流。
- 并行网关 (+) ——所有路径会被同时选择。
- 拆分 —— 并行执行所有输出顺序流,为每一条顺序流创建一个并行执行线路。
- 合并 —— 所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行。
- 包容网关 (+) —— 可以同时执行多条线路,也可以在网关上设置条件
- 拆分 —— 计算每条线路上的表达式,当表达式计算结果为true时,创建一个并行线路并继续执行
- 合并 —— 所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行。
- 事件网关 (+) —— 专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件。当流程执行到事件网关后,流程处于等待状态,需要等待抛出事件才能将等待状态转换为活动状态。
新特性API
spring security 登录且对应要有这些角色
@PreAuthorize("hasRole('ACTIVITI_USER')")
@PreAuthorize("hasRole('ACTIVITI_ADMIN')")
ProcessRuntime
ProcessAdminRuntime
关闭SpringSecurity
@SpringBootApplication(
exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class
}
)
=====
import cn.hutool.core.collection.CollUtil;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import java.util.Collection;
/**
* Activiti7 在获取代办任务 对于多个候选人 查询 需要这个UserDetailsService
* 定义执行人使用的是userId
*
* @author ranger
*/
@Component
public class UserDetailsServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return new UserDetails() {
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// 添加流程角色
return CollUtil.newArrayList();
}
@Override
public String getPassword() {
return null;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
};
}
}
异常捕获
@Slf4j
@ControllerAdvice
public class BpmnExceptionHandler {
@ExceptionHandler({ActivitiException.class})
@ResponseBody
public ServerResponse<?> handle(HttpServletRequest request, ActivitiException e) {
log.error("请求路径 {}, 业务异常: {}", request.getRequestURI(), e);
return ServerResponse.createErrorMsg(StrUtil.removePrefix(e.getMessage(), "Exception while invoking TaskListener: Exception while invoking TaskListener: "));
}
}
监听器
-
执行监听器(ExecutionListener):可以获取流程实例相关数据。 ex:存储读取流程变量,处理业务信息,记录流程耗时
-
任务监听器(TaskListener):可以获取任务相关数据 。 ex: 指定执行人,记录任务耗时,发送通知
-
字段注入
// 注入字段 status和配置的要一样
private Expression status;
log.info("注入字段:{}", status.getValue(execution));
定时事件
act_ru_timer_job
## 配置文件
activiti:
async-executor-activate: true 7默认开启 5/6默认是关闭的
- 指定日期开启流程实例 (定时启动M4版本会报错 可以使用中间事件代替)
- 超时任务未处理提醒 (定时非中断:生成新任务)
- 超时任务指定其他执行人处理。 ex 3天未审核则直接完成 或者 由其他人处理 (定时中断:直接跳过那个任务 转办)
定时事件类型
- Time date:日期,什么时候触发 ex:2021-08-10T10:23:30
- Time duration: 持续延时多长时间后触发
- Time cycle: 循环
信号事件
- 抛出事件:抛出一个信号
- 捕获事件:捕获一个信号。启动后续流程
常用于多流程协调 流程1抛出信号 流程2捕获信号后启动
消息事件
act_ru_event_subscr
消息事件是单点
信号事件是广播
ex: 撤回任务
注意:使用任务监听器记录可以撤回的节点名称和消息名称
错误事件
ex: 一般用于服务任务出现异常后执行
// 代码触发
throw new BpmnError("Error_3em16m0");
错误开始事件只能在事件子流程中被定义
补偿事件
m4版本暂时不能用
补偿事件特点:任务到达时激活;流程实例结束时挂起;子流程需要任务到达补偿事件才能激活
取消事件
m4版本暂时不能用
其他任务
- 手工任务:一个空节点,什么都不做。有些任务需要线下处理,但是需要在系统中体现这个流程
- 服务任务:自动执行, 需要执行类。实现org.activiti.engine.delegate.JavaDelegate; ex:短信通知
- 脚本任务:Activiti脚本任务(ScriptTask) - Jesai - 博客园 (cnblogs.com)
- 业务规则任务:Activiti 规则任务(businessRuleTask) - Jesai - 博客园 (cnblogs.com)
- 接受任务:Activiti接受任务(receiveTask) - Jesai - 博客园 (cnblogs.com)
- 邮件任务:7基于轻量化考虑去掉了,建议使用服务任务代替
子流程
嵌入子流程:
调用子流程:调用一个已经发布的流程
多实例
串行多实例:ex:动态顺序审批。m4版本不可用 6可以
并行多实例:ex:会签,多子流程业务
多实例任务完成条件:
实例总数:nrOfInstances
未完成实例数:nrOfActivieInstances
已完成实例数:nrOfCompletedInstances
完成条件设置:${nrOfCompletedInstances/nrOfInstances > 0.5}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)