前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021年了,该学会使用activiti了

2021年了,该学会使用activiti了

作者头像
柏炎
发布2022-08-23 14:06:51
6720
发布2022-08-23 14:06:51
举报
文章被收录于专栏:深入浅出java后端

一.Activiti介绍

https://blog.csdn.net/zhou920786312/article/details/77848479

二.Activiti 23张表及7大服务详解

https://www.jianshu.com/p/684e11224c9b

三.idea中bpmn编辑器

3.1.工具安装

https://www.jianshu.com/p/8e3fba49b4a2

3.2.常用task介绍

task类型

task名称

task介绍

userTask

用户任务

用户介入执行节点

serviceTask

服务任务

自动执行节点

scriptTask

脚本任务

执行脚本节点

callActivitiTask

子流程任务

调用子流程

3.3.常见task配置参数介绍

3.3.1.通用参数介绍

参数

介绍

参考url

id

节点id

name

节点名称

documentation

流程节点描述信息

Asynchronous

是否异步延续

https://blog.csdn.net/qq_30908729/article/details/103774816

Exclusive

排他配置,保证当前任务执行时不会有并行任务

Multi Instance

多实例会签

https://www.pianshen.com/article/98201238352/

Task Listeners

任务监听器

https://blog.csdn.net/qq_19734597/article/details/87626996

Execution Listeners

执行监听器

https://blog.csdn.net/iflow/article/details/9663055

3.3.2.userTask参数

参数

介绍

参考url

Assignee

流程指派人

Candidate Users

能够操作的用户列表

Candidate Groups

能够操作节点的用户组

Due Date

到期时间

https://blog.csdn.net/weixin_39102174/article/details/103592491

From Key

获取任务节点需要展示的页面

http://t.zoukankan.com/cxyj-p-3896195.html

Priority

用户节点优先级,用于查询优先级排序

Form

标签属性,参数列表

https://blog.csdn.net/whatlookingfor/article/details/52998861/

3.3.3.serviceTask参数

参数

介绍

参考url

Fields

元素属性,serviceTask表单内字段值解析

Type/Class

调用的java方法与类型

https://blog.csdn.net/qq_19734597/article/details/87625155

3.3.4.scriptTask参数

参数

介绍

参考url

Script

脚本内容

Script Format

脚本类型

3.3.5.callActivitiTask参数

参数

介绍

参考url

Input Parameters

子流程入参

Output Parameters

子流程出参

四.SpringBoot接入Activiti7

4.1.POM

代码语言:javascript
复制
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M1</version>
</dependency>
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-image-generator</artifactId>
    <version>7.1.0.M1</version>
</dependency>

4.2.配置文件

4.2.1.增加配置

代码语言:javascript
复制
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/workflow?nullCatalogMeansCurrent=true
    driver-class-name: com.mysql.cj.jdbc.Driver
  activiti:
    database-schema-update: true
    history-level: activity
    db-history-used: true
    async-executor-activate: true

4.2.2.配置说明

https://blog.csdn.net/qq_21770005/article/details/79009272

4.3.关闭spring-security鉴权

activiti默认引入了spring-security进行权限校验,分布式系统鉴权通常维护在用户中心与网关中,因此在spring启动时需要排除。本地联调也可以进行排除,方便接口测试。

代码语言:javascript
复制
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class,
        ManagementWebSecurityAutoConfiguration.class})

4.4.activiti常规api使用手册

https://blog.csdn.net/zhou920786312/category_7149217.html

5.activiti应用

5.1.serviceTask执行节点

serviceTask在activity中定义为自动执行节点,将会根据documentation中的定义进行与流程变量进行入参与出参的数据组合

5.1.1.继承JavaDelegate编写代理类

代码语言:javascript
复制
@Scope("prototype")
@Component
@Slf4j
@Data
public class TestServiceDelegate implements JavaDelegate {

    private Expression expression;

    private List<Map<Object,Object>> expression1;

    @Override
    public void execute(DelegateExecution execution) {
        if(Objects.nonNull(expression)){
            log.info("参数:"+expression.toString());
        }
        log.info("进入serviceTask:"+execution.getEventName());
    }

}

5.1.2.bpmn文件serviceTask节点配置

代码语言:javascript
复制
<serviceTask activiti:exclusive="true" id="_5" name="服务节点" activiti:delegateExpression="${testServiceDelegate}"/>

5.1.3.说明

当流程节点到达serviceTask节点时,会自动调用自动以代理类的execute方法进行逻辑处理

5.2.taskListener与executionListener

listener用于监听当前节点执行到达此节点时,流程执行,流程执行后,对应触发的相应的逻辑。 用法类似,以下以executionListener为例

5.2.1.实现ExecutionListener接口

代码语言:javascript
复制
@Component
@Slf4j
public class TestExecutionListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
         log.info("进入ExecutionListener:"+execution.getEventName());
    }
}

5.2.2.bpmn文件配置

代码语言:javascript
复制
<serviceTask activiti:exclusive="true" id="_5" name="服务节点" activiti:delegateExpression="${testServiceDelegate}">
  <extensionElements>
    <activiti:executionListener class="com.baiyan.workflow.demo.TestExecutionListener" event="start"/>
  </extensionElements>
</serviceTask>

5.2.3.说明

对于executionListener配置event为start,则在当前节点执行serviceTask逻辑前,将会先执行listner中逻辑.

5.3.自定义行为类

activiti默认情况下执行节点逻辑都是依靠XXXXBehavior的类,由Behavior类再内部去执行相应的command类进行业务逻辑处理。在日常业务中比如ScriptTaskActivityBehavior,其中只支持默认的js与grovy脚本,并不支持python等脚本。因此此处需要重写默认的ScriptTaskActivityBehavior的scriptTask执行逻辑。

此处以重写ServiceTaskDelegateExpressionActivityBehavior为例,其余行为类均为同理处理逻辑

5.3.1.继承默认行为类

代码语言:javascript
复制
@Slf4j
public class BaiyanServiceTaskDelegateExpressionActivityBehavior extends ServiceTaskDelegateExpressionActivityBehavior {

    public BaiyanServiceTaskDelegateExpressionActivityBehavior(String serviceTaskId, Expression expression, Expression skipExpression, List<FieldDeclaration> fieldDeclarations) {
        super(serviceTaskId, expression, skipExpression, fieldDeclarations);
    }

    @Override
    public void execute(DelegateExecution execution) {
        log.info("进入重写的behavior:"+execution.getEventName());
        super.execute(execution);
    }
}

5.3.2.自定义行为工厂构建自定义behavior

代码语言:javascript
复制
public class BaiyanActivityBehaviorFactory extends DefaultActivityBehaviorFactory {

    @Override
    public ServiceTaskDelegateExpressionActivityBehavior createServiceTaskDelegateExpressionActivityBehavior(ServiceTask serviceTask) {
        Expression delegateExpression = expressionManager.createExpression(serviceTask.getImplementation());
        return createServiceTaskBehavior(serviceTask,
                delegateExpression);
    }

    private ServiceTaskDelegateExpressionActivityBehavior createServiceTaskBehavior(ServiceTask serviceTask,
                                                                                    Expression delegateExpression) {
        return new BaiyanServiceTaskDelegateExpressionActivityBehavior(serviceTask.getId(),
                delegateExpression,
                getSkipExpressionFromServiceTask(serviceTask),
                createFieldDeclarations(serviceTask.getFieldExtensions()));
    }
}

5.3.3.在spring的配置类中加载工厂

代码语言:javascript
复制
@Component
public class BehaviorProcessEngineConfigurationConfigurer implements ProcessEngineConfigurationConfigurer {

    @Override
    public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
        BaiyanActivityBehaviorFactory BaiyanActivityBehaviorFactory = new BaiyanActivityBehaviorFactory();
        processEngineConfiguration.setActivityBehaviorFactory(BaiyanActivityBehaviorFactory);
    }

}

5.3.4.说明

上面重写serviceTask,当流程节点执行serviceTask节点时,则会默认打印出上述的日志,进入behavior

5.4.命令拦截器CommandInterceptor

activiti所有业务逻辑的执行均依靠command来完成,类似于controller接口来完成业务逻辑处理,现在想在业务逻辑执行前后加入一些额外处理,则可实现CommandInterceptor接口完成对command命令的前置与后置处理。类似于spring的拦截器

5.5.事件监听ActivitiEventListener

针对于某些特定的节点事件做一下异步处理,类似于spring的事件监听与发布

5.6.异步任务

日常业务中产生大量的流程节点需要进行执行,如果同步执行,那流程将会阻塞,而且效率也不高。因此在activiti中支持了异步执行流程。

5.6.1.bpmn配置

异步执行节点增加配置

代码语言:javascript
复制
    <serviceTask activiti:exclusive="true" id="_5" activiti:async="true"name="自动执行节点汇聚点" activiti:delegateExpression="${testServiceDelegate}"/>

5.6.2.spring配置

代码语言:javascript
复制
spring:
  activiti:
    async-executor-activate: true 

5.6.3.说明

当如上配置完成后,流程发布后,进入到对应的节点执行时,会在ACT_RU_JOB节点任务表中插入一条数据,activiti定时任务触发扫描次表内的数据,对表内的任务进行捞取,加上过期时间与owner字段的锁,等待执行的线程池进行任务执行。此处的口子开放了activiti在多实例时多任务的处理能力。

5.6.4.部分源码解析

https://blog.csdn.net/u013747658/article/details/83660849

此处加锁,流程节点数据流转均为基于mysql数据库,如果需要极致的高性能,需要转换为缓存去实现,具体实现方式待探索

6.常用任务节点执行顺序

6.1.userTask

节点上增加taskListenter,ExecutionListener

代码语言:javascript
复制
<userTask activiti:assignee="左审批" activiti:exclusive="true" id="_3" name="左审批">
  <extensionElements>
    <activiti:taskListener class="com.baiyan.workflow.demo.TestTaskListener" event="create"/>
    <activiti:taskListener class="com.baiyan.workflow.demo.TestTaskListener" event="assignment"/>
    <activiti:taskListener class="com.baiyan.workflow.demo.TestTaskListener" event="complete"/>
    <activiti:executionListener class="com.baiyan.workflow.demo.TestExecutionListener" event="start"/>
    <activiti:executionListener class="com.baiyan.workflow.demo.TestExecutionListener" event="take"/>
    <activiti:executionListener class="com.baiyan.workflow.demo.TestExecutionListener" event="end"/>
  </extensionElements>
</userTask>

6.1.1.进入人工节点尚未执行

代码语言:javascript
复制
2021-03-19 16:22:59.015  INFO 95222 --- [nio-8080-exec-2] c.b.workflow.demo.TestExecutionListener  : 进入ExecutionListener:start
2021-03-19 16:22:59.179  INFO 95222 --- [nio-8080-exec-2] c.baiyan.workflow.demo.TestTaskListener  : 进入Tasklistener:assignment
2021-03-19 16:22:59.180  INFO 95222 --- [nio-8080-exec-2] c.baiyan.workflow.demo.TestTaskListener  : 进入Tasklistener:create

6.1.2.执行人工节点

代码语言:javascript
复制
2021-03-19 16:25:42.850  INFO 95222 --- [nio-8080-exec-4] c.baiyan.workflow.demo.TestTaskListener  : 进入Tasklistener:complete
2021-03-19 16:25:42.980  INFO 95222 --- [nio-8080-exec-4] c.b.workflow.demo.TestExecutionListener  : 进入ExecutionListener:end
2021-03-19 16:25:43.014  INFO 95222 --- [nio-8080-exec-4] c.b.workflow.demo.TestExecutionListener  : 进入ExecutionListener:start

6.2.serviceTask

节点上增加ExecutionListener,重写behavior,javaDelegate

代码语言:javascript
复制
<serviceTask activiti:exclusive="true" id="_5" name="自动执行节点汇聚点" activiti:delegateExpression="${testServiceDelegate}">
  <extensionElements>
    <activiti:field name="expression">
      <activiti:string><![CDATA[{"uri":"/get/assets","reqType":"get","tags":"deviceTags!终端安全","day":"$.day"}]]></activiti:string>
    </activiti:field>
    <activiti:executionListener class="com.baiyan.workflow.demo.TestExecutionListener" event="start"/>
    <activiti:executionListener class="com.baiyan.workflow.demo.TestExecutionListener" event="take"/>
    <activiti:executionListener class="com.baiyan.workflow.demo.TestExecutionListener" event="end"/>
  </extensionElements>
</serviceTask>

6.2.1.进入serviceTask节点尚未执行

代码语言:javascript
复制
2021-03-19 16:25:43.014  INFO 95222 --- [nio-8080-exec-4] c.b.workflow.demo.TestExecutionListener  : 进入ExecutionListener:start

6.2.2.serviceTask节点执行

代码语言:javascript
复制
2021-03-19 16:25:43.014  INFO 95222 --- [nio-8080-exec-4] ceTaskDelegateExpressionActivityBehavior : 进入重写的behavior
2021-03-19 16:25:43.083  INFO 95222 --- [nio-8080-exec-4] c.b.workflow.demo.TestServiceDelegate    : 参数:{"uri":"/get/assets","reqType":"get","tags":"deviceTags!终端安全","day":"$.day"}
2021-03-19 16:25:43.083  INFO 95222 --- [nio-8080-exec-4] c.b.workflow.demo.TestServiceDelegate    : 进入serviceTask:_5
2021-03-19 16:25:43.085  INFO 95222 --- [nio-8080-exec-4] c.b.workflow.demo.TestExecutionListener  : 进入ExecutionListener:end

7.扩展

activiti流程结转流转源码解析: https://blog.csdn.net/lyf_ldh/article/details/100659025

activiti异步源码: https://blog.csdn.net/u013747658/article/details/83660849

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.Activiti介绍
  • 二.Activiti 23张表及7大服务详解
  • 三.idea中bpmn编辑器
    • 3.1.工具安装
      • 3.2.常用task介绍
        • 3.3.常见task配置参数介绍
          • 3.3.1.通用参数介绍
          • 3.3.2.userTask参数
          • 3.3.3.serviceTask参数
          • 3.3.4.scriptTask参数
          • 3.3.5.callActivitiTask参数
      • 四.SpringBoot接入Activiti7
        • 4.1.POM
          • 4.2.配置文件
            • 4.2.1.增加配置
            • 4.2.2.配置说明
          • 4.3.关闭spring-security鉴权
            • 4.4.activiti常规api使用手册
            • 5.activiti应用
              • 5.1.serviceTask执行节点
                • 5.1.1.继承JavaDelegate编写代理类
                • 5.1.2.bpmn文件serviceTask节点配置
                • 5.1.3.说明
              • 5.2.taskListener与executionListener
                • 5.2.1.实现ExecutionListener接口
                • 5.2.2.bpmn文件配置
                • 5.2.3.说明
              • 5.3.自定义行为类
                • 5.3.1.继承默认行为类
                • 5.3.2.自定义行为工厂构建自定义behavior
                • 5.3.3.在spring的配置类中加载工厂
                • 5.3.4.说明
              • 5.4.命令拦截器CommandInterceptor
                • 5.5.事件监听ActivitiEventListener
                  • 5.6.异步任务
                    • 5.6.1.bpmn配置
                    • 5.6.2.spring配置
                    • 5.6.3.说明
                    • 5.6.4.部分源码解析
                • 6.常用任务节点执行顺序
                  • 6.1.userTask
                    • 6.1.1.进入人工节点尚未执行
                    • 6.1.2.执行人工节点
                  • 6.2.serviceTask
                    • 6.2.1.进入serviceTask节点尚未执行
                    • 6.2.2.serviceTask节点执行
                • 7.扩展
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档