一.Activiti介绍
二.Activiti 23张表及7大服务详解
三.idea中bpmn编辑器
3.1.工具安装
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.配置说明
4.3.关闭spring-security鉴权
activiti默认引入了spring-security进行权限校验,分布式系统鉴权通常维护在用户中心与网关中,因此在spring启动时需要排除。本地联调也可以进行排除,方便接口测试。
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class,
ManagementWebSecurityAutoConfiguration.class})
4.4.activiti常规api使用手册
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.部分源码解析
此处加锁,流程节点数据流转均为基于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