Browse Source

feature #I63WME 希望支持Apollo配置中心配置规则功能

everywhere.z 2 years ago
parent
commit
341f1bc4ee

+ 18 - 5
liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/util/ApolloParseHelper.java

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.parser.apollo.util;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ReUtil;
 import cn.hutool.core.util.StrUtil;
 import com.ctrip.framework.apollo.Config;
@@ -14,6 +15,7 @@ import com.yomahub.liteflow.enums.NodeTypeEnum;
 import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.parser.apollo.exception.ApolloException;
 import com.yomahub.liteflow.parser.apollo.vo.ApolloParserConfigVO;
+import com.yomahub.liteflow.spi.holder.ContextAwareHolder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,12 +51,23 @@ public class ApolloParseHelper {
 
 	public ApolloParseHelper(ApolloParserConfigVO apolloParserConfigVO) {
 		this.apolloParserConfigVO = apolloParserConfigVO;
+
 		try {
-			chainConfig = ConfigService.getConfig(apolloParserConfigVO.getChainNamespace());
-			String scriptNamespace;
-			// scriptConfig is optional
-			if (StrUtil.isNotBlank(scriptNamespace = apolloParserConfigVO.getScriptNamespace())) {
-				scriptConfig = ConfigService.getConfig(scriptNamespace);
+			try{
+				//这里本身对于程序运行来说没有什么意义,拿到的永远是null
+				//其实config对象也没有注入到spring容器中
+				//这里这样写的目的是为了单测中的mockito,当有@MockBean的时候,这里就能拿到了
+				this.chainConfig = ContextAwareHolder.loadContextAware().getBean("chainConfig");
+				this.scriptConfig = ContextAwareHolder.loadContextAware().getBean("scriptConfig");
+			}catch (Exception ignored){}
+
+			if (ObjectUtil.isNull(chainConfig)){
+				chainConfig = ConfigService.getConfig(apolloParserConfigVO.getChainNamespace());
+				String scriptNamespace;
+				// scriptConfig is optional
+				if (StrUtil.isNotBlank(scriptNamespace = apolloParserConfigVO.getScriptNamespace())) {
+					scriptConfig = ConfigService.getConfig(scriptNamespace);
+				}
 			}
 		} catch (Exception e) {
 			throw new ApolloException(e.getMessage());

+ 1 - 0
liteflow-rule-plugin/pom.xml

@@ -15,6 +15,7 @@
         <module>liteflow-rule-sql</module>
         <module>liteflow-rule-nacos</module>
         <module>liteflow-rule-etcd</module>
+        <module>liteflow-rule-apollo</module>
     </modules>
 
     <artifactId>liteflow-rule-plugin</artifactId>

+ 33 - 14
liteflow-testcase-el/liteflow-testcase-el-apollo-springboot/src/test/java/com/yomahub/liteflow/test/apollo/ApolloWithXmlELSpringbootTest.java

@@ -1,19 +1,30 @@
 package com.yomahub.liteflow.test.apollo;
 
+import cn.hutool.core.util.StrUtil;
+import com.ctrip.framework.apollo.Config;
+import com.ctrip.framework.apollo.ConfigService;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.yomahub.liteflow.core.FlowExecutor;
 import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.flow.LiteflowResponse;
 import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit4.SpringRunner;
-
 import javax.annotation.Resource;
+import java.util.List;
+import java.util.Set;
+
+import static org.mockito.Mockito.*;
 
 /**
  * @Description:
@@ -27,30 +38,38 @@ import javax.annotation.Resource;
 @ComponentScan({"com.yomahub.liteflow.test.apollo.cmp"})
 public class ApolloWithXmlELSpringbootTest {
 
+	@MockBean(name = "chainConfig")
+	private Config chainConfig;
+
+	@MockBean(name = "scriptConfig")
+	private Config scriptConfig;
 
 	@Resource
 	private FlowExecutor flowExecutor;
 
+	@Before
+	public void setUp(){
+		MockitoAnnotations.initMocks(this);
+	}
+
 	@After
 	public void after() {
 		FlowBus.cleanCache();
 	}
 
-
 	@Test
-	public void testApolloWithXml1() throws InterruptedException {
-		LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
-		Assert.assertEquals("a==>b==>c==>s1[脚本s1]", response.getExecuteStepStrWithoutTime());
-	}
+	public void testApolloWithXml1(){
+		Set<String> chainNameList = Sets.newHashSet("chain1");
+		Set<String> scriptNodeValueList = Sets.newHashSet("s1:script:脚本s1");
+		when(chainConfig.getPropertyNames()).thenReturn(chainNameList);
+		when(scriptConfig.getPropertyNames()).thenReturn(scriptNodeValueList);
 
+		String chain1Data = "THEN(a, b, c, s1);";
+		String scriptNodeValue = "defaultContext.setData(\"test\",\"hello\");";
+		when(chainConfig.getProperty(anyString(), anyString())).thenReturn(chain1Data);
+		when(scriptConfig.getProperty(anyString(), anyString())).thenReturn(scriptNodeValue);
 
-	@Test
-	public void testApolloWithXml2() throws InterruptedException {
-		while (true) {
-			LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
-			System.out.println("liteflow step : " + response.getExecuteStepStrWithoutTime());
-			Thread.sleep(2000l);
-		}
+		LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
+		Assert.assertEquals("a==>b==>c==>s1[脚本s1]", response.getExecuteStepStrWithoutTime());
 	}
-
 }

+ 0 - 1
liteflow-testcase-el/liteflow-testcase-el-etcd-springboot/src/test/java/com/yomahub/liteflow/test/etcd/EtcdWithXmlELSpringbootTest.java

@@ -43,7 +43,6 @@ public class EtcdWithXmlELSpringbootTest extends BaseTest {
 
     private static final String SCRIPT_PATH = "/liteflow/script";
 
-
     @Before
     public void setUp(){
         MockitoAnnotations.initMocks(this);

+ 1 - 0
liteflow-testcase-el/pom.xml

@@ -28,6 +28,7 @@
         <module>liteflow-testcase-el-sql-springboot</module>
         <module>liteflow-testcase-el-nacos-springboot</module>
         <module>liteflow-testcase-el-etcd-springboot</module>
+        <module>liteflow-testcase-el-apollo-springboot</module>
     </modules>
 
     <build>