From bba536ea5b752baf13678f64c9eaaedf04bf6366 Mon Sep 17 00:00:00 2001
From: qinluo <1558642210@qq.com>
Date: Wed, 21 Dec 2022 18:17:25 +0800
Subject: [PATCH 01/18] qinluo: - reload
---
pom.xml | 2 +-
smart-flow-core/pom.xml | 2 +-
.../attribute/AttributeValueResolver.java | 9 +++
.../builder/AbstractComponentBuilder.java | 2 +-
.../flow/core/manager/ComponentModel.java | 2 +-
.../core/manager/DefaultEngineManager.java | 6 +-
.../flow/core/manager/EngineModel.java | 12 +++
.../core/manager/RegisterEngineVisitor.java | 1 +
.../core/parser/BuilderDefinitionVisitor.java | 17 +++-
.../flow/core/parser/DefaultParser.java | 22 +++--
.../flow/core/parser/DefinitionVisitor.java | 10 +++
.../flow/core/script/ScriptCondition.java | 2 +-
smart-flow-manager/pom.xml | 11 ++-
.../flow/manager/change/HttpManager.java | 25 +++++-
.../flow/manager/change/ManagerAction.java | 7 ++
.../flow/manager/reload/AbstractReloader.java | 35 ++++++++
.../manager/reload/LogReloadListener.java | 28 +++++++
.../flow/manager/reload/ReloadListener.java | 20 +++++
.../reload/ReloadListenerRegistry.java | 28 +++++++
.../flow/manager/reload/ReloadListeners.java | 45 +++++++++++
.../flow/manager/reload/Reloader.java | 16 ++++
.../flow/manager/reload/XmlParseReloader.java | 81 +++++++++++++++++++
.../flow/manager/reload/XmlSelector.java | 17 ++++
smart-flow-script-condition/pom.xml | 4 +-
.../smart-flow-script-groovy/pom.xml | 8 +-
.../smart-flow-script-ognl/pom.xml | 2 +-
.../smart-flow-script-qlexpress/pom.xml | 2 +-
smart-flow-spring-extension/pom.xml | 4 +-
.../extension/BeanDefinitionVisitor.java | 26 +++++-
.../spring/extension/SpringObjectCreator.java | 37 +++++++++
smart-flow-springboot-starter/pom.xml | 6 +-
31 files changed, 456 insertions(+), 33 deletions(-)
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/AbstractReloader.java
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/LogReloadListener.java
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListener.java
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListenerRegistry.java
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListeners.java
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/Reloader.java
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlSelector.java
create mode 100644 smart-flow-spring-extension/src/main/java/org/smartboot/flow/spring/extension/SpringObjectCreator.java
diff --git a/pom.xml b/pom.xml
index b544d03..3aba23f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.smartboot.flow
smart-flow-parent
- 1.0.3
+ 1.0.4-SNAPSHOT
4.0.0
pom
smart-flow
diff --git a/smart-flow-core/pom.xml b/smart-flow-core/pom.xml
index bcc9535..295e5ca 100644
--- a/smart-flow-core/pom.xml
+++ b/smart-flow-core/pom.xml
@@ -5,7 +5,7 @@
org.smartboot.flow
smart-flow-parent
- 1.0.3
+ 1.0.4-SNAPSHOT
4.0.0
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/AttributeValueResolver.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/AttributeValueResolver.java
index 86e7e28..9c53a80 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/AttributeValueResolver.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/AttributeValueResolver.java
@@ -16,8 +16,17 @@ import java.util.List;
*/
public class AttributeValueResolver {
+ private static final AttributeValueResolver INSTANCE = new AttributeValueResolver();
private ObjectCreator objectCreator = DefaultObjectCreator.getInstance();
+ private AttributeValueResolver() {
+
+ }
+
+ public static AttributeValueResolver getInstance() {
+ return INSTANCE;
+ }
+
public void setObjectCreator(ObjectCreator objectCreator) {
this.objectCreator = objectCreator;
}
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/builder/AbstractComponentBuilder.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/builder/AbstractComponentBuilder.java
index 6ccc39d..0217330 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/builder/AbstractComponentBuilder.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/builder/AbstractComponentBuilder.java
@@ -16,7 +16,7 @@ import java.util.Map;
*/
public abstract class AbstractComponentBuilder {
- private final AttributeValueResolver valueResolver = new AttributeValueResolver();
+ private final AttributeValueResolver valueResolver = AttributeValueResolver.getInstance();
/**
* Component attribute attributes.
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/ComponentModel.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/ComponentModel.java
index 53115a5..fc5f7b7 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/ComponentModel.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/ComponentModel.java
@@ -117,7 +117,7 @@ public class ComponentModel extends Uniqueness {
@SuppressWarnings("unchecked")
public void changeAttributes(List holders) {
Map snapshot = new HashMap<>(this.holders);
- AttributeValueResolver valueResolver = new AttributeValueResolver();
+ AttributeValueResolver valueResolver = AttributeValueResolver.getInstance();
try {
holders.forEach(p -> {
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/DefaultEngineManager.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/DefaultEngineManager.java
index 3b060d6..0e03077 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/DefaultEngineManager.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/DefaultEngineManager.java
@@ -27,13 +27,17 @@ public class DefaultEngineManager implements EngineManager {
return INSTANCE;
}
+ private DefaultEngineManager() {
+
+ }
+
@Override
public void register(FlowEngine engine) {
AssertUtil.notNull(engine, "registered engine must not be null");
AssertUtil.notBlank(engine.getName(), "registered engine name must not be blank");
if (registeredEngines.get(engine.getName()) != null) {
- LOGGER.error("engine {} already registered", engine.getName());
+ LOGGER.warn("engine {} already registered", engine.getName());
return;
}
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/EngineModel.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/EngineModel.java
index deebab1..ec2cd54 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/EngineModel.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/EngineModel.java
@@ -2,6 +2,7 @@ package org.smartboot.flow.core.manager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.smartboot.flow.core.FlowEngine;
import org.smartboot.flow.core.common.Uniqueness;
import org.smartboot.flow.core.attribute.AttributeHolder;
import org.smartboot.flow.core.metrics.Metrics;
@@ -16,6 +17,7 @@ import java.util.concurrent.ConcurrentHashMap;
* @date 2022/11/18 22:50
* @since 1.0.0
*/
+@SuppressWarnings("rawtypes")
public class EngineModel extends Uniqueness {
private static final Logger LOGGER = LoggerFactory.getLogger(EngineModel.class);
@@ -23,12 +25,22 @@ public class EngineModel extends Uniqueness {
private PipelineModel pipeline;
private transient final Map components = new ConcurrentHashMap<>();
private Metrics metrics;
+ private transient FlowEngine source;
public EngineModel(String name) {
// Engine's name must be global unique.
this.identifier = name;
}
+ @SuppressWarnings("unchecked")
+ public FlowEngine getSource() {
+ return (FlowEngine)source;
+ }
+
+ void setSource(FlowEngine source) {
+ this.source = source;
+ }
+
public PipelineModel getPipeline() {
return pipeline;
}
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/RegisterEngineVisitor.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/RegisterEngineVisitor.java
index 2743345..66da81b 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/RegisterEngineVisitor.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/manager/RegisterEngineVisitor.java
@@ -28,6 +28,7 @@ public class RegisterEngineVisitor extends EngineVisitor {
public void visitSource(FlowEngine flowEngine) {
visited.add(flowEngine);
this.model.setMetrics(flowEngine.getMetrics());
+ this.model.setSource(flowEngine);
}
@Override
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/BuilderDefinitionVisitor.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/BuilderDefinitionVisitor.java
index 527c684..1ee33c1 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/BuilderDefinitionVisitor.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/BuilderDefinitionVisitor.java
@@ -58,7 +58,14 @@ public class BuilderDefinitionVisitor implements DefinitionVisitor {
public void visit(ElementDefinition ed) {
if (ed instanceof ScriptDefinition) {
ScriptDefinition sed = (ScriptDefinition) ed;
- ScriptCondition condition = objectCreator.create(sed.getType(), true);
+ Class> javaType = sed.getJavaType();
+ ScriptCondition condition;
+ if (javaType != null) {
+ condition = objectCreator.create(javaType.getName(), true);
+ } else {
+ condition = objectCreator.create(sed.getType(), true);
+ }
+
condition.setName(sed.getName());
condition.setScript(sed.getScript());
scriptConditions.put(ed.getIdentifier(), condition);
@@ -163,11 +170,13 @@ public class BuilderDefinitionVisitor implements DefinitionVisitor {
@Override
public void visit(IfElementDefinition ed) {
String test = ed.getTest();
- Condition condition = null;
+ Condition condition;
if (AuxiliaryUtils.isType(test)) {
condition = (Condition) newInstance(test);
} else if (ed.getContext().getRegistered(test) != null) {
condition = getInternalObject(test, ed.getContext());
+ } else {
+ condition = (Condition) newInstance(test);
}
AssertUtil.notNull(condition, "can't find condition for if-element, test = " + test);
@@ -201,11 +210,13 @@ public class BuilderDefinitionVisitor implements DefinitionVisitor {
@Override
public void visit(ChooseDefinition ed) {
String test = ed.getTest();
- Condition condition = null;
+ Condition condition;
if (AuxiliaryUtils.isType(test)) {
condition = (Condition) newInstance(test);
} else if (ed.getContext().getRegistered(test) != null) {
condition = getInternalObject(test, ed.getContext());
+ } else {
+ condition = (Condition) newInstance(test);
}
AssertUtil.notNull(condition, "can't find condition for choose-element, test = " + test);
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/DefaultParser.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/DefaultParser.java
index cfd54ee..f13acfa 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/DefaultParser.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/DefaultParser.java
@@ -30,6 +30,8 @@ public class DefaultParser implements Parser {
private BuilderDefinitionVisitor visitor;
private final ParserContext context = new ParserContext();
+ private ObjectCreator objectCreator = DefaultObjectCreator.getInstance();
+ private boolean assemble = true;
@Override
public void parse(InputStream is, InputStream... streams) {
@@ -65,9 +67,11 @@ public class DefaultParser implements Parser {
useCache = useCache || Boolean.parseBoolean(root.getAttribute("useCache"));
}
- this.visitor = new BuilderDefinitionVisitor(useCache, getObjectCreator());
- context.getRegistered().forEach(ElementDefinition::validate);
- context.getRegistered().forEach(p -> visitor.visit(p));
+ if (assemble) {
+ this.visitor = new BuilderDefinitionVisitor(useCache, objectCreator);
+ context.getRegistered().forEach(ElementDefinition::validate);
+ context.getRegistered().forEach(p -> visitor.visit(p));
+ }
}
@Override
@@ -100,8 +104,16 @@ public class DefaultParser implements Parser {
return ALLOWED.contains(name);
}
- protected ObjectCreator getObjectCreator() {
- return DefaultObjectCreator.getInstance();
+ public void setObjectCreator(ObjectCreator objectCreator) {
+ this.objectCreator = objectCreator;
+ }
+
+ public ParserContext getCtx() {
+ return context;
+ }
+
+ public void setAssemble(boolean assemble) {
+ this.assemble = assemble;
}
public FlowEngine getEngine(String name) {
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/DefinitionVisitor.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/DefinitionVisitor.java
index aa76f68..8f07dc2 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/DefinitionVisitor.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/DefinitionVisitor.java
@@ -45,4 +45,14 @@ public interface DefinitionVisitor {
void visit(ChooseDefinition ed);
void visit(AdapterDefinition adapterDefinition);
+
+ /**
+ * Init visitor with parse ctx.
+ *
+ * @param ctx ctx.
+ * @since 1.0.4
+ */
+ default void init(ParserContext ctx) {
+
+ }
}
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/script/ScriptCondition.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/script/ScriptCondition.java
index f75ccc6..8ef1d8b 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/script/ScriptCondition.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/script/ScriptCondition.java
@@ -43,6 +43,6 @@ public abstract class ScriptCondition extends NamedCondition {
@Override
public String describe() {
- return "script-" + getType();
+ return "script-" + getType() + "-" + super.describe();
}
}
diff --git a/smart-flow-manager/pom.xml b/smart-flow-manager/pom.xml
index f83809a..40bd754 100644
--- a/smart-flow-manager/pom.xml
+++ b/smart-flow-manager/pom.xml
@@ -5,7 +5,7 @@
smart-flow-parent
org.smartboot.flow
- 1.0.3
+ 1.0.4-SNAPSHOT
4.0.0
@@ -20,7 +20,14 @@
org.smartboot.flow
smart-flow-core
- 1.0.3
+ 1.0.4-SNAPSHOT
+
+
+
+ org.smartboot.flow
+ smart-flow-spring-extension
+ 1.0.4-SNAPSHOT
+ true
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/change/HttpManager.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/change/HttpManager.java
index 830117b..d64ee59 100644
--- a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/change/HttpManager.java
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/change/HttpManager.java
@@ -8,6 +8,7 @@ import org.smartboot.flow.core.attribute.Attributes;
import org.smartboot.flow.core.manager.DefaultEngineManager;
import org.smartboot.flow.core.util.AssertUtil;
import org.smartboot.flow.manager.NamedThreadFactory;
+import org.smartboot.flow.manager.reload.Reloader;
import org.smartboot.flow.manager.report.HostUtils;
import org.smartboot.http.client.HttpClient;
import org.smartboot.http.client.HttpPost;
@@ -40,6 +41,7 @@ public class HttpManager {
private String path;
private long delayAtFirst;
private long lastest;
+ private Reloader reloader;
public void start() {
URL parsedUrl;
@@ -101,13 +103,13 @@ public class HttpManager {
List changeModels = JSON.parseArray(body, ChangeModel.class);
for (ChangeModel cm : changeModels) {
- ManagerAction action = ManagerAction.get(cm.getAction());
- if (action == null) {
- LOGGER.error("unknown action {}", cm.getAction());
+ if (cm.getTimestamp() < timestamp) {
continue;
}
- if (cm.getTimestamp() < timestamp) {
+ ManagerAction action = ManagerAction.get(cm.getAction());
+ if (action == null) {
+ LOGGER.error("unknown action {}", cm.getAction());
continue;
}
@@ -128,6 +130,13 @@ public class HttpManager {
}
} else if (action == ManagerAction.RESET_METRICS){
DefaultEngineManager.getDefaultManager().resetStatistic(cm.getIdentifier());
+ } else if (action == ManagerAction.RELOAD) {
+ if (reloader == null) {
+ LOGGER.error("reloader is null, engine = {}", cm.getName());
+ continue;
+ }
+ // reload.
+ reloader.reload(cm.getName());
}
}
@@ -184,4 +193,12 @@ public class HttpManager {
public void setDelayAtFirst(long delayAtFirst) {
this.delayAtFirst = delayAtFirst;
}
+
+ public Reloader getReloader() {
+ return reloader;
+ }
+
+ public void setReloader(Reloader reloader) {
+ this.reloader = reloader;
+ }
}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/change/ManagerAction.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/change/ManagerAction.java
index 1aace0a..d52b98e 100644
--- a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/change/ManagerAction.java
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/change/ManagerAction.java
@@ -18,6 +18,11 @@ public enum ManagerAction {
*/
RESET_METRICS,
+ /**
+ * Reload engine.
+ */
+ RELOAD,
+
;
public static ManagerAction get(String name) {
@@ -25,6 +30,8 @@ public enum ManagerAction {
return CHANGE_ATTRIBUTES;
} else if (Objects.equals(name, RESET_METRICS.name())) {
return RESET_METRICS;
+ } else if (Objects.equals(name, RELOAD.name())) {
+ return RELOAD;
}
return null;
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/AbstractReloader.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/AbstractReloader.java
new file mode 100644
index 0000000..ed55f3e
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/AbstractReloader.java
@@ -0,0 +1,35 @@
+package org.smartboot.flow.manager.reload;
+
+import java.util.List;
+
+/**
+ * @author qinluo
+ * @date 2022-12-21 13:50:34
+ * @since 1.0.0
+ */
+public abstract class AbstractReloader implements Reloader {
+
+ @Override
+ public void reload(String engineName) {
+ List registered = ReloadListenerRegistry.getRegistered();
+ registered.add(new LogReloadListener());
+ ReloadListener listener = new ReloadListeners(registered);
+
+ Throwable ex = null;
+ try {
+ listener.onload(engineName);
+ this.doReload(engineName);
+ } catch (Throwable e) {
+ ex = e;
+ } finally {
+ listener.loadCompleted(engineName, ex);
+ }
+ }
+
+ /**
+ * Reload engine in subclass.
+ *
+ * @param engineName engineName.
+ */
+ public abstract void doReload(String engineName);
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/LogReloadListener.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/LogReloadListener.java
new file mode 100644
index 0000000..3b6ba9c
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/LogReloadListener.java
@@ -0,0 +1,28 @@
+package org.smartboot.flow.manager.reload;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author qinluo
+ * @date 2022-12-21 17:48:55
+ * @since 1.0.0
+ */
+public class LogReloadListener implements ReloadListener {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(LogReloadListener.class);
+
+ @Override
+ public void onload(String engineName) {
+ LOGGER.info("start reload engine {}", engineName);
+ }
+
+ @Override
+ public void loadCompleted(String engineName, Throwable e) {
+ if (e == null) {
+ LOGGER.info("reload engine {} successfully completed", engineName);
+ } else {
+ LOGGER.warn("reload engine {} failed", engineName, e);
+ }
+ }
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListener.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListener.java
new file mode 100644
index 0000000..e41ada2
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListener.java
@@ -0,0 +1,20 @@
+package org.smartboot.flow.manager.reload;
+
+/**
+ * @author qinluo
+ * @date 2022-12-06 20:57:37
+ * @since 1.0.0
+ */
+public interface ReloadListener {
+
+ void onload(String engineName);
+
+ void loadCompleted(String engineName, Throwable e);
+
+ /**
+ * Register this to registry.
+ */
+ default void register() {
+ ReloadListenerRegistry.register(this);
+ }
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListenerRegistry.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListenerRegistry.java
new file mode 100644
index 0000000..4b0d366
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListenerRegistry.java
@@ -0,0 +1,28 @@
+package org.smartboot.flow.manager.reload;
+
+import org.smartboot.flow.core.util.AssertUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author qinluo
+ * @date 2022-11-25 21:15:22
+ * @since 1.0.0
+ */
+public class ReloadListenerRegistry {
+
+ private static final List REGISTERED = new ArrayList<>();
+
+ public synchronized static void register(ReloadListener listener) {
+ AssertUtil.notNull(listener, "listener must not be null");
+
+ if (!REGISTERED.contains(listener)) {
+ REGISTERED.add(listener);
+ }
+ }
+
+ public static List getRegistered() {
+ return new ArrayList<>(REGISTERED);
+ }
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListeners.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListeners.java
new file mode 100644
index 0000000..e7b7539
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/ReloadListeners.java
@@ -0,0 +1,45 @@
+package org.smartboot.flow.manager.reload;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * @author qinluo
+ * @date 2022-12-21 13:52:37
+ * @since 1.0.0
+ */
+public class ReloadListeners implements ReloadListener {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ReloadListeners.class);
+
+ private final List listeners;
+
+ public ReloadListeners(List listeners) {
+ this.listeners = listeners;
+ }
+
+ @Override
+ public void onload(String engineName) {
+ for (ReloadListener listener : listeners) {
+
+ try {
+ listener.onload(engineName);
+ } catch (Exception e) {
+ LOGGER.warn("execute reload listener failed", e);
+ }
+ }
+ }
+
+ @Override
+ public void loadCompleted(String engineName, Throwable e) {
+ for (ReloadListener listener : listeners) {
+ try {
+ listener.loadCompleted(engineName, e);
+ } catch (Exception ex) {
+ LOGGER.warn("execute reload listener failed", ex);
+ }
+ }
+ }
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/Reloader.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/Reloader.java
new file mode 100644
index 0000000..d5a1ee7
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/Reloader.java
@@ -0,0 +1,16 @@
+package org.smartboot.flow.manager.reload;
+
+/**
+ * @author qinluo
+ * @date 2022-12-21 13:45:27
+ * @since 1.0.0
+ */
+public interface Reloader {
+
+ /**
+ * Reload engine
+ *
+ * @param engineName engineName.
+ */
+ void reload(String engineName);
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java
new file mode 100644
index 0000000..3b92ff5
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java
@@ -0,0 +1,81 @@
+package org.smartboot.flow.manager.reload;
+
+import org.smartboot.flow.core.FlowEngine;
+import org.smartboot.flow.core.attribute.AttributeValueResolver;
+import org.smartboot.flow.core.manager.DefaultEngineManager;
+import org.smartboot.flow.core.manager.EngineManager;
+import org.smartboot.flow.core.parser.DefaultObjectCreator;
+import org.smartboot.flow.core.parser.DefaultParser;
+import org.smartboot.flow.core.parser.DefinitionVisitor;
+import org.smartboot.flow.core.parser.ObjectCreator;
+import org.smartboot.flow.core.parser.ParserContext;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+/**
+ * @author qinluo
+ * @date 2022-12-21 14:11:11
+ * @since 1.0.0
+ */
+public class XmlParseReloader extends AbstractReloader {
+
+ protected ObjectCreator objectCreator = DefaultObjectCreator.getInstance();
+ protected boolean assemble;
+ protected DefinitionVisitor visitor;
+ private XmlSelector xmlSelector;
+
+ public void setXmlSelector(XmlSelector xmlSelector) {
+ this.xmlSelector = xmlSelector;
+ }
+
+ public void setObjectCreator(ObjectCreator objectCreator) {
+ this.objectCreator = objectCreator;
+ }
+
+ public void setAssemble(boolean assemble) {
+ this.assemble = assemble;
+ }
+
+ public void setVisitor(DefinitionVisitor visitor) {
+ this.visitor = visitor;
+ }
+
+ @Override
+ public void doReload(String engineName) {
+ // select config.
+ String xml = xmlSelector.select(engineName);
+ InputStream stream = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
+
+ // init parser.
+ DefaultParser parser = new DefaultParser();
+ // object creator include independent and spring ref independent.
+ parser.setObjectCreator(objectCreator);
+ parser.setAssemble(assemble);
+ AttributeValueResolver.getInstance().setObjectCreator(objectCreator);
+
+ // parse
+ parser.parse(stream);
+
+ EngineManager defaultManager = DefaultEngineManager.getDefaultManager();
+
+ // if assemble
+ if (assemble) {
+ List engineNames = parser.getEngineNames();
+ engineNames.forEach(p -> {
+ FlowEngine, ?> engine = parser.getEngine(p);
+ if (engine != null) {
+ defaultManager.detach(p);
+ defaultManager.register(engine);
+ }
+ });
+ } else if (visitor != null){
+ // not assemble, register to spring.
+ ParserContext ctx = parser.getCtx();
+ visitor.init(ctx);
+ ctx.getRegistered().forEach(p -> visitor.visit(p));
+ }
+ }
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlSelector.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlSelector.java
new file mode 100644
index 0000000..fda8fcf
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlSelector.java
@@ -0,0 +1,17 @@
+package org.smartboot.flow.manager.reload;
+
+/**
+ * @author qinluo
+ * @date 2022-12-21 16:36:25
+ * @since 1.0.0
+ */
+public interface XmlSelector {
+
+ /**
+ * Select engine xml content.
+ *
+ * @param engineName engineName.
+ * @return xml content.
+ */
+ String select(String engineName);
+}
diff --git a/smart-flow-script-condition/pom.xml b/smart-flow-script-condition/pom.xml
index 357405e..5604aef 100644
--- a/smart-flow-script-condition/pom.xml
+++ b/smart-flow-script-condition/pom.xml
@@ -5,7 +5,7 @@
smart-flow-parent
org.smartboot.flow
- 1.0.3
+ 1.0.4-SNAPSHOT
4.0.0
pom
@@ -27,7 +27,7 @@
org.smartboot.flow
smart-flow-core
- 1.0.3
+ 1.0.4-SNAPSHOT
diff --git a/smart-flow-script-condition/smart-flow-script-groovy/pom.xml b/smart-flow-script-condition/smart-flow-script-groovy/pom.xml
index 527ab26..5863460 100644
--- a/smart-flow-script-condition/smart-flow-script-groovy/pom.xml
+++ b/smart-flow-script-condition/smart-flow-script-groovy/pom.xml
@@ -5,7 +5,7 @@
smart-flow-script-condition
org.smartboot.flow
- 1.0.3
+ 1.0.4-SNAPSHOT
4.0.0
@@ -23,6 +23,12 @@
groovy
3.0.9
+
+
+ org.codehaus.groovy
+ groovy-jsr223
+ 3.0.9
+
\ No newline at end of file
diff --git a/smart-flow-script-condition/smart-flow-script-ognl/pom.xml b/smart-flow-script-condition/smart-flow-script-ognl/pom.xml
index 5618f45..cad2149 100644
--- a/smart-flow-script-condition/smart-flow-script-ognl/pom.xml
+++ b/smart-flow-script-condition/smart-flow-script-ognl/pom.xml
@@ -5,7 +5,7 @@
smart-flow-script-condition
org.smartboot.flow
- 1.0.3
+ 1.0.4-SNAPSHOT
4.0.0
diff --git a/smart-flow-script-condition/smart-flow-script-qlexpress/pom.xml b/smart-flow-script-condition/smart-flow-script-qlexpress/pom.xml
index 8f56abe..0fe09b0 100644
--- a/smart-flow-script-condition/smart-flow-script-qlexpress/pom.xml
+++ b/smart-flow-script-condition/smart-flow-script-qlexpress/pom.xml
@@ -5,7 +5,7 @@
smart-flow-script-condition
org.smartboot.flow
- 1.0.3
+ 1.0.4-SNAPSHOT
4.0.0
diff --git a/smart-flow-spring-extension/pom.xml b/smart-flow-spring-extension/pom.xml
index 156c7c5..6f41486 100644
--- a/smart-flow-spring-extension/pom.xml
+++ b/smart-flow-spring-extension/pom.xml
@@ -5,7 +5,7 @@
smart-flow-parent
org.smartboot.flow
- 1.0.3
+ 1.0.4-SNAPSHOT
4.0.0
@@ -21,7 +21,7 @@
org.smartboot.flow
smart-flow-core
- 1.0.3
+ 1.0.4-SNAPSHOT
diff --git a/smart-flow-spring-extension/src/main/java/org/smartboot/flow/spring/extension/BeanDefinitionVisitor.java b/smart-flow-spring-extension/src/main/java/org/smartboot/flow/spring/extension/BeanDefinitionVisitor.java
index 205dbd1..ecb0013 100644
--- a/smart-flow-spring-extension/src/main/java/org/smartboot/flow/spring/extension/BeanDefinitionVisitor.java
+++ b/smart-flow-spring-extension/src/main/java/org/smartboot/flow/spring/extension/BeanDefinitionVisitor.java
@@ -15,7 +15,10 @@ import org.smartboot.flow.core.parser.definition.ScriptDefinition;
import org.smartboot.flow.core.script.ScriptCondition;
import org.smartboot.flow.core.util.AssertUtil;
import org.smartboot.flow.core.util.AuxiliaryUtils;
+import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValue;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
@@ -30,20 +33,37 @@ import java.util.List;
* @date 2022/11/17 0:01
* @since 1.0.0
*/
-public class BeanDefinitionVisitor implements DefinitionVisitor {
+public class BeanDefinitionVisitor implements DefinitionVisitor, BeanFactoryAware {
- private final ParserContext context;
+ private ParserContext context;
/**
* Temporary def register.
*/
- private final BeanDefinitionRegister register;
+ private BeanDefinitionRegister register;
+
+ public BeanDefinitionVisitor() {
+ }
public BeanDefinitionVisitor(BeanDefinitionRegistry registry, ParserContext context) {
+ AssertUtil.notNull(registry, "registry must not be null!");
this.context = context;
this.register = new BeanDefinitionRegister(registry);
}
+ @Override
+ public void init(ParserContext context) {
+ this.context = context;
+ AssertUtil.notNull(register, "registry must not be null!");
+ }
+
+ @Override
+ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+ if (beanFactory instanceof BeanDefinitionRegistry) {
+ this.register = new BeanDefinitionRegister((BeanDefinitionRegistry) beanFactory);
+ }
+ }
+
@Override
public void visit(ElementDefinition ed) {
if (ed instanceof ScriptDefinition) {
diff --git a/smart-flow-spring-extension/src/main/java/org/smartboot/flow/spring/extension/SpringObjectCreator.java b/smart-flow-spring-extension/src/main/java/org/smartboot/flow/spring/extension/SpringObjectCreator.java
new file mode 100644
index 0000000..1f75d8d
--- /dev/null
+++ b/smart-flow-spring-extension/src/main/java/org/smartboot/flow/spring/extension/SpringObjectCreator.java
@@ -0,0 +1,37 @@
+package org.smartboot.flow.spring.extension;
+
+import org.smartboot.flow.core.parser.DefaultObjectCreator;
+import org.smartboot.flow.core.parser.ObjectCreator;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+/**
+ * @author qinluo
+ * @date 2022-12-21 14:22:23
+ * @since 1.0.0
+ */
+public class SpringObjectCreator implements ObjectCreator, ApplicationContextAware {
+
+ private ApplicationContext ctx;
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public T create(String type, boolean useCache) {
+ Object obj;
+
+ try {
+ // type as bean name.
+ obj = ctx.getBean(type);
+ } catch (BeansException ignored) {
+ obj = DefaultObjectCreator.getInstance().create(type, useCache);
+ }
+
+ return (T)obj;
+ }
+
+ @Override
+ public void setApplicationContext(ApplicationContext ctx) throws BeansException {
+ this.ctx = ctx;
+ }
+}
diff --git a/smart-flow-springboot-starter/pom.xml b/smart-flow-springboot-starter/pom.xml
index 628266d..f8e5a02 100644
--- a/smart-flow-springboot-starter/pom.xml
+++ b/smart-flow-springboot-starter/pom.xml
@@ -5,7 +5,7 @@
smart-flow-parent
org.smartboot.flow
- 1.0.3
+ 1.0.4-SNAPSHOT
4.0.0
@@ -25,12 +25,12 @@
org.smartboot.flow
smart-flow-spring-extension
- 1.0.3
+ 1.0.4-SNAPSHOT
org.smartboot.flow
smart-flow-manager
- 1.0.3
+ 1.0.4-SNAPSHOT
--
Gitee
From 77ce326c973400d8d4ed72499f65c6d8e6b96c10 Mon Sep 17 00:00:00 2001
From: qinluo <1558642210@qq.com>
Date: Wed, 4 Jan 2023 19:02:55 +0800
Subject: [PATCH 02/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20=E6=8F=90?=
=?UTF-8?q?=E4=BE=9B=E9=BB=98=E8=AE=A4sql=E6=9F=A5=E8=AF=A2=E5=AE=9E?=
=?UTF-8?q?=E7=8E=B0=E4=BB=A5=E5=8F=8A=E8=A1=A8=E5=88=9D=E5=A7=8B=E5=8C=96?=
=?UTF-8?q?sql?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../flow/manager/reload/SqlXmlSelector.java | 104 ++++++++++++++++++
.../flow/manager/reload/XmlParseReloader.java | 5 +
.../src/main/resources/init.sql | 6 +
3 files changed, 115 insertions(+)
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/SqlXmlSelector.java
create mode 100644 smart-flow-manager/src/main/resources/init.sql
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/SqlXmlSelector.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/SqlXmlSelector.java
new file mode 100644
index 0000000..ca3f44b
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/SqlXmlSelector.java
@@ -0,0 +1,104 @@
+package org.smartboot.flow.manager.reload;
+
+import org.smartboot.flow.core.exception.FlowException;
+import org.smartboot.flow.core.util.AssertUtil;
+import org.smartboot.flow.core.util.AuxiliaryUtils;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+/**
+ * @author qinluo
+ * @date 2023-01-04 11:55:50
+ * @since 1.0.0
+ */
+public class SqlXmlSelector implements XmlSelector {
+
+ /**
+ * classpath*:/resources/init.sql
+ */
+ private final static String SELECT_SQL = "select content from engine_table where engine_name = ? limit 1";
+ private String url;
+ private String username;
+ private String password;
+ private String driver = "com.mysql.jdbc.Driver";
+ private volatile boolean initialized;
+
+ @Override
+ public String select(String engineName) {
+ init();
+
+ try {
+ Connection conn = this.openConnection();
+ PreparedStatement preparedStatement = conn.prepareStatement(SELECT_SQL);
+ preparedStatement.setString(1, engineName);
+
+ ResultSet resultSet = preparedStatement.executeQuery();
+ if (resultSet.next()) {
+ return resultSet.getString(1);
+ }
+
+ return null;
+
+ } catch (Exception e) {
+ throw new FlowException("select failed", e);
+ }
+ }
+
+
+ private synchronized void init() {
+ if (initialized) {
+ return;
+ }
+
+ AssertUtil.notBlank(driver, "driver class must not be null");
+ AssertUtil.notBlank(url, "url class must not be null");
+ AssertUtil.notNull(AuxiliaryUtils.asClass(driver), "driver " + driver + " not a class");
+
+ this.openConnection();
+
+ initialized = true;
+ }
+
+ private Connection openConnection() {
+ try {
+ return DriverManager.getConnection(url, username, password);
+ } catch (Exception e) {
+ throw new FlowException("open connection failed", e);
+ }
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+ public void setDriver(String driver) {
+ this.driver = driver;
+ }
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java
index 3b92ff5..e1e2f3f 100644
--- a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java
@@ -2,6 +2,7 @@ package org.smartboot.flow.manager.reload;
import org.smartboot.flow.core.FlowEngine;
import org.smartboot.flow.core.attribute.AttributeValueResolver;
+import org.smartboot.flow.core.exception.FlowException;
import org.smartboot.flow.core.manager.DefaultEngineManager;
import org.smartboot.flow.core.manager.EngineManager;
import org.smartboot.flow.core.parser.DefaultObjectCreator;
@@ -47,6 +48,10 @@ public class XmlParseReloader extends AbstractReloader {
public void doReload(String engineName) {
// select config.
String xml = xmlSelector.select(engineName);
+ if (xml == null || xml.trim().length() == 0) {
+ throw new FlowException("empty config of " + engineName);
+ }
+
InputStream stream = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
// init parser.
diff --git a/smart-flow-manager/src/main/resources/init.sql b/smart-flow-manager/src/main/resources/init.sql
new file mode 100644
index 0000000..19d3685
--- /dev/null
+++ b/smart-flow-manager/src/main/resources/init.sql
@@ -0,0 +1,6 @@
+create table engine_table (
+ id bigint(20) not null auto_increment,
+ engine_name varchar(256) not null,
+ content text,
+ primary key(id)
+);
\ No newline at end of file
--
Gitee
From fbd22aab078b39f430b0a183e8b7e778392f5e17 Mon Sep 17 00:00:00 2001
From: qinluo <1558642210@qq.com>
Date: Fri, 6 Jan 2023 09:50:21 +0800
Subject: [PATCH 03/18] qinluo: - init sql - add initializer
---
.../flow/manager/EngineInitializer.java | 73 +++++++++++++++++++
.../smartboot/flow/manager/NullReloader.java | 19 +++++
.../flow/manager/reload/XmlParseReloader.java | 2 +-
.../src/main/resources/init.sql | 14 ++--
4 files changed, 101 insertions(+), 7 deletions(-)
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/EngineInitializer.java
create mode 100644 smart-flow-manager/src/main/java/org/smartboot/flow/manager/NullReloader.java
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/EngineInitializer.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/EngineInitializer.java
new file mode 100644
index 0000000..eac90d0
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/EngineInitializer.java
@@ -0,0 +1,73 @@
+package org.smartboot.flow.manager;
+
+import org.smartboot.flow.core.exception.FlowException;
+import org.smartboot.flow.core.util.AssertUtil;
+import org.smartboot.flow.manager.reload.Reloader;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author qinluo
+ * @date 2023-01-05 19:42:58
+ * @since 1.0.0
+ */
+public class EngineInitializer {
+
+ /**
+ * Engine reloaders.
+ */
+ private final Map engines = new ConcurrentHashMap<>();
+
+ /**
+ * Default reloader is null.
+ */
+ private Reloader defaultReloader = NullReloader.NULL;
+
+ public void start() {
+ for (Map.Entry entry : engines.entrySet()) {
+ Reloader reloader = entry.getValue();
+ reloader = (reloader != null && reloader != NullReloader.NULL) ? reloader : defaultReloader;
+
+ try {
+ reloader.reload(entry.getKey());
+ } catch (Exception e) {
+ if (e instanceof FlowException) {
+ throw (FlowException)e;
+ }
+
+ throw new FlowException(e);
+ }
+ }
+ }
+
+
+ public Reloader getReloader() {
+ return defaultReloader;
+ }
+
+ public void setReloader(Reloader defaultReloader) {
+ AssertUtil.notNull(defaultReloader, "reloader must not be null!");
+ this.defaultReloader = defaultReloader;
+ }
+
+ public void setEngineReloaders(Map reloaderMap) {
+ if (reloaderMap == null || reloaderMap.isEmpty()) {
+ return;
+ }
+
+ reloaderMap.forEach((k, v) -> {
+ Reloader nonNull = v != null ? v : defaultReloader;
+ engines.put(k, nonNull);
+ });
+ }
+
+ public void setEngines(List engines) {
+ if (engines == null || engines.isEmpty()) {
+ return;
+ }
+
+ engines.forEach((k) -> this.engines.put(k, defaultReloader));
+ }
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/NullReloader.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/NullReloader.java
new file mode 100644
index 0000000..8365ace
--- /dev/null
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/NullReloader.java
@@ -0,0 +1,19 @@
+package org.smartboot.flow.manager;
+
+import org.smartboot.flow.core.exception.FlowException;
+import org.smartboot.flow.manager.reload.Reloader;
+
+/**
+ * @author qinluo
+ * @date 2023-01-05 19:47:49
+ * @since 1.0.0
+ */
+public class NullReloader implements Reloader {
+
+ public static final Reloader NULL = new NullReloader();
+
+ @Override
+ public void reload(String engineName) {
+ throw new FlowException("Unsupported reload");
+ }
+}
diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java
index e1e2f3f..986cb46 100644
--- a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java
+++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/reload/XmlParseReloader.java
@@ -49,7 +49,7 @@ public class XmlParseReloader extends AbstractReloader {
// select config.
String xml = xmlSelector.select(engineName);
if (xml == null || xml.trim().length() == 0) {
- throw new FlowException("empty config of " + engineName);
+ throw new FlowException("load config " + engineName + " is empty");
}
InputStream stream = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
diff --git a/smart-flow-manager/src/main/resources/init.sql b/smart-flow-manager/src/main/resources/init.sql
index 19d3685..5cba42c 100644
--- a/smart-flow-manager/src/main/resources/init.sql
+++ b/smart-flow-manager/src/main/resources/init.sql
@@ -1,6 +1,8 @@
-create table engine_table (
- id bigint(20) not null auto_increment,
- engine_name varchar(256) not null,
- content text,
- primary key(id)
-);
\ No newline at end of file
+CREATE TABLE `engine_table` (
+ `id` bigint NOT NULL AUTO_INCREMENT,
+ `engine_name` varchar(256) NOT NULL COMMENT '引擎名称,唯一',
+ `content` text COMMENT '引擎配置内容,必须是xml形式',
+ `status` int NOT NULL DEFAULT '0' COMMENT '状态 0-正常 1-删除',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `engine_table_engine_name_uindex` (`engine_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='引擎配置表'
\ No newline at end of file
--
Gitee
From 94fc48766b5a70696e42aee29f99f3f2358dee24 Mon Sep 17 00:00:00 2001
From: qinluo <1558642210@qq.com>
Date: Fri, 6 Jan 2023 13:49:46 +0800
Subject: [PATCH 04/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20springboot?=
=?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BF=AE=E5=A4=8D=20=20=20=20=20=20-=20?=
=?UTF-8?q?=E6=96=B0=E5=A2=9Ereloader=20springboot=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../FlowHttpManageConfiguration.java | 29 +++-
.../FlowHttpReloadConfiguration.java | 149 ++++++++++++++++++
.../FlowHttpReportConfiguration.java | 16 +-
.../main/resources/META-INF/spring.factories | 3 +-
4 files changed, 192 insertions(+), 5 deletions(-)
create mode 100644 smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReloadConfiguration.java
diff --git a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpManageConfiguration.java b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpManageConfiguration.java
index e092c46..4106c3f 100644
--- a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpManageConfiguration.java
+++ b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpManageConfiguration.java
@@ -1,6 +1,10 @@
package org.smartboot.flow.springboot.extension;
import org.smartboot.flow.manager.change.HttpManager;
+import org.smartboot.flow.manager.reload.Reloader;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -11,6 +15,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration
@ConfigurationProperties(prefix = "smart.flow.manage.http")
+@ConditionalOnProperty(name = "smart.flow.manage.http.url")
public class FlowHttpManageConfiguration {
private long timeout;
@@ -19,9 +24,16 @@ public class FlowHttpManageConfiguration {
private long idle;
+ /**
+ * Default idle in microseconds.
+ */
private long delayAtFirst;
- @Bean
+ /**
+ * Configuration http manager without reloader.
+ */
+ @Bean("smart-flow-http-manager")
+ @ConditionalOnMissingBean(Reloader.class)
public HttpManager getHttpManager(){
HttpManager httpManager = new HttpManager();
httpManager.setTimeout(timeout);
@@ -32,6 +44,21 @@ public class FlowHttpManageConfiguration {
return httpManager;
}
+ /**
+ * Configuration http manager with reloader.
+ */
+ @Bean(value = "smart-flow-http-manager", initMethod = "start")
+ @ConditionalOnBean(Reloader.class)
+ public HttpManager getHttpManager(Reloader reloader){
+ HttpManager httpManager = new HttpManager();
+ httpManager.setTimeout(timeout);
+ httpManager.setUrl(url);
+ httpManager.setIdle(idle);
+ httpManager.setDelayAtFirst(delayAtFirst);
+ httpManager.setReloader(reloader);
+ return httpManager;
+ }
+
public void setTimeout(long timeout) {
this.timeout = timeout;
diff --git a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReloadConfiguration.java b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReloadConfiguration.java
new file mode 100644
index 0000000..9c9add0
--- /dev/null
+++ b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReloadConfiguration.java
@@ -0,0 +1,149 @@
+package org.smartboot.flow.springboot.extension;
+
+import org.smartboot.flow.core.parser.ObjectCreator;
+import org.smartboot.flow.manager.reload.Reloader;
+import org.smartboot.flow.manager.reload.SqlXmlSelector;
+import org.smartboot.flow.manager.reload.XmlParseReloader;
+import org.smartboot.flow.manager.reload.XmlSelector;
+import org.smartboot.flow.spring.extension.BeanDefinitionVisitor;
+import org.smartboot.flow.spring.extension.SpringObjectCreator;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * smart flow httReport auto config
+ *
+ * @author huqiang
+ * @since 2022/12/15 16:32
+ */
+@Configuration
+@ConfigurationProperties(prefix = "smart.flow.manage.reload")
+public class FlowHttpReloadConfiguration {
+
+
+ /**
+ * Assemble engine after reload.
+ */
+ private boolean assemble;
+
+ private DataSource datasource;
+
+ /**
+ * Selector datasource.
+ */
+ public static class DataSource {
+ private String url;
+ private String driver;
+ private String username;
+ private String password;
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+ public void setDriver(String driver) {
+ this.driver = driver;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+ }
+
+
+ @ConditionalOnProperty(name = "smart.flow.manage.reload.spring-object-creator", havingValue = "true")
+ @ConditionalOnMissingBean(SpringObjectCreator.class)
+ @Bean("springObjectCreator")
+ public ObjectCreator getSpringObjectCreator(ApplicationContext ctx) {
+ SpringObjectCreator soc = new SpringObjectCreator();
+ soc.setApplicationContext(ctx);
+ return soc;
+ }
+
+ @ConditionalOnMissingBean(BeanDefinitionVisitor.class)
+ @Bean("beanDefVisitor")
+ public BeanDefinitionVisitor getVisitor(ApplicationContext ctx) {
+ BeanDefinitionVisitor visitor = new BeanDefinitionVisitor();
+ visitor.setBeanFactory(ctx);
+ return visitor;
+ }
+
+ @ConditionalOnMissingBean(XmlSelector.class)
+ @ConditionalOnProperty(name = "smart.flow.manage.reload.datasource.url", matchIfMissing = false)
+ @Bean("xmlSelector")
+ public XmlSelector getXmlSelector() {
+ SqlXmlSelector selector = new SqlXmlSelector();
+
+ if (this.datasource.getDriver() != null) {
+ selector.setDriver(datasource.getDriver());
+ }
+
+ selector.setUrl(datasource.getUrl());
+ selector.setUsername(datasource.getUsername());
+ selector.setPassword(datasource.getPassword());
+ return selector;
+ }
+
+ @Bean
+ @ConditionalOnBean(XmlSelector.class)
+ public Reloader getReloader(ApplicationContext ctx) {
+ XmlParseReloader reloader = new XmlParseReloader();
+ reloader.setAssemble(assemble);
+
+ try {
+ SpringObjectCreator creator = ctx.getBean(SpringObjectCreator.class);
+ reloader.setObjectCreator(creator);
+ } catch (Exception ignored) {
+
+ }
+
+ try {
+ XmlSelector selector = ctx.getBean(XmlSelector.class);
+ reloader.setXmlSelector(selector);
+ } catch (Exception ignored) {
+
+ }
+
+ try {
+ BeanDefinitionVisitor visitor = ctx.getBean(BeanDefinitionVisitor.class);
+ reloader.setVisitor(visitor);
+ } catch (Exception ignored) {
+
+ }
+
+ return reloader;
+ }
+
+ public void setAssemble(boolean assemble) {
+ this.assemble = assemble;
+ }
+
+ public void setDatasource(DataSource dataSource) {
+ this.datasource = dataSource;
+ }
+}
diff --git a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReportConfiguration.java b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReportConfiguration.java
index 5e25516..6029143 100644
--- a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReportConfiguration.java
+++ b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReportConfiguration.java
@@ -1,6 +1,7 @@
package org.smartboot.flow.springboot.extension;
import org.smartboot.flow.manager.report.HttpReporter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -13,16 +14,25 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration
@ConfigurationProperties(prefix = "smart.flow.report.http")
+@ConditionalOnProperty(name = "smart.flow.report.http.url")
public class FlowHttpReportConfiguration {
-
+ /**
+ * Connect timeout in microseconds.
+ */
private long timeout;
+ /**
+ * Report url.
+ */
private String url;
- private long idle;
+ /**
+ * Default idle in microseconds.
+ */
+ private long idle = 5000L;
- @Bean
+ @Bean(value = "smart-flow-http-reporter", initMethod = "start")
public HttpReporter getHttpReporter() {
HttpReporter reporter = new HttpReporter();
reporter.setTimeout(this.timeout);
diff --git a/smart-flow-springboot-starter/src/main/resources/META-INF/spring.factories b/smart-flow-springboot-starter/src/main/resources/META-INF/spring.factories
index cd6d66e..416b82d 100644
--- a/smart-flow-springboot-starter/src/main/resources/META-INF/spring.factories
+++ b/smart-flow-springboot-starter/src/main/resources/META-INF/spring.factories
@@ -1,3 +1,4 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.smartboot.flow.springboot.extension.FlowHttpManageConfiguration,\
- org.smartboot.flow.springboot.extension.FlowHttpReportConfiguration
\ No newline at end of file
+ org.smartboot.flow.springboot.extension.FlowHttpReportConfiguration,\
+ org.smartboot.flow.springboot.extension.FlowHttpReloadConfiguration
\ No newline at end of file
--
Gitee
From ec7a6a512160ae8d3426090a37a965ffa884245d Mon Sep 17 00:00:00 2001
From: qinluo <1558642210@qq.com>
Date: Fri, 6 Jan 2023 14:05:48 +0800
Subject: [PATCH 05/18] qinluo: - remove
---
.../flow/springboot/extension/FlowHttpReloadConfiguration.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReloadConfiguration.java b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReloadConfiguration.java
index 9c9add0..a466177 100644
--- a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReloadConfiguration.java
+++ b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReloadConfiguration.java
@@ -94,7 +94,7 @@ public class FlowHttpReloadConfiguration {
}
@ConditionalOnMissingBean(XmlSelector.class)
- @ConditionalOnProperty(name = "smart.flow.manage.reload.datasource.url", matchIfMissing = false)
+ @ConditionalOnProperty(name = "smart.flow.manage.reload.datasource.url")
@Bean("xmlSelector")
public XmlSelector getXmlSelector() {
SqlXmlSelector selector = new SqlXmlSelector();
--
Gitee
From 2643625a0723481d58b1f66e2c596e49a96137f8 Mon Sep 17 00:00:00 2001
From: qinluo <1558642210@qq.com>
Date: Fri, 6 Jan 2023 18:54:33 +0800
Subject: [PATCH 06/18] qinluo: - initializer with springboot -
metrics listener optimize - some optimized
---
.../core/metrics/MetricExecutionListener.java | 33 +++++--
.../FlowHttpManageConfiguration.java | 14 ++-
.../FlowInitializerConfiguration.java | 91 +++++++++++++++++++
...tion.java => FlowReloadConfiguration.java} | 11 ++-
.../main/resources/META-INF/spring.factories | 3 +-
5 files changed, 137 insertions(+), 15 deletions(-)
create mode 100644 smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowInitializerConfiguration.java
rename smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/{FlowHttpReloadConfiguration.java => FlowReloadConfiguration.java} (95%)
diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/metrics/MetricExecutionListener.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/metrics/MetricExecutionListener.java
index b9d5463..550acc4 100644
--- a/smart-flow-core/src/main/java/org/smartboot/flow/core/metrics/MetricExecutionListener.java
+++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/metrics/MetricExecutionListener.java
@@ -28,15 +28,18 @@ public class MetricExecutionListener extends ExecutionListenerSupport {
return;
}
+ Measurable measurable = (Measurable) object;
+ Metrics metrics = measurable.getMetrics();
+ if (metrics.getClass() != Metrics.class) {
+ return;
+ }
+
Map