diff --git a/README.md b/README.md
index 6a013a48..d138cfdb 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,8 @@
flow-eda 项目是一种基于事件驱动的流式低代码编程应用程序,它的主要功能是采用可视化编程,以拖拽节点、连接组合节点的形式来完成流程绘制,达到低代码开发和实现业务编程的目的。
+此分支使用 Feign 替代了 Dubbo+Nacos 的技术方案,方便用户本地调试。使用此分支无需安装 Nacos,本地启动应用仅需要 Mysql 数据库和 RabbitMQ 服务即可,各服务之间采用 Feign 进行 http 调用。
+
欢迎各路大神共同参与开发,项目持续扩展完善中
#### 项目名称
diff --git a/docker-compose.yml b/docker-compose.yml
index dfe70361..de8e8a9c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -20,25 +20,6 @@ services:
- "15672:15672"
volumes:
- /root/app/rabbitmq/data:/var/lib/rabbitmq
- nacos:
- image: nacos/nacos-server
- container_name: nacos
- depends_on:
- - mysql
- ports:
- - "8848:8848"
- - "9848:9848"
- - "9849:9849"
- environment:
- MODE: standalone
- SPRING_DATASOURCE_PLATFORM: mysql
- MYSQL_SERVICE_HOST: mysql
- MYSQL_SERVICE_USER: root
- MYSQL_SERVICE_PASSWORD: 123456
- MYSQL_SERVICE_DB_NAME: nacos_config
- JVM_XMS: 256m
- JVM_XMX: 256m
- JVM_XMN: 256m
nginx:
image: nginx
container_name: nginx
diff --git a/docs/version/changelog.md b/docs/version/changelog.md
index f9dd10af..33355bf6 100644
--- a/docs/version/changelog.md
+++ b/docs/version/changelog.md
@@ -26,6 +26,15 @@
- 2022-09-27:实现运行子流程功能
- 2022-09-26:新增子流程节点,可选择其他流程作为子流程
+### v3.0.0
+
+- 2022-10-11:更新子流程相关项目文档
+- 2022-10-10:修复条件节点自定义参数被覆盖的问题
+- 2022-09-30:新增子输入/子输出节点,可连接父子流程之间的输入输出参数
+- 2022-09-28:关闭编辑器页面时弹出提醒确认框
+- 2022-09-27:实现运行子流程功能
+- 2022-09-26:新增子流程节点,可选择其他流程作为子流程
+
### v2.2.0
- 2022-08-24:修复切流程图换版本后重复连线问题
diff --git a/flow-eda-common/pom.xml b/flow-eda-common/pom.xml
index d8e292d0..5b35612e 100644
--- a/flow-eda-common/pom.xml
+++ b/flow-eda-common/pom.xml
@@ -33,14 +33,9 @@
4.5.1
- org.apache.dubbo
- dubbo-registry-nacos
- 3.0.7
-
-
- org.apache.dubbo
- dubbo-spring-boot-starter
- 3.0.7
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ 3.1.1
org.springframework.boot
diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowDataService.java b/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowDataService.java
deleted file mode 100644
index dd25f5f4..00000000
--- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowDataService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.flow.eda.common.dubbo.api;
-
-import com.flow.eda.common.dubbo.model.FlowData;
-
-import java.util.List;
-
-/** 流数据接口 */
-public interface FlowDataService {
- /**
- * 运行当前流程
- *
- * @param data 流数据
- */
- void runFlowData(List data);
-
- /**
- * 停止当前流程
- *
- * @param flowId 流程id
- */
- void stopFlowData(String flowId);
-
- /**
- * 清理当前流程缓存数据(流程运行结束后调用)
- *
- * @param flowId 流程id
- */
- void clearFlowData(String flowId);
-}
diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowInfoService.java b/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowInfoService.java
deleted file mode 100644
index 3010d824..00000000
--- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowInfoService.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.flow.eda.common.dubbo.api;
-
-import com.flow.eda.common.dubbo.model.FlowData;
-
-import java.util.List;
-
-/** 获取流程信息接口 */
-public interface FlowInfoService {
- /**
- * 获取流程状态
- *
- * @param flowId 流程id
- * @return 返回流程当前状态
- */
- String getFlowStatus(String flowId);
-
- /**
- * 获取流程节点数据
- *
- * @param flowId 流程id
- * @return 返回流程节点数据
- */
- List getFlowData(String flowId);
-}
diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/LogsService.java b/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/LogsService.java
deleted file mode 100644
index 55804ee0..00000000
--- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/LogsService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.flow.eda.common.dubbo.api;
-
-import com.flow.eda.common.dubbo.model.Logs;
-
-import java.util.List;
-
-/** 日志服务接口 */
-public interface LogsService {
-
- /**
- * 获取日志信息列表
- *
- * @param type 日志类型
- * @return 日志信息列表
- */
- List getLogList(Type type);
-
- /**
- * 删除日志文件
- *
- * @param path 日志文件路径
- */
- void deleteLogFiles(List path);
-
- /** 日志类型 */
- enum Type {
- /** 操作日志 */
- OPERATION,
- /** 运行日志 */
- RUNNING
- }
-}
diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/FlowData.java b/flow-eda-common/src/main/java/com/flow/eda/common/model/FlowData.java
similarity index 92%
rename from flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/FlowData.java
rename to flow-eda-common/src/main/java/com/flow/eda/common/model/FlowData.java
index 10d079a5..77096d52 100644
--- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/FlowData.java
+++ b/flow-eda-common/src/main/java/com/flow/eda/common/model/FlowData.java
@@ -1,4 +1,4 @@
-package com.flow.eda.common.dubbo.model;
+package com.flow.eda.common.model;
import lombok.Data;
import org.bson.Document;
diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/Logs.java b/flow-eda-common/src/main/java/com/flow/eda/common/model/Logs.java
similarity index 96%
rename from flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/Logs.java
rename to flow-eda-common/src/main/java/com/flow/eda/common/model/Logs.java
index 2870e691..083a09b4 100644
--- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/Logs.java
+++ b/flow-eda-common/src/main/java/com/flow/eda/common/model/Logs.java
@@ -1,4 +1,4 @@
-package com.flow.eda.common.dubbo.model;
+package com.flow.eda.common.model;
import lombok.Getter;
diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/resource/FeignOauth2RequestInterceptor.java b/flow-eda-common/src/main/java/com/flow/eda/common/resource/FeignOauth2RequestInterceptor.java
new file mode 100644
index 00000000..43a1085b
--- /dev/null
+++ b/flow-eda-common/src/main/java/com/flow/eda/common/resource/FeignOauth2RequestInterceptor.java
@@ -0,0 +1,71 @@
+package com.flow.eda.common.resource;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.bson.Document;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Base64;
+
+/** 自定义Feign的请求拦截器,用于微服务之间调用时的oauth2认证 */
+@Configuration
+public class FeignOauth2RequestInterceptor implements RequestInterceptor {
+ private static final String TOKEN_URL =
+ "http://localhost:8086/oauth/token?grant_type=client_credentials";
+ private static final String AUTH = "Authorization";
+ private static final String BEARER = "Bearer ";
+
+ @Value("${security.oauth2.client-id}")
+ private String clientId;
+
+ @Value("${security.oauth2.client-secret}")
+ private String clientSecret;
+
+ @Bean
+ @ConditionalOnMissingClass
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+ @Override
+ public void apply(RequestTemplate requestTemplate) {
+ // 获取请求中的token,设置到header中
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ if (authentication != null
+ && authentication.getDetails() instanceof OAuth2AuthenticationDetails) {
+ OAuth2AuthenticationDetails details =
+ (OAuth2AuthenticationDetails) authentication.getDetails();
+ requestTemplate.header(AUTH, BEARER + details.getTokenValue());
+ } else {
+ // 若请求中无token,则通过客户端模式向oauth2申请一个token,设置到header中
+ String basic =
+ Base64.getEncoder()
+ .encodeToString(
+ String.format("%s:%s", clientId, clientSecret).getBytes());
+ HttpHeaders headers = new HttpHeaders();
+ headers.set(AUTH, "Basic " + basic);
+ // 发送请求
+ Document response =
+ restTemplate()
+ .exchange(
+ TOKEN_URL,
+ HttpMethod.POST,
+ new HttpEntity<>(headers),
+ Document.class)
+ .getBody();
+ if (response != null) {
+ requestTemplate.header(AUTH, BEARER + response.getString("access_token"));
+ }
+ }
+ }
+}
diff --git a/flow-eda-logger/src/main/java/com/flow/eda/logger/FlowEdaLoggerApplication.java b/flow-eda-logger/src/main/java/com/flow/eda/logger/FlowEdaLoggerApplication.java
index b723fdd4..77f79b17 100644
--- a/flow-eda-logger/src/main/java/com/flow/eda/logger/FlowEdaLoggerApplication.java
+++ b/flow-eda-logger/src/main/java/com/flow/eda/logger/FlowEdaLoggerApplication.java
@@ -1,18 +1,18 @@
package com.flow.eda.logger;
-import com.flow.eda.logger.logs.LogsServiceImpl;
-import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
-@EnableDubbo
-@DubboComponentScan(basePackageClasses = LogsServiceImpl.class)
@SpringBootApplication
-@ComponentScan(basePackages = {"com.flow.eda.logger", "com.flow.eda.common.resource"})
+@ComponentScan(
+ basePackages = {
+ "com.flow.eda.logger",
+ "com.flow.eda.common.config",
+ "com.flow.eda.common.resource"
+ })
public class FlowEdaLoggerApplication {
public static void main(String[] args) {
diff --git a/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsServiceImpl.java b/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java
similarity index 69%
rename from flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsServiceImpl.java
rename to flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java
index e86326d0..aa8895c5 100644
--- a/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsServiceImpl.java
+++ b/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java
@@ -1,32 +1,43 @@
package com.flow.eda.logger.logs;
-import com.flow.eda.common.dubbo.api.LogsService;
-import com.flow.eda.common.dubbo.model.Logs;
+import com.flow.eda.common.http.Result;
+import com.flow.eda.common.model.Logs;
import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboService;
-import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
+/** 日志服务接口 */
@Slf4j
-@Service
-@DubboService(interfaceClass = LogsService.class)
-public class LogsServiceImpl implements LogsService {
+@RestController
+@RequestMapping("/api/v1/feign")
+public class LogsController {
private static final String ROOT = System.getProperty("user.dir");
- @Override
- public List getLogList(Type type) {
+ /**
+ * 获取日志信息列表
+ *
+ * @param type 日志类型
+ * @return 日志信息列表
+ */
+ @GetMapping("/logs")
+ public Result> getLogList(@RequestParam Type type) {
if (Type.OPERATION == type) {
- return getOperationLogs();
+ return Result.of(getOperationLogs());
} else {
- return getRunningLogs();
+ return Result.of(getRunningLogs());
}
}
- @Override
- public void deleteLogFiles(List path) {
+ /**
+ * 删除日志文件
+ *
+ * @param path 日志文件路径
+ */
+ @DeleteMapping("/logs")
+ public void deleteLogs(@RequestBody List path) {
path.forEach(this::deleteLogFile);
}
@@ -81,4 +92,12 @@ private void deleteLogFile(String path) {
} catch (Exception ignored) {
}
}
+
+ /** 日志类型 */
+ enum Type {
+ /** 操作日志 */
+ OPERATION,
+ /** 运行日志 */
+ RUNNING
+ }
}
diff --git a/flow-eda-logger/src/main/resources/application.yaml b/flow-eda-logger/src/main/resources/application.yaml
index b9f1e974..7b2dc14c 100644
--- a/flow-eda-logger/src/main/resources/application.yaml
+++ b/flow-eda-logger/src/main/resources/application.yaml
@@ -8,29 +8,9 @@ spring:
port: 5672
username: guest
password: guest
-dubbo:
- application:
- name: flow-eda-logger
- qos-enable: false
- qos-accept-foreign-ip: false
- registry:
- protocol: dubbo
- address: nacos://localhost:8848
- username: nacos
- password: nacos
- protocol:
- name: dubbo
- port: 20883
- consumer:
- check: false
- timeout: 5000
- retries: 0
security:
oauth2:
resource-id: flow-eda
client-id: 1df7b0c1-aac0-148a14c7cba8
client-secret: zcUaT32GlwIjz4yBJjYZIIMvzf
check-token-url: http://localhost:8086/oauth/check_token
-logging:
- level:
- com.alibaba.nacos.common.remote.client: warn
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java
index 7adb0284..a52f5739 100644
--- a/flow-eda-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java
@@ -2,22 +2,25 @@
import com.flow.eda.runner.node.http.HttpDispatcherServlet;
import com.flow.eda.runner.utils.ApplicationContextUtil;
-import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
+import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.DispatcherServlet;
-@EnableDubbo
-@DubboComponentScan(basePackages = "com.flow.eda.runner.data")
+@EnableFeignClients
@SpringBootApplication(exclude = MongoAutoConfiguration.class)
-@ComponentScan(basePackages = {"com.flow.eda.runner", "com.flow.eda.common.resource"})
+@ComponentScan(
+ basePackages = {
+ "com.flow.eda.runner",
+ "com.flow.eda.common.config",
+ "com.flow.eda.common.resource"
+ })
public class FlowEdaRunnerApplication {
public static void main(String[] args) {
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataController.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataController.java
new file mode 100644
index 00000000..a469d820
--- /dev/null
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataController.java
@@ -0,0 +1,45 @@
+package com.flow.eda.runner.data;
+
+import com.flow.eda.common.model.FlowData;
+import com.flow.eda.runner.runtime.FlowDataRuntime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/** 流程数据接口 */
+@RestController
+@RequestMapping("/api/v1/feign")
+public class FlowDataController {
+ @Autowired private FlowDataRuntime flowDataRuntime;
+
+ /**
+ * 运行当前流程
+ *
+ * @param data 流数据
+ */
+ @PostMapping("/flow/run")
+ public void runFlowData(@RequestBody List data) {
+ flowDataRuntime.runFlowData(data);
+ }
+
+ /**
+ * 停止当前流程
+ *
+ * @param flowId 流程id
+ */
+ @PostMapping("/flow/stop")
+ public void stopFlowData(@RequestParam String flowId) {
+ flowDataRuntime.stopFlowData(flowId);
+ }
+
+ /**
+ * 清理当前流程缓存数据(流程运行结束后调用)
+ *
+ * @param flowId 流程id
+ */
+ @PostMapping("/flow/clear")
+ public void clearFlowData(@RequestParam String flowId) {
+ flowDataRuntime.clearFlowData(flowId);
+ }
+}
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataServiceImpl.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataServiceImpl.java
deleted file mode 100644
index a7abec60..00000000
--- a/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataServiceImpl.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.flow.eda.runner.data;
-
-import com.flow.eda.common.dubbo.api.FlowDataService;
-import com.flow.eda.common.dubbo.model.FlowData;
-import com.flow.eda.runner.runtime.FlowDataRuntime;
-import org.apache.dubbo.config.annotation.DubboService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@DubboService(interfaceClass = FlowDataService.class)
-public class FlowDataServiceImpl implements FlowDataService {
- @Autowired private FlowDataRuntime flowDataRuntime;
-
- @Override
- public void runFlowData(List data) {
- flowDataRuntime.runFlowData(data);
- }
-
- @Override
- public void stopFlowData(String flowId) {
- flowDataRuntime.stopFlowData(flowId);
- }
-
- @Override
- public void clearFlowData(String flowId) {
- flowDataRuntime.clearFlowData(flowId);
- }
-}
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/AbstractNode.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/AbstractNode.java
index 7c42a067..da003db5 100644
--- a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/AbstractNode.java
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/AbstractNode.java
@@ -5,16 +5,17 @@
import java.util.Optional;
+import static com.flow.eda.runner.utils.PlaceholderUtil.OBJECT_MAPPER;
+
/** 节点抽象类 */
public abstract class AbstractNode implements Node {
- /** 输入参数,由上个节点传递至此 */
- private final Document input;
-
private final String flowId;
private final String nodeId;
/** 节点自定义参数,可传递至下个节点 */
private Document payload;
+ /** 输入参数,由上个节点传递至此 */
+ private Document input;
/** 节点当前的运行状态 */
private Status status = Status.RUNNING;
@@ -27,8 +28,14 @@ public AbstractNode(Document params) {
NodeVerify.notNull(params, "params");
this.flowId = params.getString("flowId");
this.nodeId = params.getString("nodeId");
- this.payload = params.get("payload", Document.class);
- this.input = params.get("input", Document.class);
+ Object p = params.get("payload");
+ if (p != null) {
+ this.payload = OBJECT_MAPPER.convertValue(p, Document.class);
+ }
+ Object i = params.get("input");
+ if (i != null) {
+ this.input = OBJECT_MAPPER.convertValue(i, Document.class);
+ }
params.remove("flowId");
params.remove("nodeId");
// 解析${}占位符
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/NodeTypeEnum.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/NodeTypeEnum.java
index 682fd4f3..b0cd12d8 100644
--- a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/NodeTypeEnum.java
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/NodeTypeEnum.java
@@ -1,7 +1,7 @@
package com.flow.eda.runner.node;
-import com.flow.eda.common.dubbo.model.FlowData;
import com.flow.eda.common.exception.InternalException;
+import com.flow.eda.common.model.FlowData;
import com.flow.eda.runner.node.condition.ConditionNode;
import com.flow.eda.runner.node.delay.DelayNode;
import com.flow.eda.runner.node.email.EmailNode;
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/subflow/SubFlowRuntime.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/subflow/SubFlowRuntime.java
index c8df2d14..2762a9a4 100644
--- a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/subflow/SubFlowRuntime.java
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/subflow/SubFlowRuntime.java
@@ -1,7 +1,7 @@
package com.flow.eda.runner.node.subflow;
-import com.flow.eda.common.dubbo.model.FlowData;
import com.flow.eda.common.exception.FlowException;
+import com.flow.eda.common.model.FlowData;
import com.flow.eda.runner.node.NodeTypeEnum;
import com.flow.eda.runner.runtime.FlowDataRuntime;
import com.flow.eda.runner.status.FlowStatusService;
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowDataRuntime.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowDataRuntime.java
index 5a36e009..213b2c16 100644
--- a/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowDataRuntime.java
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowDataRuntime.java
@@ -1,6 +1,6 @@
package com.flow.eda.runner.runtime;
-import com.flow.eda.common.dubbo.model.FlowData;
+import com.flow.eda.common.model.FlowData;
import com.flow.eda.common.utils.CollectionUtil;
import com.flow.eda.runner.node.Node;
import com.flow.eda.runner.node.NodeTypeEnum;
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowExecutor.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowExecutor.java
index 3bf32822..da74047e 100644
--- a/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowExecutor.java
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowExecutor.java
@@ -1,7 +1,7 @@
package com.flow.eda.runner.runtime;
-import com.flow.eda.common.dubbo.model.FlowData;
import com.flow.eda.common.exception.FlowException;
+import com.flow.eda.common.model.FlowData;
import com.flow.eda.runner.node.Node;
import com.flow.eda.runner.node.NodeTypeEnum;
import com.flow.eda.runner.status.FlowNodeWebsocket;
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusClient.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusClient.java
new file mode 100644
index 00000000..bef3fdf0
--- /dev/null
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusClient.java
@@ -0,0 +1,31 @@
+package com.flow.eda.runner.status;
+
+import com.flow.eda.common.http.Result;
+import com.flow.eda.common.model.FlowData;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/** 获取流程状态信息接口 */
+@FeignClient(name = "flowStatus", url = "localhost:8081")
+public interface FlowStatusClient {
+ /**
+ * 获取流程状态
+ *
+ * @param flowId 流程id
+ * @return 返回流程当前状态
+ */
+ @GetMapping("/api/v1/feign/flow/status")
+ Result getFlowStatus(@RequestParam String flowId);
+
+ /**
+ * 获取流程节点数据
+ *
+ * @param flowId 流程id
+ * @return 返回流程节点数据
+ */
+ @GetMapping("/api/v1/feign/flow/data")
+ Result> getFlowData(@RequestParam String flowId);
+}
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusService.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusService.java
index 302a679f..4bea3517 100644
--- a/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusService.java
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusService.java
@@ -1,17 +1,12 @@
package com.flow.eda.runner.status;
-import com.flow.eda.common.dubbo.api.FlowInfoService;
-import com.flow.eda.common.dubbo.model.FlowData;
+import com.flow.eda.common.model.FlowData;
import com.flow.eda.runner.node.Node;
-import org.apache.dubbo.common.utils.ConcurrentHashSet;
-import org.apache.dubbo.config.annotation.DubboReference;
import org.bson.Document;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
@@ -26,10 +21,10 @@ public class FlowStatusService {
/** 流程运行结束后会发起通知 */
private final Map> noticeMap = new ConcurrentHashMap<>();
- @DubboReference private FlowInfoService flowInfoService;
+ @Autowired private FlowStatusClient flowStatusClient;
public void startRun(String flowId, List starts, List timer) {
- this.runningMap.put(flowId, new ConcurrentHashSet<>());
+ this.runningMap.put(flowId, new HashSet<>());
forEach(starts, node -> this.runningMap.get(flowId).add(node.getId()));
forEach(timer, node -> this.runningMap.get(flowId).add(node.getId()));
}
@@ -38,7 +33,7 @@ public void startRun(String flowId, List starts, List timer)
public String getFlowStatus(String flowId, Document message) {
String nodeId = message.getString("nodeId");
if (nodeId == null) {
- return flowInfoService.getFlowStatus(flowId);
+ return flowStatusClient.getFlowStatus(flowId).getResult();
}
String status = message.getString("status");
if (Node.Status.FAILED.name().equals(status)) {
@@ -58,7 +53,7 @@ public String getFlowStatus(String flowId, Document message) {
/** 判断当前流程状态是否已完成 */
public boolean isFinished(String flowId) {
if (!runningMap.containsKey(flowId)) {
- String status = flowInfoService.getFlowStatus(flowId);
+ String status = flowStatusClient.getFlowStatus(flowId).getResult();
return Node.Status.FINISHED.name().equals(status);
}
return runningMap.get(flowId).isEmpty();
@@ -75,9 +70,7 @@ public List getRunningNodes(String flowId) {
/** 添加运行中的节点 */
public void addRunningNode(String flowId, String nodeId) {
- if (runningMap.get(flowId) == null) {
- runningMap.put(flowId, new ConcurrentHashSet<>());
- }
+ runningMap.computeIfAbsent(flowId, k -> new HashSet<>());
runningMap.get(flowId).add(nodeId);
}
@@ -91,7 +84,7 @@ public void removeRunningNode(String flowId, String nodeId) {
/** 获取流程节点数据 */
public List getFlowData(String flowId) {
- return flowInfoService.getFlowData(flowId);
+ return flowStatusClient.getFlowData(flowId).getResult();
}
/** 清理缓存数据 */
diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/utils/PlaceholderUtil.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/utils/PlaceholderUtil.java
index 18188f67..21cf1ee5 100644
--- a/flow-eda-runner/src/main/java/com/flow/eda/runner/utils/PlaceholderUtil.java
+++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/utils/PlaceholderUtil.java
@@ -1,5 +1,6 @@
package com.flow.eda.runner.utils;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.flow.eda.common.utils.CollectionUtil;
import org.bson.Document;
import org.springframework.util.StringUtils;
@@ -14,6 +15,7 @@
/** 解析占位符${}的工具类 */
public class PlaceholderUtil {
+ public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private static final Pattern REGEX = Pattern.compile("\\$\\{([^}]*)}");
/**
diff --git a/flow-eda-runner/src/main/resources/application.yaml b/flow-eda-runner/src/main/resources/application.yaml
index a1250001..831e8775 100644
--- a/flow-eda-runner/src/main/resources/application.yaml
+++ b/flow-eda-runner/src/main/resources/application.yaml
@@ -10,29 +10,9 @@ spring:
password: guest
log_exchange: flow.log
log_routing_key: flow.running.log
-dubbo:
- application:
- name: flow-eda-runner
- qos-enable: false
- qos-accept-foreign-ip: false
- registry:
- protocol: dubbo
- address: nacos://localhost:8848
- username: nacos
- password: nacos
- protocol:
- name: dubbo
- port: 20882
- consumer:
- check: false
- timeout: 5000
- retries: 0
security:
oauth2:
resource-id: flow-eda
client-id: 1df7b0c1-aac0-148a14c7cba8
client-secret: zcUaT32GlwIjz4yBJjYZIIMvzf
check-token-url: http://localhost:8086/oauth/check_token
-logging:
- level:
- com.alibaba.nacos.common.remote.client: warn
diff --git a/flow-eda-vue/package.json b/flow-eda-vue/package.json
index 74931366..f8e2e4db 100644
--- a/flow-eda-vue/package.json
+++ b/flow-eda-vue/package.json
@@ -11,23 +11,22 @@
"axios": "0.24.0",
"click-outside-vue3": "^4.0.1",
"codemirror-editor-vue3": "^2.0.6",
- "element-plus": "^2.2.26",
- "element-theme-chalk": "^2.15.12",
+ "element-plus": "1.0.2-beta.52",
"jsplumb": "^2.15.6",
"less": "4.1.2",
"less-loader": "10.2.0",
"moment": "^2.29.1",
"panzoom": "^9.4.2",
"screenfull": "^6.0.1",
- "vue": "^3.2.45",
+ "vue": "^3.1.2",
"vue-json-viewer": "^3.0.4",
"vue-router": "^4.0.10",
"vuex": "^4.0.2"
},
"devDependencies": {
- "@vitejs/plugin-vue": "^4.0.0",
- "@vitejs/plugin-vue-jsx": "^3.0.0",
- "vite": "^4.0.3"
+ "@vitejs/plugin-vue": "^1.2.3",
+ "@vue/compiler-sfc": "^3.1.2",
+ "vite": "2.3.7"
},
"browserslist": [
"> 1%",
diff --git a/flow-eda-vue/src/components/Header.vue b/flow-eda-vue/src/components/Header.vue
index fe37fd54..fa819352 100644
--- a/flow-eda-vue/src/components/Header.vue
+++ b/flow-eda-vue/src/components/Header.vue
@@ -1,8 +1,8 @@