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 9ef9297de..3e4160876 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 @@ -13,6 +13,11 @@ import java.util.concurrent.CountDownLatch; import java.util.regex.Matcher; import java.util.regex.Pattern; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Lists; +import com.yomahub.liteflow.exception.ConfigErrorException; +import com.yomahub.liteflow.property.LiteflowConfig; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,11 +39,17 @@ public class FlowExecutor { private static final Logger LOG = LoggerFactory.getLogger(FlowExecutor.class); - private List rulePath; + private LiteflowConfig liteflowConfig; private String zkNode; public void init() { + if (ObjectUtil.isNull(liteflowConfig) || StrUtil.isBlank(liteflowConfig.getRuleSource())){ + throw new ConfigErrorException("config error, please check liteflow config property"); + } + + List rulePath = Lists.newArrayList(liteflowConfig.getRuleSource().split(",|;")); + XmlFlowParser parser = null; for(String path : rulePath){ try { @@ -152,14 +163,6 @@ public class FlowExecutor { return (T)slot; } - public List getRulePath() { - return rulePath; - } - - public void setRulePath(List rulePath) { - this.rulePath = rulePath; - } - public String getZkNode() { return zkNode; } @@ -167,4 +170,12 @@ public class FlowExecutor { public void setZkNode(String zkNode) { this.zkNode = zkNode; } + + public LiteflowConfig getLiteflowConfig() { + return liteflowConfig; + } + + public void setLiteflowConfig(LiteflowConfig liteflowConfig) { + this.liteflowConfig = liteflowConfig; + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/entity/data/DataBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/entity/data/DataBus.java index 22ae8b6b6..dc8a8ddc9 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/entity/data/DataBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/entity/data/DataBus.java @@ -9,6 +9,9 @@ package com.yomahub.liteflow.entity.data; import java.util.concurrent.atomic.AtomicInteger; +import cn.hutool.core.util.ObjectUtil; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.util.SpringAware; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,11 +19,20 @@ public class DataBus { private static final Logger LOG = LoggerFactory.getLogger(DataBus.class); - public static int SLOT_SIZE = 1024; - public static AtomicInteger OCCUPY_COUNT = new AtomicInteger(0); - private static Slot[] slots = new Slot[SLOT_SIZE]; + private static Slot[] slots; + + static { + LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class); + int slotSize = 1024; + if (ObjectUtil.isNotNull(liteflowConfig)){ + if (ObjectUtil.isNotNull(liteflowConfig.getSlotSize())){ + slotSize = liteflowConfig.getSlotSize(); + } + } + slots = new Slot[slotSize]; + } public synchronized static int offerSlot(Class slotClazz){ try{ @@ -52,12 +64,4 @@ public class DataBus { LOG.warn("slot[{}] already has been released",slotIndex); } } - - public static int getSlotSize() { - return SLOT_SIZE; - } - - public static void setSlotSize(int slotSize) { - SLOT_SIZE = slotSize; - } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/entity/flow/Chain.java b/liteflow-core/src/main/java/com/yomahub/liteflow/entity/flow/Chain.java index 5dc3458ba..58c100286 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/entity/flow/Chain.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/entity/flow/Chain.java @@ -1,18 +1,22 @@ /** *

Title: liteflow

*

Description: 轻量级的组件式流程框架

+ * * @author Bryan.Zhang * @email weenyc31@163.com * @Date 2020/4/1 */ package com.yomahub.liteflow.entity.flow; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.entity.data.DataBus; import com.yomahub.liteflow.entity.data.Slot; import com.yomahub.liteflow.enums.ExecuteTypeEnum; import com.yomahub.liteflow.exception.ChainEndException; import com.yomahub.liteflow.exception.FlowSystemException; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.util.SpringAware; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,69 +25,80 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -public class Chain implements Executable{ +public class Chain implements Executable { - private static final Logger LOG = LoggerFactory.getLogger(Chain.class); + private static final Logger LOG = LoggerFactory.getLogger(Chain.class); - private String chainName; + private String chainName; - private List conditionList; + private List conditionList; - public Chain(String chainName, List conditionList) { - this.chainName = chainName; - this.conditionList = conditionList; - } + private static int whenMaxWaitSeconds; - public List getConditionList() { - return conditionList; - } + static { + LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class); + if (ObjectUtil.isNotNull(liteflowConfig)) { + whenMaxWaitSeconds = liteflowConfig.getWhenMaxWaitSecond(); + } else { + whenMaxWaitSeconds = 15; + } + } - public void setConditionList(List conditionList) { - this.conditionList = conditionList; - } + public Chain(String chainName, List conditionList) { + this.chainName = chainName; + this.conditionList = conditionList; + } - public String getChainName() { - return chainName; - } + public List getConditionList() { + return conditionList; + } - public void setChainName(String chainName) { - this.chainName = chainName; - } + public void setConditionList(List conditionList) { + this.conditionList = conditionList; + } - @Override - public void execute(Integer slotIndex) throws Exception{ - if(CollectionUtils.isEmpty(conditionList)){ - throw new FlowSystemException("no conditionList in this chain[" + chainName + "]"); - } + public String getChainName() { + return chainName; + } - Slot slot = DataBus.getSlot(slotIndex); + public void setChainName(String chainName) { + this.chainName = chainName; + } - for (Condition condition : conditionList){ - if(condition instanceof ThenCondition){ - for(Executable executableItem : condition.getNodeList()){ - try{ - executableItem.execute(slotIndex); - }catch (Exception e){ - throw e; - } - } - }else if(condition instanceof WhenCondition){ - final CountDownLatch latch = new CountDownLatch(condition.getNodeList().size()); - for(Executable executableItem : condition.getNodeList()){ - new WhenConditionThread(executableItem,slotIndex,slot.getRequestId(),latch).start(); - } - latch.await(15, TimeUnit.SECONDS); - } - } - } + @Override + public void execute(Integer slotIndex) throws Exception { + if (CollectionUtils.isEmpty(conditionList)) { + throw new FlowSystemException("no conditionList in this chain[" + chainName + "]"); + } - @Override - public ExecuteTypeEnum getExecuteType() { - return ExecuteTypeEnum.CHAIN; - } + Slot slot = DataBus.getSlot(slotIndex); - @Override - public String getExecuteName() { - return chainName; - } + for (Condition condition : conditionList) { + if (condition instanceof ThenCondition) { + for (Executable executableItem : condition.getNodeList()) { + try { + executableItem.execute(slotIndex); + } catch (Exception e) { + throw e; + } + } + } else if (condition instanceof WhenCondition) { + final CountDownLatch latch = new CountDownLatch(condition.getNodeList().size()); + for (Executable executableItem : condition.getNodeList()) { + new WhenConditionThread(executableItem, slotIndex, slot.getRequestId(), latch).start(); + } + latch.await(whenMaxWaitSeconds, TimeUnit.SECONDS); + } + } + } + + @Override + public ExecuteTypeEnum getExecuteType() { + return ExecuteTypeEnum.CHAIN; + } + + @Override + public String getExecuteName() { + return chainName; + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/exception/ConfigErrorException.java b/liteflow-core/src/main/java/com/yomahub/liteflow/exception/ConfigErrorException.java new file mode 100644 index 000000000..c8e4d6d3f --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/exception/ConfigErrorException.java @@ -0,0 +1,21 @@ +package com.yomahub.liteflow.exception; + +public class ConfigErrorException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** 异常信息 */ + private String message; + + public ConfigErrorException(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorBus.java index 9e31ae88c..41a64ceef 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorBus.java @@ -22,6 +22,8 @@ import java.util.Timer; import java.util.concurrent.ConcurrentHashMap; import cn.hutool.core.collection.BoundedPriorityQueue; +import cn.hutool.core.util.ObjectUtil; +import com.yomahub.liteflow.property.LiteflowConfig; import com.yomahub.liteflow.util.SpringAware; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,37 +34,40 @@ import com.yomahub.liteflow.util.LimitQueue; public class MonitorBus { - private boolean enableMonitorLog = false; + private LiteflowConfig liteflowConfig; + + private boolean enableLog = false; private int queueLimit = 200; - private long delay = 5*60*1000; + private long delay = 300000; - private long period = 5*60*1000; + private long preiod = 300000; private final Logger LOG = LoggerFactory.getLogger(this.getClass()); private final ConcurrentHashMap> statisticsMap = new ConcurrentHashMap<>(); - public MonitorBus() { - } - - public MonitorBus(boolean enableMonitorLog) { - this.enableMonitorLog = enableMonitorLog; - if(this.enableMonitorLog){ - Timer timer = new Timer(); - timer.schedule(new MonitorTimeTask(this), this.getDelay(), this.getPeriod()); + public MonitorBus(LiteflowConfig liteflowConfig) { + if (ObjectUtil.isNotNull(liteflowConfig.getEnableLog())){ + this.enableLog = liteflowConfig.getEnableLog(); } - } - public MonitorBus(boolean enableMonitorLog, int queueLimit, long delay, long period) { - this.enableMonitorLog = enableMonitorLog; - this.queueLimit = queueLimit; - this.delay = delay; - this.period = period; - if(this.enableMonitorLog){ + if (ObjectUtil.isNotNull(liteflowConfig.getQueueLimit())){ + queueLimit = liteflowConfig.getQueueLimit(); + } + + if (ObjectUtil.isNotNull(liteflowConfig.getDelay())){ + delay = liteflowConfig.getDelay(); + } + + if (ObjectUtil.isNotNull(liteflowConfig.getPeriod())){ + preiod = liteflowConfig.getPeriod(); + } + + if(enableLog){ Timer timer = new Timer(); - timer.schedule(new MonitorTimeTask(this), this.getDelay(), this.getPeriod()); + timer.schedule(new MonitorTimeTask(this), delay, preiod); } } @@ -97,7 +102,7 @@ public class MonitorBus { logStr.append("以下为LiteFlow中间件统计信息:\n"); logStr.append("======================================================================================\n"); logStr.append("===================================SLOT INFO==========================================\n"); - logStr.append(MessageFormat.format("SLOT TOTAL SIZE : {0}\n", DataBus.SLOT_SIZE)); + logStr.append(MessageFormat.format("SLOT TOTAL SIZE : {0}\n", liteflowConfig.getSlotSize())); logStr.append(MessageFormat.format("SLOT OCCUPY COUNT : {0}\n", DataBus.OCCUPY_COUNT)); logStr.append("===============================TIME AVERAGE SPENT=====================================\n"); for(Entry entry : compAverageTimeSpentEntryList){ @@ -110,35 +115,11 @@ public class MonitorBus { } } - public boolean isEnableMonitorLog() { - return enableMonitorLog; + public LiteflowConfig getLiteflowConfig() { + return liteflowConfig; } - public void setEnableMonitorLog(boolean enableMonitorLog) { - this.enableMonitorLog = enableMonitorLog; - } - - public int getQueueLimit() { - return queueLimit; - } - - public void setQueueLimit(int queueLimit) { - this.queueLimit = queueLimit; - } - - public long getDelay() { - return delay; - } - - public void setDelay(long delay) { - this.delay = delay; - } - - public long getPeriod() { - return period; - } - - public void setPeriod(long period) { - this.period = period; + public void setLiteflowConfig(LiteflowConfig liteflowConfig) { + this.liteflowConfig = liteflowConfig; } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java b/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java new file mode 100644 index 000000000..4978c5408 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java @@ -0,0 +1,81 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2021/3/18 + */ +package com.yomahub.liteflow.property; + +public class LiteflowConfig { + + private String ruleSource; + + private Integer slotSize; + + private Integer whenMaxWaitSecond; + + private Boolean enableLog; + + private Integer queueLimit; + + private Long delay; + + private Long period; + + public String getRuleSource() { + return ruleSource; + } + + public void setRuleSource(String ruleSource) { + this.ruleSource = ruleSource; + } + + public Integer getSlotSize() { + return slotSize; + } + + public void setSlotSize(Integer slotSize) { + this.slotSize = slotSize; + } + + public Integer getWhenMaxWaitSecond() { + return whenMaxWaitSecond; + } + + public void setWhenMaxWaitSecond(Integer whenMaxWaitSecond) { + this.whenMaxWaitSecond = whenMaxWaitSecond; + } + + public Integer getQueueLimit() { + return queueLimit; + } + + public void setQueueLimit(Integer queueLimit) { + this.queueLimit = queueLimit; + } + + public Long getDelay() { + return delay; + } + + public void setDelay(Long delay) { + this.delay = delay; + } + + public Long getPeriod() { + return period; + } + + public void setPeriod(Long period) { + this.period = period; + } + + public Boolean getEnableLog() { + return enableLog; + } + + public void setEnableLog(Boolean enableLog) { + this.enableLog = enableLog; + } +} diff --git a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowAutoConfiguration.java b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowAutoConfiguration.java index 91aad0888..c5e5fe506 100644 --- a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowAutoConfiguration.java +++ b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowAutoConfiguration.java @@ -1,9 +1,11 @@ package com.yomahub.liteflow.springboot; +import cn.hutool.core.util.StrUtil; import com.google.common.collect.Lists; import com.yomahub.liteflow.core.FlowExecutor; import com.yomahub.liteflow.entity.data.DataBus; import com.yomahub.liteflow.monitor.MonitorBus; +import com.yomahub.liteflow.property.LiteflowConfig; import com.yomahub.liteflow.spring.ComponentScaner; import com.yomahub.liteflow.util.SpringAware; import org.apache.commons.lang3.StringUtils; @@ -25,19 +27,28 @@ import java.util.List; public class LiteflowAutoConfiguration { @Bean - public ComponentScaner componentScaner(){ + public LiteflowConfig liteflowConfig(LiteflowProperty property, LiteflowMonitorProperty liteflowMonitorProperty){ + LiteflowConfig liteflowConfig = new LiteflowConfig(); + liteflowConfig.setRuleSource(property.getRuleSource()); + liteflowConfig.setSlotSize(property.getSlotSize()); + liteflowConfig.setWhenMaxWaitSecond(property.getWhenMaxWaitSecond()); + liteflowConfig.setEnableLog(liteflowMonitorProperty.isEnableLog()); + liteflowConfig.setQueueLimit(liteflowMonitorProperty.getQueueLimit()); + liteflowConfig.setDelay(liteflowMonitorProperty.getDelay()); + liteflowConfig.setPeriod(liteflowMonitorProperty.getPeriod()); + return liteflowConfig; + } + + @Bean + public ComponentScaner componentScaner(LiteflowConfig liteflowConfig){ return new ComponentScaner(); } @Bean - public FlowExecutor flowExecutor(LiteflowProperty property){ - if(StringUtils.isNotBlank(property.getRuleSource())){ - List ruleList = Lists.newArrayList(property.getRuleSource().split(",")); + public FlowExecutor flowExecutor(LiteflowConfig liteflowConfig){ + if(StrUtil.isNotBlank(liteflowConfig.getRuleSource())){ FlowExecutor flowExecutor = new FlowExecutor(); - flowExecutor.setRulePath(ruleList); - - DataBus.setSlotSize(property.getSlotSize()); - + flowExecutor.setLiteflowConfig(liteflowConfig); return flowExecutor; }else{ return null; @@ -55,7 +66,7 @@ public class LiteflowAutoConfiguration { } @Bean - public MonitorBus monitorBus(LiteflowMonitorProperty property){ - return new MonitorBus(property.isEnableLog(), property.getQueueLimit(), property.getDelay(), property.getPeriod()); + public MonitorBus monitorBus(LiteflowConfig liteflowConfig){ + return new MonitorBus(liteflowConfig); } } diff --git a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowProperty.java b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowProperty.java index 6668bac56..40cdd6e81 100644 --- a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowProperty.java +++ b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/LiteflowProperty.java @@ -9,6 +9,8 @@ public class LiteflowProperty { private int slotSize; + private int whenMaxWaitSecond; + public String getRuleSource() { return ruleSource; } @@ -24,4 +26,12 @@ public class LiteflowProperty { public void setSlotSize(int slotSize) { this.slotSize = slotSize; } + + public int getWhenMaxWaitSecond() { + return whenMaxWaitSecond; + } + + public void setWhenMaxWaitSecond(int whenMaxWaitSecond) { + this.whenMaxWaitSecond = whenMaxWaitSecond; + } } diff --git a/liteflow-spring-boot-starter/src/main/resources/META-INF/liteflow-default.properties b/liteflow-spring-boot-starter/src/main/resources/META-INF/liteflow-default.properties index befda9228..ef7873807 100644 --- a/liteflow-spring-boot-starter/src/main/resources/META-INF/liteflow-default.properties +++ b/liteflow-spring-boot-starter/src/main/resources/META-INF/liteflow-default.properties @@ -1,5 +1,6 @@ -liteflow.ruleSource=config/flow.xml +liteflow.rule-source=config/flow.xml liteflow.slot-size=1024 +liteflow.when-max-wait-second=15 liteflow.monitor.enable-log=false liteflow.monitor.queue-limit=200 liteflow.monitor.delay=300000 diff --git a/liteflow-test-spring/src/main/java/com/yomahub/flowtest/Runner.java b/liteflow-test-spring/src/main/java/com/yomahub/flowtest/Runner.java index 4c54057b6..8aa23f711 100644 --- a/liteflow-test-spring/src/main/java/com/yomahub/flowtest/Runner.java +++ b/liteflow-test-spring/src/main/java/com/yomahub/flowtest/Runner.java @@ -19,6 +19,6 @@ public class Runner { Slot slot = flowExecutor.execute("chain3", "it's a request"); System.out.println(slot); - System.exit(0); +// System.exit(0); } } diff --git a/liteflow-test-spring/src/main/resources/applicationContext.xml b/liteflow-test-spring/src/main/resources/applicationContext.xml index 6b8e59169..7208a910a 100644 --- a/liteflow-test-spring/src/main/resources/applicationContext.xml +++ b/liteflow-test-spring/src/main/resources/applicationContext.xml @@ -13,11 +13,23 @@ - - - - config/flow.xml - - + + + + + + + + + + + + + + + diff --git a/liteflow-test-springboot/pom.xml b/liteflow-test-springboot/pom.xml index 37b7393e9..99a7fad92 100644 --- a/liteflow-test-springboot/pom.xml +++ b/liteflow-test-springboot/pom.xml @@ -42,6 +42,12 @@ spring-boot-starter-test test + + + org.springframework.boot + spring-boot-configuration-processor + true + diff --git a/liteflow-test-springboot/src/main/resources/application.properties b/liteflow-test-springboot/src/main/resources/application.properties index 14993d036..2cabc8c86 100644 --- a/liteflow-test-springboot/src/main/resources/application.properties +++ b/liteflow-test-springboot/src/main/resources/application.properties @@ -1,2 +1 @@ -liteflow.ruleSource=config/flow.xml -liteflow.slot-size=2048 \ No newline at end of file +liteflow.rule-source=config/flow.xml \ No newline at end of file