Ver código fonte

解决组件重试会多次rollback的问题

rain 1 ano atrás
pai
commit
6dbae72238
18 arquivos alterados com 203 adições e 1 exclusões
  1. 8 1
      liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java
  2. 8 0
      liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/rollback/RollbackELDeclMultiSpringbootTest.java
  3. 29 0
      liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/CmpConfig.java
  4. 4 0
      liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/rollback/flow.el.xml
  5. 8 0
      liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/RollbackELDeclSpringbootTest.java
  6. 4 0
      liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/rollback/flow.el.xml
  7. 8 0
      liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/RollbackTest.java
  8. 6 0
      liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/rollback/flow.el.xml
  9. 8 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringbootTest.java
  10. 4 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/rollback/flow.el.xml
  11. 10 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringbootTest.java
  12. 25 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/MCmp.java
  13. 20 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/NCmp.java
  14. 4 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/rollback/flow.el.xml
  15. 8 0
      liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringTest.java
  16. 25 0
      liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/MCmp.java
  17. 20 0
      liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/NCmp.java
  18. 4 0
      liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/rollback/flow.el.xml

+ 8 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java

@@ -7,6 +7,7 @@
  */
 package com.yomahub.liteflow.core;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.StopWatch;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -32,6 +33,7 @@ import com.yomahub.liteflow.monitor.CompStatistics;
 import com.yomahub.liteflow.monitor.MonitorBus;
 
 import java.lang.reflect.Method;
+import java.util.Deque;
 import java.util.Map;
 
 /**
@@ -156,10 +158,15 @@ public abstract class NodeComponent {
 
 	public void doRollback() throws Exception {
 		Slot slot = this.getSlot();
-
+		Deque<CmpStep> rollbackSteps = slot.getRollbackSteps();
+		if(!CollUtil.isEmpty(rollbackSteps)) {
+			Node refNode = rollbackSteps.peekLast().getRefNode();
+			if(refNode == this.getRefNode()) return;
+		}
 		CmpStep cmpStep = new CmpStep(nodeId, name, CmpStepTypeEnum.SINGLE);
 		cmpStep.setTag(this.getTag());
 		cmpStep.setInstance(this);
+		cmpStep.setRefNode(this.getRefNode());
 		slot.addRollbackStep(cmpStep);
 
 		StopWatch stopWatch = new StopWatch();

+ 8 - 0
liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/rollback/RollbackELDeclMultiSpringbootTest.java

@@ -100,4 +100,12 @@ public class RollbackELDeclMultiSpringbootTest extends BaseTest {
 		Assertions.assertEquals("321", context.getData("test"));
 	}
 
+	@Test
+	// 对重试的测试
+	public void testRetry() throws Exception {
+		LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg");
+		Assertions.assertFalse(response.isSuccess());
+		Assertions.assertEquals("n==>m", response.getRollbackStepStr());
+	}
+
 }

+ 29 - 0
liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/CmpConfig.java

@@ -3,6 +3,7 @@ package com.yomahub.liteflow.test.rollback.cmp;
 import cn.hutool.core.collection.ListUtil;
 import com.yomahub.liteflow.annotation.LiteflowComponent;
 import com.yomahub.liteflow.annotation.LiteflowMethod;
+import com.yomahub.liteflow.annotation.LiteflowRetry;
 import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
 import com.yomahub.liteflow.enums.NodeTypeEnum;
@@ -145,4 +146,32 @@ public class CmpConfig {
         System.out.println("XCmp rollback!");
     }
 
+    private int flag = 0;
+    @LiteflowRetry(5)
+    @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "m")
+    public void processM(NodeComponent bindCmp) {
+        if(flag < 2) {
+            flag ++;
+            throw new RuntimeException();
+        }
+        System.out.println("MCmp executed!");
+    }
+
+    @LiteflowMethod(value = LiteFlowMethodEnum.ROLLBACK, nodeId = "m")
+    public void rollbackM() throws Exception {
+        System.out.println("MCmp rollback!");
+    }
+
+    @LiteflowRetry(3)
+    @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "n")
+    public void processN(NodeComponent bindCmp) {
+        System.out.println("NCmp executed!");
+        throw new RuntimeException();
+    }
+
+    @LiteflowMethod(value = LiteFlowMethodEnum.ROLLBACK, nodeId = "n")
+    public void rollbackN() throws Exception {
+        System.out.println("NCmp rollback!");
+    }
+
 }

+ 4 - 0
liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/rollback/flow.el.xml

@@ -35,4 +35,8 @@
     <chain name="chain9">
         THEN(a.tag("1"), a.tag("2"), a.tag("3"), d);
     </chain>
+
+    <chain name="chain10">
+        THEN( m, n );
+    </chain>
 </flow>

+ 8 - 0
liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/RollbackELDeclSpringbootTest.java

@@ -102,4 +102,12 @@ public class RollbackELDeclSpringbootTest extends BaseTest {
 		Assertions.assertEquals("321", context.getData("test"));
 	}
 
+	@Test
+	// 对重试的测试
+	public void testRetry() throws Exception {
+		LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg");
+		Assertions.assertFalse(response.isSuccess());
+		Assertions.assertEquals("n==>m", response.getRollbackStepStr());
+	}
+
 }

+ 4 - 0
liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/rollback/flow.el.xml

@@ -35,4 +35,8 @@
     <chain name="chain9">
         THEN(a.tag("1"), a.tag("2"), a.tag("3"), d);
     </chain>
+
+    <chain name="chain10">
+        THEN( m, n );
+    </chain>
 </flow>

+ 8 - 0
liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/RollbackTest.java

@@ -99,4 +99,12 @@ public class RollbackTest extends BaseTest {
 		Assertions.assertEquals("321", context.getData("test"));
 	}
 
+	@Test
+	// 对重试的测试
+	public void testRetry() throws Exception {
+		LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg");
+		Assertions.assertFalse(response.isSuccess());
+		Assertions.assertEquals("n==>m", response.getRollbackStepStr());
+	}
+
 }

+ 6 - 0
liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/rollback/flow.el.xml

@@ -12,6 +12,8 @@
         <node id="i" class="com.yomahub.liteflow.test.rollback.cmp.ICmp"/>
         <node id="w" class="com.yomahub.liteflow.test.rollback.cmp.WCmp"/>
         <node id="x" class="com.yomahub.liteflow.test.rollback.cmp.XCmp"/>
+        <node id="m" class="com.yomahub.liteflow.test.rollback.cmp.MCmp"/>
+        <node id="n" class="com.yomahub.liteflow.test.rollback.cmp.NCmp"/>
     </nodes>
     <chain name="chain1">
         THEN( a, b, WHEN(c, d).ignoreError(true), CATCH(e) );
@@ -48,4 +50,8 @@
     <chain name="chain9">
         THEN(a.tag("1"), a.tag("2"), a.tag("3"), d);
     </chain>
+
+    <chain name="chain10">
+        THEN( m, n );
+    </chain>
 </flow>

+ 8 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringbootTest.java

@@ -94,4 +94,12 @@ public class RollbackSpringbootTest extends BaseTest {
 		Assertions.assertEquals("321", context.getData("test"));
 	}
 
+	@Test
+	// 对重试的测试
+	public void testRetry() throws Exception {
+		LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg");
+		Assertions.assertFalse(response.isSuccess());
+		Assertions.assertEquals("n==>m", response.getRollbackStepStr());
+	}
+
 }

+ 4 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/rollback/flow.el.xml

@@ -35,4 +35,8 @@
     <chain name="chain9">
         THEN(a.tag("1"), a.tag("2"), a.tag("3"), d);
     </chain>
+
+    <chain name="chain10">
+        THEN( m, n );
+    </chain>
 </flow>

+ 10 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringbootTest.java

@@ -2,6 +2,8 @@ package com.yomahub.liteflow.test.rollback;
 
 import com.yomahub.liteflow.core.FlowExecutor;
 import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
 import com.yomahub.liteflow.slot.DefaultContext;
 import com.yomahub.liteflow.test.BaseTest;
 import org.junit.jupiter.api.Assertions;
@@ -97,4 +99,12 @@ public class RollbackSpringbootTest extends BaseTest {
 		Assertions.assertFalse(response.isSuccess());
 		Assertions.assertEquals("321", context.getData("test"));
 	}
+
+	@Test
+	// 对重试的测试
+	public void testRetry() throws Exception {
+		LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg");
+		Assertions.assertFalse(response.isSuccess());
+		Assertions.assertEquals("n==>m", response.getRollbackStepStr());
+	}
 }

+ 25 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/MCmp.java

@@ -0,0 +1,25 @@
+package com.yomahub.liteflow.test.rollback.cmp;
+
+import com.yomahub.liteflow.annotation.LiteflowRetry;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("m")
+@LiteflowRetry(5)
+public class MCmp extends NodeComponent {
+
+    private int flag = 0;
+    @Override
+    public void process() {
+        if(flag < 2) {
+            flag ++;
+            throw new RuntimeException();
+        }
+        System.out.println("MCmp executed!");
+    }
+
+    @Override
+    public void rollback() throws Exception {
+        System.out.println("MCmp rollback!");
+    }
+}

+ 20 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/NCmp.java

@@ -0,0 +1,20 @@
+package com.yomahub.liteflow.test.rollback.cmp;
+
+import com.yomahub.liteflow.annotation.LiteflowRetry;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("n")
+@LiteflowRetry(3)
+public class NCmp extends NodeComponent {
+    @Override
+    public void process() {
+        System.out.println("NCmp executed!");
+        throw new RuntimeException();
+    }
+
+    @Override
+    public void rollback() throws Exception {
+        System.out.println("NCmp rollback!");
+    }
+}

+ 4 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/rollback/flow.el.xml

@@ -35,4 +35,8 @@
     <chain name="chain9">
         THEN(a.tag("1"), a.tag("2"), a.tag("3"), d);
     </chain>
+
+    <chain name="chain10">
+        THEN( m, n );
+    </chain>
 </flow>

+ 8 - 0
liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringTest.java

@@ -95,5 +95,13 @@ public class RollbackSpringTest extends BaseTest {
 		Assertions.assertEquals("321", context.getData("test"));
 	}
 
+	@Test
+	// 对重试的测试
+	public void testRetry() throws Exception {
+		LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg");
+		Assertions.assertFalse(response.isSuccess());
+		Assertions.assertEquals("n==>m", response.getRollbackStepStr());
+	}
+
 
 }

+ 25 - 0
liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/MCmp.java

@@ -0,0 +1,25 @@
+package com.yomahub.liteflow.test.rollback.cmp;
+
+import com.yomahub.liteflow.annotation.LiteflowRetry;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("m")
+@LiteflowRetry(5)
+public class MCmp extends NodeComponent {
+
+    private int flag = 0;
+    @Override
+    public void process() {
+        if(flag < 2) {
+            flag ++;
+            throw new RuntimeException();
+        }
+        System.out.println("MCmp executed!");
+    }
+
+    @Override
+    public void rollback() throws Exception {
+        System.out.println("MCmp rollback!");
+    }
+}

+ 20 - 0
liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/NCmp.java

@@ -0,0 +1,20 @@
+package com.yomahub.liteflow.test.rollback.cmp;
+
+import com.yomahub.liteflow.annotation.LiteflowRetry;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("n")
+@LiteflowRetry(3)
+public class NCmp extends NodeComponent {
+    @Override
+    public void process() {
+        System.out.println("NCmp executed!");
+        throw new RuntimeException();
+    }
+
+    @Override
+    public void rollback() throws Exception {
+        System.out.println("NCmp rollback!");
+    }
+}

+ 4 - 0
liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/rollback/flow.el.xml

@@ -35,4 +35,8 @@
     <chain name="chain9">
         THEN(a.tag("1"), a.tag("2"), a.tag("3"), d);
     </chain>
+
+    <chain name="chain10">
+        THEN( m, n );
+    </chain>
 </flow>