Title: litis
- *Description: redis的全方位开发运维平台
+ *Title: liteFlow
+ *Description: 轻量级的组件式流程框架
*Copyright: Copyright (c) 2017
* @author Bryan.Zhang - * @email 47483522@qq.com - * @Date 2017-11-28 + * @email weenyc31@163.com + * @Date 2017-7-28 + * @version 1.0 */ package com.thebeastshop.liteflow.core; +import org.springframework.stereotype.Component; + public abstract class NodeCondComponent extends NodeComponent { @Override protected void process() throws Exception { - String nodeId = this.processCond(); + Class> clazz = this.processCond(); + Component component = clazz.getAnnotation(Component.class); + String nodeId = component.value(); this.getSlot().setCondResult(this.getClass().getName(), nodeId); } - protected abstract String processCond() throws Exception; + protected abstract Class extends NodeComponent> processCond() throws Exception; } diff --git a/src/main/java/com/thebeastshop/liteflow/entity/config/Chain.java b/src/main/java/com/thebeastshop/liteflow/entity/config/Chain.java index 1c4f22a81..bd28dcf5f 100644 --- a/src/main/java/com/thebeastshop/liteflow/entity/config/Chain.java +++ b/src/main/java/com/thebeastshop/liteflow/entity/config/Chain.java @@ -13,9 +13,12 @@ import java.util.List; public class Chain { + private String chainName; + private ListTitle: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-8-3 + * @version 1.0 + */ +package com.thebeastshop.liteflow.entity.data; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@SuppressWarnings("unchecked") +public abstract class AbsSlot implements Slot{ + + private static final Logger LOG = LoggerFactory.getLogger(Slot.class); + + private final String REQUEST = "request"; + + private final String RESPONSE = "response"; + + private final String CHAINNAME = "chain_name"; + + private final String COND_NODE_PREFIX = "cond_"; + + private final String NODE_INPUT_PREFIX = "input_"; + + private final String NODE_OUTPUT_PREFIX = "output_"; + + private final String CHAIN_REQ_PREFIX = "chain_req_"; + + private final String REQUEST_ID = "req_id"; + + private DequeTitle: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-12-8 + * @version 1.0 + */ +package com.thebeastshop.liteflow.entity.data; + +import java.text.MessageFormat; + +public class CmpStep { + private String nodeId; + + private CmpStepType stepType; + + public CmpStep(String nodeId, CmpStepType stepType) { + this.nodeId = nodeId; + this.stepType = stepType; + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public CmpStepType getStepType() { + return stepType; + } + + public void setStepType(CmpStepType stepType) { + this.stepType = stepType; + } + + @Override + public String toString() { + if(stepType.equals(CmpStepType.SINGLE)) { + return MessageFormat.format("{0}", nodeId); + }else { + return MessageFormat.format("{0}({1})", nodeId,stepType); + } + + + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + }else { + if(getClass() != obj.getClass()) { + return false; + }else { + if(((CmpStep)obj).getNodeId().equals(this.getNodeId())) { + return true; + }else { + return false; + } + } + } + } +} diff --git a/src/main/java/com/thebeastshop/liteflow/entity/data/CmpStepType.java b/src/main/java/com/thebeastshop/liteflow/entity/data/CmpStepType.java new file mode 100644 index 000000000..29e3b0524 --- /dev/null +++ b/src/main/java/com/thebeastshop/liteflow/entity/data/CmpStepType.java @@ -0,0 +1,16 @@ +/** + *Title: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-12-8 + * @version 1.0 + */ +package com.thebeastshop.liteflow.entity.data; + +public enum CmpStepType { + START, + END, + SINGLE; +} diff --git a/src/main/java/com/thebeastshop/liteflow/entity/data/DataBus.java b/src/main/java/com/thebeastshop/liteflow/entity/data/DataBus.java index dbbebe441..d0e483796 100644 --- a/src/main/java/com/thebeastshop/liteflow/entity/data/DataBus.java +++ b/src/main/java/com/thebeastshop/liteflow/entity/data/DataBus.java @@ -24,27 +24,34 @@ public class DataBus { private static Slot[] slots = new Slot[SLOT_SIZE]; - public synchronized static int offerSlot(){ - for(int i = 0; i < slots.length; i++){ - if(slots[i] == null){ - slots[i] = new Slot(); - OCCUPY_COUNT.incrementAndGet(); - return i; + public synchronized static int offerSlot(Class extends Slot> slotClazz){ + try{ + for(int i = 0; i < slots.length; i++){ + if(slots[i] == null){ + slots[i] = slotClazz.newInstance(); + OCCUPY_COUNT.incrementAndGet(); + return i; + } } + }catch(Exception e){ + LOG.error("offer slot error",e); + return -1; } return -1; } - public static Slot getSlot(int slotIndex){ - return slots[slotIndex]; + @SuppressWarnings("unchecked") + public staticTitle: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-12-4 + * @version 1.0 + */ +package com.thebeastshop.liteflow.entity.data; + +public class DefaultSlot extends AbsSlot { + +} diff --git a/src/main/java/com/thebeastshop/liteflow/entity/data/Slot.java b/src/main/java/com/thebeastshop/liteflow/entity/data/Slot.java index ce2f3a965..7b9913406 100644 --- a/src/main/java/com/thebeastshop/liteflow/entity/data/Slot.java +++ b/src/main/java/com/thebeastshop/liteflow/entity/data/Slot.java @@ -4,97 +4,49 @@ *Copyright: Copyright (c) 2017
* @author Bryan.Zhang * @email weenyc31@163.com - * @Date 2017-8-3 + * @Date 2017-12-4 * @version 1.0 */ package com.thebeastshop.liteflow.entity.data; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@SuppressWarnings("unchecked") -public class Slot { +public interface Slot { + publicTitle: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-8-1 + * @version 1.0 + */ +package com.thebeastshop.liteflow.test.component; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import com.thebeastshop.liteflow.core.FlowExecutor; +import com.thebeastshop.liteflow.core.NodeComponent; +import com.thebeastshop.liteflow.entity.data.DefaultSlot; + +@Component("h") +public class HComponent extends NodeComponent { + + @Resource + private FlowExecutor flowExecutor; + + @Override + public void process() { + System.out.println("Hcomponent executed!"); + flowExecutor.invoke("strategy1",3, DefaultSlot.class, this.getSlotIndex()); + } + +} diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/M1Component.java b/src/test/java/com/thebeastshop/liteflow/test/component/M1Component.java new file mode 100644 index 000000000..9efbb153f --- /dev/null +++ b/src/test/java/com/thebeastshop/liteflow/test/component/M1Component.java @@ -0,0 +1,30 @@ +/** + *Title: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-8-1 + * @version 1.0 + */ +package com.thebeastshop.liteflow.test.component; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import com.thebeastshop.liteflow.core.FlowExecutor; +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("m1") +public class M1Component extends NodeComponent { + + @Resource + private FlowExecutor flowExecutor; + + @Override + public void process() { + System.out.println("m1 component executed!"); + } + +} diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/M2Component.java b/src/test/java/com/thebeastshop/liteflow/test/component/M2Component.java new file mode 100644 index 000000000..96a6bf906 --- /dev/null +++ b/src/test/java/com/thebeastshop/liteflow/test/component/M2Component.java @@ -0,0 +1,30 @@ +/** + *Title: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-8-1 + * @version 1.0 + */ +package com.thebeastshop.liteflow.test.component; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import com.thebeastshop.liteflow.core.FlowExecutor; +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("m2") +public class M2Component extends NodeComponent { + + @Resource + private FlowExecutor flowExecutor; + + @Override + public void process() { + System.out.println("m2 component executed!"); + } + +} diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/M3Component.java b/src/test/java/com/thebeastshop/liteflow/test/component/M3Component.java new file mode 100644 index 000000000..13926b7ce --- /dev/null +++ b/src/test/java/com/thebeastshop/liteflow/test/component/M3Component.java @@ -0,0 +1,32 @@ +/** + *Title: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-8-1 + * @version 1.0 + */ +package com.thebeastshop.liteflow.test.component; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import com.thebeastshop.liteflow.core.FlowExecutor; +import com.thebeastshop.liteflow.core.NodeComponent; +import com.thebeastshop.liteflow.entity.data.DefaultSlot; + +@Component("m3") +public class M3Component extends NodeComponent { + + @Resource + private FlowExecutor flowExecutor; + + @Override + public void process() { + System.out.println("m3 component executed!"); + flowExecutor.invoke("strategy2",10, DefaultSlot.class, this.getSlotIndex()); + } + +} diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/MComponent.java b/src/test/java/com/thebeastshop/liteflow/test/component/MComponent.java new file mode 100644 index 000000000..4846a4730 --- /dev/null +++ b/src/test/java/com/thebeastshop/liteflow/test/component/MComponent.java @@ -0,0 +1,40 @@ +/** + *Title: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-8-1 + * @version 1.0 + */ +package com.thebeastshop.liteflow.test.component; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import com.thebeastshop.liteflow.core.FlowExecutor; +import com.thebeastshop.liteflow.core.NodeComponent; +import com.thebeastshop.liteflow.core.NodeCondComponent; + +@Component("m") +public class MComponent extends NodeCondComponent { + + @Resource + private FlowExecutor flowExecutor; + + @Override + protected Class extends NodeComponent> processCond() throws Exception { + System.out.println("m conponent executed"); + Integer flag = this.getSlot().getChainReqData("strategy1"); + if(flag == 1) { + return M1Component.class; + }else if(flag == 2){ + return M2Component.class; + }else { + return M3Component.class; + } + + } + +} diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/P1Component.java b/src/test/java/com/thebeastshop/liteflow/test/component/P1Component.java new file mode 100644 index 000000000..c0f1a0c00 --- /dev/null +++ b/src/test/java/com/thebeastshop/liteflow/test/component/P1Component.java @@ -0,0 +1,30 @@ +/** + *Title: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-8-1 + * @version 1.0 + */ +package com.thebeastshop.liteflow.test.component; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import com.thebeastshop.liteflow.core.FlowExecutor; +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("p1") +public class P1Component extends NodeComponent { + + @Resource + private FlowExecutor flowExecutor; + + @Override + public void process() { + System.out.println("p1 component executed!"); + } + +} diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/P2Component.java b/src/test/java/com/thebeastshop/liteflow/test/component/P2Component.java new file mode 100644 index 000000000..d60947c16 --- /dev/null +++ b/src/test/java/com/thebeastshop/liteflow/test/component/P2Component.java @@ -0,0 +1,30 @@ +/** + *Title: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-8-1 + * @version 1.0 + */ +package com.thebeastshop.liteflow.test.component; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import com.thebeastshop.liteflow.core.FlowExecutor; +import com.thebeastshop.liteflow.core.NodeComponent; + +@Component("p2") +public class P2Component extends NodeComponent { + + @Resource + private FlowExecutor flowExecutor; + + @Override + public void process() { + System.out.println("p2 component executed!"); + } + +} diff --git a/src/test/java/com/thebeastshop/liteflow/test/component/PComponent.java b/src/test/java/com/thebeastshop/liteflow/test/component/PComponent.java new file mode 100644 index 000000000..d4f962bff --- /dev/null +++ b/src/test/java/com/thebeastshop/liteflow/test/component/PComponent.java @@ -0,0 +1,38 @@ +/** + *Title: liteFlow
+ *Description: 轻量级的组件式流程框架
+ *Copyright: Copyright (c) 2017
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2017-8-1 + * @version 1.0 + */ +package com.thebeastshop.liteflow.test.component; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import com.thebeastshop.liteflow.core.FlowExecutor; +import com.thebeastshop.liteflow.core.NodeComponent; +import com.thebeastshop.liteflow.core.NodeCondComponent; + +@Component("p") +public class PComponent extends NodeCondComponent { + + @Resource + private FlowExecutor flowExecutor; + + @Override + protected Class extends NodeComponent> processCond() throws Exception { + System.out.println("p conponent executed"); + Integer flag = this.getSlot().getChainReqData("strategy2"); + if(flag == 10) { + return P1Component.class; + }else { + return P2Component.class; + } + + } + +} diff --git a/src/test/resources/flow.xml b/src/test/resources/config/flow.xml similarity index 69% rename from src/test/resources/flow.xml rename to src/test/resources/config/flow.xml index dfa1dc4bf..25f111ce6 100644 --- a/src/test/resources/flow.xml +++ b/src/test/resources/config/flow.xml @@ -13,19 +13,25 @@