2021年了,该学会使用activiti了

2,253 阅读4分钟

一.Activiti介绍

blog.csdn.net/zhou9207863…

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

www.jianshu.com/p/684e11224…

三.idea中bpmn编辑器

3.1.工具安装

www.jianshu.com/p/8e3fba49b…

3.2.常用task介绍

task类型task名称task介绍
userTask用户任务用户介入执行节点
serviceTask服务任务自动执行节点
scriptTask脚本任务执行脚本节点
callActivitiTask子流程任务调用子流程

3.3.常见task配置参数介绍

3.3.1.通用参数介绍

参数介绍参考url
id节点id
name节点名称
documentation流程节点描述信息
Asynchronous是否异步延续blog.csdn.net/qq_30908729…
Exclusive排他配置,保证当前任务执行时不会有并行任务
Multi Instance多实例会签www.pianshen.com/article/982…
Task Listeners任务监听器blog.csdn.net/qq_19734597…
Execution Listeners执行监听器blog.csdn.net/iflow/artic…

3.3.2.userTask参数

参数介绍参考url
Assignee流程指派人
Candidate Users能够操作的用户列表
Candidate Groups能够操作节点的用户组
Due Date到期时间blog.csdn.net/weixin_3910…
From Key获取任务节点需要展示的页面t.zoukankan.com/cxyj-p-3896…
Priority用户节点优先级,用于查询优先级排序
Form标签属性,参数列表blog.csdn.net/whatlooking…

3.3.3.serviceTask参数

参数介绍参考url
Fields元素属性,serviceTask表单内字段值解析
Type/Class调用的java方法与类型blog.csdn.net/qq_19734597…

3.3.4.scriptTask参数

参数介绍参考url
Script脚本内容
Script Format脚本类型

3.3.5.callActivitiTask参数

参数介绍参考url
Input Parameters子流程入参
Output Parameters子流程出参

四.SpringBoot接入Activiti7

4.1.POM

<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.增加配置

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.配置说明

blog.csdn.net/qq_21770005…

4.3.关闭spring-security鉴权

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

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class,
        ManagementWebSecurityAutoConfiguration.class})

4.4.activiti常规api使用手册

blog.csdn.net/zhou9207863…

5.activiti应用

5.1.serviceTask执行节点

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

5.1.1.继承JavaDelegate编写代理类

@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节点配置

<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接口

@Component
@Slf4j
public class TestExecutionListener implements ExecutionListener {

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

5.2.2.bpmn文件配置

<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.继承默认行为类

@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

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的配置类中加载工厂

@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配置

异步执行节点增加配置

    <serviceTask activiti:exclusive="true" id="_5" activiti:async="true"name="自动执行节点汇聚点" activiti:delegateExpression="${testServiceDelegate}"/>

5.6.2.spring配置

spring:
  activiti:
    async-executor-activate: true 

5.6.3.说明

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

5.6.4.部分源码解析

blog.csdn.net/u013747658/…

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

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

6.1.userTask

节点上增加taskListenter,ExecutionListener

<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.进入人工节点尚未执行

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.执行人工节点

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

<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节点尚未执行

2021-03-19 16:25:43.014  INFO 95222 --- [nio-8080-exec-4] c.b.workflow.demo.TestExecutionListener  : 进入ExecutionListener:start

6.2.2.serviceTask节点执行

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流程结转流转源码解析: blog.csdn.net/lyf_ldh/art…

activiti异步源码: blog.csdn.net/u013747658/…

8.联系我

钉钉:louyanfeng25

微信:baiyan_lou