前言:
接上一章节,我们讲述了Then表达式之后,我们来聊聊When表达式。
首先,我们先来说一下什么是when表达式,when表达式来liteflow里面是一个比较重要的表达式。其主要的功能就是实现多任务并发执行的效果,以提高程序运行效率。也可以解决一些流程上的问题。
1.ParallelStrategyEnum
这是一个枚举类,其作用是有对应并行策略的一个执行器class对象
public enum ParallelStrategyEnum {
ANY("anyOf", "完成任一任务", AnyOfParallelExecutor.class),
ALL("allOf", "完成全部任务", AllOfParallelExecutor.class),
SPECIFY("must", "完成指定 ID 任务", SpecifyParallelExecutor.class);
private String strategyType;
private String description;
private Class<? extends ParallelStrategyExecutor> clazz;
ParallelStrategyEnum(String strategyType, String description, Class<? extends ParallelStrategyExecutor> clazz) {
this.strategyType = strategyType;
this.description = description;
this.clazz = clazz;
}
public String getStrategyType() {
return strategyType;
}
public void setStrategyType(String strategyType) {
this.strategyType = strategyType;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Class<? extends ParallelStrategyExecutor> getClazz() {
return clazz;
}
public void setClazz(Class<? extends ParallelStrategyExecutor> clazz) {
this.clazz = clazz;
}
那么其实,when里面是有三种并行策略的
1.实际上,就是对应官网上面的三种策略 有any关键字和must关键字,具体用法参考官网,这里就不再赘述
/**
* EL规则中的any的操作符
*
* @author Bryan.Zhang
* @since 2.8.0
*/
public class AnyOperator extends BaseOperator<WhenCondition> {
@Override
public WhenCondition build(Object[] objects) throws Exception {
OperatorHelper.checkObjectSizeEqTwo(objects);
WhenCondition whenCondition = OperatorHelper.convert(objects[0], WhenCondition.class);
Boolean any = OperatorHelper.convert(objects[1], Boolean.class);
whenCondition.setParallelStrategy(any ? ParallelStrategyEnum.ANY : ParallelStrategyEnum.ALL);
return whenCondition;
}
}
实际上,如果没有any关键字和must关键字,默认走的是all策略。那么我们来一个一个看
2.all策略执行器
以下是刚刚我们查看的方法
我们进入ExecutorBuilder查看
我们回到刚刚最外面的线程池构建
我们进入fiterWhenTaskList方法可以看到
我们进入下面的wrappedFutureobj方法中
注意:这个线程池还是用于抛出超时异常,而真正执行的线程池是我们刚刚看到的上面的那个线程池执行。
好了就回到我们获取所有任务List后了,获取后就该执行了吧?
allof方法可以自行百度 以下,大概就是等待所有任务完成然后收集所有completefuture的结果
此时,我们进入handleTaskResult方法查看
其实总体流程大概就是这样,我也是一步一步看下来的,有一些东西还不是悟的很透彻,望大佬指正。