https://blog.csdn.net/zhou920786312/article/details/77848479
https://www.jianshu.com/p/684e11224c9b
https://www.jianshu.com/p/8e3fba49b4a2
task类型 | task名称 | task介绍 |
---|---|---|
userTask | 用户任务 | 用户介入执行节点 |
serviceTask | 服务任务 | 自动执行节点 |
scriptTask | 脚本任务 | 执行脚本节点 |
callActivitiTask | 子流程任务 | 调用子流程 |
参数 | 介绍 | 参考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 |
参数 | 介绍 | 参考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/ |
参数 | 介绍 | 参考url |
---|---|---|
Fields | 元素属性,serviceTask表单内字段值解析 | |
Type/Class | 调用的java方法与类型 | https://blog.csdn.net/qq_19734597/article/details/87625155 |
参数 | 介绍 | 参考url |
---|---|---|
Script | 脚本内容 | |
Script Format | 脚本类型 |
参数 | 介绍 | 参考url |
---|---|---|
Input Parameters | 子流程入参 | |
Output Parameters | 子流程出参 |
<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>
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
https://blog.csdn.net/qq_21770005/article/details/79009272
activiti默认引入了spring-security进行权限校验,分布式系统鉴权通常维护在用户中心与网关中,因此在spring启动时需要排除。本地联调也可以进行排除,方便接口测试。
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class,
ManagementWebSecurityAutoConfiguration.class})
https://blog.csdn.net/zhou920786312/category_7149217.html
serviceTask在activity中定义为自动执行节点,将会根据documentation中的定义进行与流程变量进行入参与出参的数据组合
@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());
}
}
<serviceTask activiti:exclusive="true" id="_5" name="服务节点" activiti:delegateExpression="${testServiceDelegate}"/>
当流程节点到达serviceTask节点时,会自动调用自动以代理类的execute方法进行逻辑处理
listener用于监听当前节点执行到达此节点时,流程执行,流程执行后,对应触发的相应的逻辑。 用法类似,以下以executionListener为例
@Component
@Slf4j
public class TestExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
log.info("进入ExecutionListener:"+execution.getEventName());
}
}
<serviceTask activiti:exclusive="true" id="_5" name="服务节点" activiti:delegateExpression="${testServiceDelegate}">
<extensionElements>
<activiti:executionListener class="com.baiyan.workflow.demo.TestExecutionListener" event="start"/>
</extensionElements>
</serviceTask>
对于executionListener配置event为start,则在当前节点执行serviceTask逻辑前,将会先执行listner中逻辑.
activiti默认情况下执行节点逻辑都是依靠XXXXBehavior的类,由Behavior类再内部去执行相应的command类进行业务逻辑处理。在日常业务中比如ScriptTaskActivityBehavior,其中只支持默认的js与grovy脚本,并不支持python等脚本。因此此处需要重写默认的ScriptTaskActivityBehavior的scriptTask执行逻辑。
此处以重写ServiceTaskDelegateExpressionActivityBehavior为例,其余行为类均为同理处理逻辑
@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);
}
}
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()));
}
}
@Component
public class BehaviorProcessEngineConfigurationConfigurer implements ProcessEngineConfigurationConfigurer {
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
BaiyanActivityBehaviorFactory BaiyanActivityBehaviorFactory = new BaiyanActivityBehaviorFactory();
processEngineConfiguration.setActivityBehaviorFactory(BaiyanActivityBehaviorFactory);
}
}
上面重写serviceTask,当流程节点执行serviceTask节点时,则会默认打印出上述的日志,进入behavior
activiti所有业务逻辑的执行均依靠command来完成,类似于controller接口来完成业务逻辑处理,现在想在业务逻辑执行前后加入一些额外处理,则可实现CommandInterceptor接口完成对command命令的前置与后置处理。类似于spring的拦截器
针对于某些特定的节点事件做一下异步处理,类似于spring的事件监听与发布
日常业务中产生大量的流程节点需要进行执行,如果同步执行,那流程将会阻塞,而且效率也不高。因此在activiti中支持了异步执行流程。
异步执行节点增加配置
<serviceTask activiti:exclusive="true" id="_5" activiti:async="true"name="自动执行节点汇聚点" activiti:delegateExpression="${testServiceDelegate}"/>
spring:
activiti:
async-executor-activate: true
当如上配置完成后,流程发布后,进入到对应的节点执行时,会在ACT_RU_JOB节点任务表中插入一条数据,activiti定时任务触发扫描次表内的数据,对表内的任务进行捞取,加上过期时间与owner字段的锁,等待执行的线程池进行任务执行。此处的口子开放了activiti在多实例时多任务的处理能力。
https://blog.csdn.net/u013747658/article/details/83660849
此处加锁,流程节点数据流转均为基于mysql数据库,如果需要极致的高性能,需要转换为缓存去实现,具体实现方式待探索
节点上增加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>
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
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
节点上增加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>
2021-03-19 16:25:43.014 INFO 95222 --- [nio-8080-exec-4] c.b.workflow.demo.TestExecutionListener : 进入ExecutionListener:start
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
activiti流程结转流转源码解析: https://blog.csdn.net/lyf_ldh/article/details/100659025
activiti异步源码: https://blog.csdn.net/u013747658/article/details/83660849