diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java index 50118790e..55387e53d 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java @@ -20,13 +20,13 @@ import com.yomahub.liteflow.enums.ParseModeEnum; import com.yomahub.liteflow.exception.*; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.flow.cache.RuleCacheLifeCycle; import com.yomahub.liteflow.flow.element.Chain; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.element.Rollbackable; import com.yomahub.liteflow.flow.entity.CmpStep; import com.yomahub.liteflow.flow.id.IdGeneratorHolder; import com.yomahub.liteflow.lifecycle.LifeCycleHolder; -import com.yomahub.liteflow.lifecycle.PostProcessFlowExecuteLifeCycle; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.monitor.MonitorFile; @@ -45,10 +45,7 @@ import com.yomahub.liteflow.thread.ExecutorHelper; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; -import java.util.function.Consumer; import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -103,6 +100,15 @@ public class FlowExecutor { IdGeneratorHolder.init(); } + // 规则缓存 + if (isStart && liteflowConfig.isRuleCacheEnabled()) { + Integer capacity = liteflowConfig.getRuleCacheCapacity(); + RuleCacheLifeCycle ruleCacheLifeCycle = new RuleCacheLifeCycle(capacity); + LifeCycleHolder.addLifeCycle(ruleCacheLifeCycle); + // 执行时才解析chain + liteflowConfig.setParseMode(ParseModeEnum.PARSE_ONE_ON_FIRST_EXEC); + } + String ruleSource = liteflowConfig.getRuleSource(); if (StrUtil.isBlank(ruleSource)) { // 查看有没有Parser的SPI实现 diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/cache/RuleCachePostProcessFlowExecuteLifeCycle.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/cache/RuleCacheLifeCycle.java similarity index 59% rename from liteflow-core/src/main/java/com/yomahub/liteflow/flow/cache/RuleCachePostProcessFlowExecuteLifeCycle.java rename to liteflow-core/src/main/java/com/yomahub/liteflow/flow/cache/RuleCacheLifeCycle.java index f3a607ff8..a2618c4cd 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/cache/RuleCachePostProcessFlowExecuteLifeCycle.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/cache/RuleCacheLifeCycle.java @@ -1,6 +1,5 @@ package com.yomahub.liteflow.flow.cache; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; @@ -8,26 +7,23 @@ import com.github.benmanes.caffeine.cache.RemovalCause; import com.github.benmanes.caffeine.cache.RemovalListener; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.element.Chain; -import com.yomahub.liteflow.flow.element.Condition; import com.yomahub.liteflow.lifecycle.PostProcessFlowExecuteLifeCycle; import com.yomahub.liteflow.slot.Slot; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - /** * Chain执行前的缓存处理 * @author DaleLee * @since */ -public class RuleCachePostProcessFlowExecuteLifeCycle implements PostProcessFlowExecuteLifeCycle { - /** - * 缓存 - */ - private final Cache cache; +public class RuleCacheLifeCycle implements PostProcessFlowExecuteLifeCycle { + // 缓存 + private final Cache cache; + // 在缓存中与key关联的虚拟值 + private static final Object PRESENT = new Object(); - public RuleCachePostProcessFlowExecuteLifeCycle(int capacity) { + public RuleCacheLifeCycle(int capacity) { this.cache = Caffeine.newBuilder() .maximumSize(capacity) .evictionListener(new ChainRemovalListener()) @@ -36,12 +32,13 @@ public class RuleCachePostProcessFlowExecuteLifeCycle implements PostProcessFlow @Override public void postProcessBeforeFlowExecute(String chainId, Slot slot) { - Chain chain = FlowBus.getChain(chainId); - if (ObjectUtil.isNull(chain)) { + if (!FlowBus.containChain(chainId)) { return; } - // 记录在缓存中 - cache.put(chainId, chain); + // 记录chainId在缓存中 + // 这里不记录实际的chain是因为chain之后有可能在FlowBus中被移除 + // 以FlowBus中实际存在的chain为准 + cache.put(chainId, PRESENT); } @Override @@ -52,15 +49,17 @@ public class RuleCachePostProcessFlowExecuteLifeCycle implements PostProcessFlow /** * 监听在缓存中被移除的chain */ - private static class ChainRemovalListener implements RemovalListener { + private static class ChainRemovalListener implements RemovalListener { @Override - public void onRemoval(@Nullable String chanId, @Nullable Chain chain, @NonNull RemovalCause removalCause) { - List conditionList = chain.getConditionList(); - // 清空condition 并将chain设置为未编译 - if (CollUtil.isNotEmpty(conditionList)) { - conditionList.clear(); + public void onRemoval(@Nullable String chanId, @Nullable Object object, @NonNull RemovalCause removalCause) { + Chain chain = FlowBus.getChain(chanId); + // chain可能已经在FlowBus中被移除了 + if (ObjectUtil.isNull(chain)) { + return; } + // 清空condition并将chain设置为未编译 + chain.setConditionList(null); chain.setCompiled(false); } }