工作流-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版本暂时不能用

其他任务

子流程

嵌入子流程:

调用子流程:调用一个已经发布的流程

多实例

串行多实例:ex:动态顺序审批。m4版本不可用 6可以

并行多实例:ex:会签,多子流程业务

多实例任务完成条件:

实例总数:nrOfInstances
未完成实例数:nrOfActivieInstances
已完成实例数:nrOfCompletedInstances

完成条件设置:${nrOfCompletedInstances/nrOfInstances > 0.5}
posted @   Ranger-dev  阅读(488)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示