
com.yomahub.liteflow.slot.DataBus Maven / Gradle / Ivy
The newest version!
/**
* Title: liteflow
* Description: 轻量级的组件式流程框架
* @author Bryan.Zhang
* @email [email protected]
* @Date 2020/4/1
*/
package com.yomahub.liteflow.slot;
import cn.hutool.core.lang.Tuple;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.annotation.util.AnnoUtil;
import com.yomahub.liteflow.context.ContextBean;
import com.yomahub.liteflow.log.LFLog;
import com.yomahub.liteflow.log.LFLoggerManager;
import com.yomahub.liteflow.property.LiteflowConfig;
import com.yomahub.liteflow.property.LiteflowConfigGetter;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* 数据BUS,主要用来管理Slot,用以分配和回收
*
* @author Bryan.Zhang
*/
public class DataBus {
private static final LFLog LOG = LFLoggerManager.getLogger(DataBus.class);
public static AtomicInteger OCCUPY_COUNT = new AtomicInteger(0);
/**
* 这里为什么采用ConcurrentHashMap作为slot存放的容器?
* 因为ConcurrentHashMap的随机取值复杂度也和数组一样为O(1),并且没有并发问题,还有自动扩容的功能
* 用数组的话,扩容涉及copy,线程安全问题还要自己处理
*/
private static ConcurrentHashMap SLOTS;
private static ConcurrentLinkedQueue QUEUE;
/**
* 当前slot的下标index的最大值
*/
private static Integer currentIndexMaxValue;
/**
* 这里原先版本中是static块,现在改成init静态方法,由FlowExecutor中的init去调用
* 这样的改动对项目来说没有什么实际意义,但是在单元测试中,却有意义。
* 因为单元测试中所有的一起跑,jvm是不退出的,所以如果是static块的话,跑多个testsuite只会执行一次。
* 而由FlowExecutor中的init去调用,是会被执行多次的。保证了每个单元测试都能初始化一遍
*/
public static void init() {
if (MapUtil.isEmpty(SLOTS)) {
LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();
currentIndexMaxValue = liteflowConfig.getSlotSize();
SLOTS = new ConcurrentHashMap<>();
QUEUE = IntStream.range(0, currentIndexMaxValue)
.boxed()
.collect(Collectors.toCollection(ConcurrentLinkedQueue::new));
}
}
public static int offerSlotByClass(List> contextClazzList) {
// 把classList通过反射初始化成对象列表
// 这里用newInstanceIfPossible这个方法,是为了兼容当没有无参构造方法所报的错
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy