From 07c0ab8b41ddff10d484fbe06dbaf4edee0c24d9 Mon Sep 17 00:00:00 2001 From: "bryan.zhang" Date: Thu, 23 Nov 2017 14:27:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E4=BB=B6=E6=94=AF=E6=8C=81spring?= =?UTF-8?q?=E7=9A=84=E8=87=AA=E5=8A=A8=E6=89=AB=E6=8F=8F=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=9F=BA=E4=BA=8Espring=E7=9A=84=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 32 +++++++++--- .../liteflow/core/FlowExecutor.java | 4 +- .../{Component.java => NodeComponent.java} | 6 +-- .../liteflow/entity/config/Node.java | 18 +++++-- .../liteflow/parser/FlowParser.java | 47 ++++++++++------- .../liteflow/spring/ComponentScaner.java | 50 +++++++++++++++++++ .../liteflow/test/TestWithSpringMain.java | 26 ++++++++++ .../liteflow/test/component/AComponent.java | 7 ++- .../liteflow/test/component/BComponent.java | 7 ++- .../liteflow/test/component/CComponent.java | 7 ++- .../liteflow/test/component/DComponent.java | 7 ++- .../liteflow/test/component/EComponent.java | 7 ++- .../liteflow/test/component/FComponent.java | 7 ++- .../liteflow/test/component/GComponent.java | 7 ++- src/test/resources/spring-test.xml | 20 ++++++++ 15 files changed, 203 insertions(+), 49 deletions(-) rename src/main/java/com/thebeastshop/liteflow/core/{Component.java => NodeComponent.java} (91%) create mode 100644 src/main/java/com/thebeastshop/liteflow/spring/ComponentScaner.java create mode 100644 src/test/java/com/thebeastshop/liteflow/test/TestWithSpringMain.java create mode 100644 src/test/resources/spring-test.xml diff --git a/pom.xml b/pom.xml index 953a937db..07e7bb0a6 100644 --- a/pom.xml +++ b/pom.xml @@ -12,14 +12,15 @@ 1.7 3.4 4.1 - 4.1.7.RELEASE + 2.4 + 4.2.6.RELEASE 1.7.21 1.2.17 1.7.5 1.7.13 1.2.7 - 1.0 1.6.1 + 4.12 @@ -33,9 +34,24 @@ commons-collections4 4.1 + + commons-io + commons-io + ${commons-io.version} + org.springframework - spring-jdbc + spring-beans + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-test ${spring.version} @@ -58,16 +74,16 @@ fastjson ${fastjson.version} - - com.poolik - classfinder - ${classfinder.version} - dom4j dom4j ${dom4j.version} + + junit + junit + ${junit.version} + diff --git a/src/main/java/com/thebeastshop/liteflow/core/FlowExecutor.java b/src/main/java/com/thebeastshop/liteflow/core/FlowExecutor.java index f51b11ac4..98cc50a52 100644 --- a/src/main/java/com/thebeastshop/liteflow/core/FlowExecutor.java +++ b/src/main/java/com/thebeastshop/liteflow/core/FlowExecutor.java @@ -65,7 +65,7 @@ public class FlowExecutor { List conditionList = chain.getConditionList(); List nodeList = null; - Component component = null; + NodeComponent component = null; for(Condition condition : conditionList){ nodeList = condition.getNodeList(); @@ -76,6 +76,8 @@ public class FlowExecutor { component.setSlotIndex(slotIndex); if(component.isAccess()){ component.execute(); + }else{ + LOG.info("component[{}] do not gain access",component.getClass().getSimpleName()); } }catch(Throwable t){ if(component.isContinueOnError()){ diff --git a/src/main/java/com/thebeastshop/liteflow/core/Component.java b/src/main/java/com/thebeastshop/liteflow/core/NodeComponent.java similarity index 91% rename from src/main/java/com/thebeastshop/liteflow/core/Component.java rename to src/main/java/com/thebeastshop/liteflow/core/NodeComponent.java index 86c1a3da0..3cc7a4bb8 100644 --- a/src/main/java/com/thebeastshop/liteflow/core/Component.java +++ b/src/main/java/com/thebeastshop/liteflow/core/NodeComponent.java @@ -17,9 +17,9 @@ import com.thebeastshop.liteflow.entity.data.Slot; import com.thebeastshop.liteflow.entity.monitor.CompStatistics; import com.thebeastshop.liteflow.monitor.MonitorBus; -public abstract class Component { +public abstract class NodeComponent { - private static final Logger LOG = LoggerFactory.getLogger(Component.class); + private static final Logger LOG = LoggerFactory.getLogger(NodeComponent.class); private InheritableThreadLocal slotIndexTL = new InheritableThreadLocal(); @@ -63,7 +63,7 @@ public abstract class Component { this.continueOnError = continueOnError; } - public Component setSlotIndex(Integer slotIndex) { + public NodeComponent setSlotIndex(Integer slotIndex) { this.slotIndexTL.set(slotIndex); return this; } diff --git a/src/main/java/com/thebeastshop/liteflow/entity/config/Node.java b/src/main/java/com/thebeastshop/liteflow/entity/config/Node.java index 8e313c622..90749b0a3 100644 --- a/src/main/java/com/thebeastshop/liteflow/entity/config/Node.java +++ b/src/main/java/com/thebeastshop/liteflow/entity/config/Node.java @@ -9,7 +9,7 @@ */ package com.thebeastshop.liteflow.entity.config; -import com.thebeastshop.liteflow.core.Component; +import com.thebeastshop.liteflow.core.NodeComponent; public class Node { @@ -17,7 +17,17 @@ public class Node { private String clazz; - private Component instance; + private NodeComponent instance; + + public Node(){ + + } + + public Node(String id, String clazz, NodeComponent instance) { + this.id = id; + this.clazz = clazz; + this.instance = instance; + } public String getId() { return id; @@ -35,11 +45,11 @@ public class Node { this.clazz = clazz; } - public Component getInstance() { + public NodeComponent getInstance() { return instance; } - public void setInstance(Component instance) { + public void setInstance(NodeComponent instance) { this.instance = instance; } } diff --git a/src/main/java/com/thebeastshop/liteflow/parser/FlowParser.java b/src/main/java/com/thebeastshop/liteflow/parser/FlowParser.java index 6a0bef762..865e5f362 100644 --- a/src/main/java/com/thebeastshop/liteflow/parser/FlowParser.java +++ b/src/main/java/com/thebeastshop/liteflow/parser/FlowParser.java @@ -14,6 +14,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; import org.dom4j.Document; @@ -21,13 +22,14 @@ import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.thebeastshop.liteflow.core.Component; +import com.thebeastshop.liteflow.core.NodeComponent; import com.thebeastshop.liteflow.entity.config.Chain; import com.thebeastshop.liteflow.entity.config.Condition; import com.thebeastshop.liteflow.entity.config.Node; import com.thebeastshop.liteflow.entity.config.ThenCondition; import com.thebeastshop.liteflow.entity.config.WhenCondition; import com.thebeastshop.liteflow.flow.FlowBus; +import com.thebeastshop.liteflow.spring.ComponentScaner; import com.thebeastshop.liteflow.util.Dom4JReader; import com.thebeastshop.liteflow.util.IOUtil; @@ -52,26 +54,33 @@ public class FlowParser { try { Element rootElement = document.getRootElement(); - // 解析node节点 - List nodeList = rootElement.element("nodes").elements("node"); - String id = null; - String clazz = null; - Node node = null; - Component component = null; + //判断是以spring方式注册节点,还是以xml方式注册 Map nodeMap = new HashMap(); - for (Element e : nodeList) { - node = new Node(); - id = e.attributeValue("id"); - clazz = e.attributeValue("class"); - node.setId(id); - node.setClazz(clazz); - component = (Component) Class.forName(clazz).newInstance(); - if (component == null) { - LOG.error("couldn't find component class [{}] ", clazz); + if(ComponentScaner.nodeComponentMap.isEmpty()){ + // 解析node节点 + List nodeList = rootElement.element("nodes").elements("node"); + String id = null; + String clazz = null; + Node node = null; + NodeComponent component = null; + for (Element e : nodeList) { + node = new Node(); + id = e.attributeValue("id"); + clazz = e.attributeValue("class"); + node.setId(id); + node.setClazz(clazz); + component = (NodeComponent) Class.forName(clazz).newInstance(); + if (component == null) { + LOG.error("couldn't find component class [{}] ", clazz); + } + component.setNodeId(id); + node.setInstance(component); + nodeMap.put(id, node); + } + }else{ + for(Entry componentEntry : ComponentScaner.nodeComponentMap.entrySet()){ + nodeMap.put(componentEntry.getKey(), new Node(componentEntry.getKey(), componentEntry.getValue().getClass().getName(), componentEntry.getValue())); } - component.setNodeId(id); - node.setInstance(component); - nodeMap.put(id, node); } // 解析chain节点 diff --git a/src/main/java/com/thebeastshop/liteflow/spring/ComponentScaner.java b/src/main/java/com/thebeastshop/liteflow/spring/ComponentScaner.java new file mode 100644 index 000000000..1249e21cf --- /dev/null +++ b/src/main/java/com/thebeastshop/liteflow/spring/ComponentScaner.java @@ -0,0 +1,50 @@ +/** + *

Title: liteFlow

+ *

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

+ *

Copyright: Copyright (c) 2017

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-11-23 + * @version 1.0 + */ +package com.thebeastshop.liteflow.spring; + +import java.util.HashMap; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.core.Ordered; +import org.springframework.core.PriorityOrdered; +import com.thebeastshop.liteflow.core.NodeComponent; +import com.thebeastshop.liteflow.entity.config.Node; + +public class ComponentScaner implements BeanPostProcessor, PriorityOrdered { + + private static final Logger LOG = LoggerFactory.getLogger(ComponentScaner.class); + + public static Map nodeComponentMap = new HashMap(); + + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE; + } + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + Class clazz = bean.getClass(); + if(NodeComponent.class.isAssignableFrom(clazz)){ + LOG.info("component[{}] has been found",beanName); + NodeComponent nodeComponent = (NodeComponent)bean; + nodeComponent.setNodeId(beanName); + nodeComponentMap.put(beanName, nodeComponent); + } + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; + } +} diff --git a/src/test/java/com/thebeastshop/liteflow/test/TestWithSpringMain.java b/src/test/java/com/thebeastshop/liteflow/test/TestWithSpringMain.java new file mode 100644 index 000000000..6ed6b1e05 --- /dev/null +++ b/src/test/java/com/thebeastshop/liteflow/test/TestWithSpringMain.java @@ -0,0 +1,26 @@ +package com.thebeastshop.liteflow.test; + +import javax.annotation.Resource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.thebeastshop.liteflow.core.FlowExecutor; + + + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "classpath:spring-test.xml" }) +public class TestWithSpringMain { + + @Resource + private FlowExecutor flowExecutor; + + @Test + public void test1() throws Exception { + String response = flowExecutor.execute("chain2", "it's a request"); + System.out.println(response); + } +} diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/AComponent.java b/src/test/java/com/thebeastshop/liteflow/test/component/AComponent.java index 5ba32c658..177ad20f9 100644 --- a/src/test/java/com/thebeastshop/liteflow/test/component/AComponent.java +++ b/src/test/java/com/thebeastshop/liteflow/test/component/AComponent.java @@ -9,9 +9,12 @@ */ package com.thebeastshop.liteflow.test.component; -import com.thebeastshop.liteflow.core.Component; +import org.springframework.stereotype.Component; -public class AComponent extends Component { +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("a") +public class AComponent extends NodeComponent { @Override public void process() { diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/BComponent.java b/src/test/java/com/thebeastshop/liteflow/test/component/BComponent.java index a25394204..cac3113eb 100644 --- a/src/test/java/com/thebeastshop/liteflow/test/component/BComponent.java +++ b/src/test/java/com/thebeastshop/liteflow/test/component/BComponent.java @@ -12,9 +12,12 @@ package com.thebeastshop.liteflow.test.component; import java.util.ArrayList; import java.util.List; -import com.thebeastshop.liteflow.core.Component; +import org.springframework.stereotype.Component; -public class BComponent extends Component { +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("b") +public class BComponent extends NodeComponent { @Override public void process() { diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/CComponent.java b/src/test/java/com/thebeastshop/liteflow/test/component/CComponent.java index 187c5c3fa..25420668e 100644 --- a/src/test/java/com/thebeastshop/liteflow/test/component/CComponent.java +++ b/src/test/java/com/thebeastshop/liteflow/test/component/CComponent.java @@ -9,9 +9,12 @@ */ package com.thebeastshop.liteflow.test.component; -import com.thebeastshop.liteflow.core.Component; +import org.springframework.stereotype.Component; -public class CComponent extends Component { +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("c") +public class CComponent extends NodeComponent { @Override public void process() { diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/DComponent.java b/src/test/java/com/thebeastshop/liteflow/test/component/DComponent.java index 8ed3cdc54..18d7b277c 100644 --- a/src/test/java/com/thebeastshop/liteflow/test/component/DComponent.java +++ b/src/test/java/com/thebeastshop/liteflow/test/component/DComponent.java @@ -9,10 +9,13 @@ */ package com.thebeastshop.liteflow.test.component; -import com.thebeastshop.liteflow.core.Component; +import org.springframework.stereotype.Component; + +import com.thebeastshop.liteflow.core.NodeComponent; import com.thebeastshop.liteflow.entity.data.Slot; -public class DComponent extends Component { +@Component("d") +public class DComponent extends NodeComponent { @Override public void process() { diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/EComponent.java b/src/test/java/com/thebeastshop/liteflow/test/component/EComponent.java index 40d4105f4..1ceb6e439 100644 --- a/src/test/java/com/thebeastshop/liteflow/test/component/EComponent.java +++ b/src/test/java/com/thebeastshop/liteflow/test/component/EComponent.java @@ -9,9 +9,12 @@ */ package com.thebeastshop.liteflow.test.component; -import com.thebeastshop.liteflow.core.Component; +import org.springframework.stereotype.Component; -public class EComponent extends Component { +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("e") +public class EComponent extends NodeComponent { @Override public void process() { diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/FComponent.java b/src/test/java/com/thebeastshop/liteflow/test/component/FComponent.java index 73f9655e1..710a3284f 100644 --- a/src/test/java/com/thebeastshop/liteflow/test/component/FComponent.java +++ b/src/test/java/com/thebeastshop/liteflow/test/component/FComponent.java @@ -9,9 +9,12 @@ */ package com.thebeastshop.liteflow.test.component; -import com.thebeastshop.liteflow.core.Component; +import org.springframework.stereotype.Component; -public class FComponent extends Component { +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("f") +public class FComponent extends NodeComponent { @Override public void process() { diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/GComponent.java b/src/test/java/com/thebeastshop/liteflow/test/component/GComponent.java index 9b59ea375..fec1169aa 100644 --- a/src/test/java/com/thebeastshop/liteflow/test/component/GComponent.java +++ b/src/test/java/com/thebeastshop/liteflow/test/component/GComponent.java @@ -9,9 +9,12 @@ */ package com.thebeastshop.liteflow.test.component; -import com.thebeastshop.liteflow.core.Component; +import org.springframework.stereotype.Component; -public class GComponent extends Component { +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("g") +public class GComponent extends NodeComponent { @Override public void process() { diff --git a/src/test/resources/spring-test.xml b/src/test/resources/spring-test.xml new file mode 100644 index 000000000..4caa5f00f --- /dev/null +++ b/src/test/resources/spring-test.xml @@ -0,0 +1,20 @@ + + + + + + + + + + flow.xml + + + + \ No newline at end of file