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 escaped = context.getExt(Key.of(this)); if (escaped == null) { escaped = new ConcurrentHashMap<>(); context.putExt(Key.of(this), escaped); } - - Measurable measurable = (Measurable) object; - Metrics metrics = measurable.getMetrics(); metrics.addMetric(NamedMetrics.EXECUTE, 1); escaped.put(object, System.currentTimeMillis()); } @@ -47,6 +50,12 @@ public class MetricExecutionListener extends ExecutionListenerSupport { return; } + Measurable measurable = (Measurable) object; + Metrics metrics = measurable.getMetrics(); + if (metrics.getClass() != Metrics.class) { + return; + } + Map escaped = context.getExt(Key.of(this)); if (escaped == null) { return; @@ -57,8 +66,6 @@ public class MetricExecutionListener extends ExecutionListenerSupport { return; } - Measurable measurable = (Measurable) object; - Metrics metrics = measurable.getMetrics(); if (context.getFatal() != null) { metrics.addMetric(NamedMetrics.FAIL, 1); } @@ -73,13 +80,17 @@ public class MetricExecutionListener extends ExecutionListenerSupport { return; } + Measurable measurable = (Measurable) object; + Metrics metrics = measurable.getMetrics(); + if (metrics.getClass() != Metrics.class) { + return; + } + Map escaped = context.getExt(Key.of(this)); if (escaped == null) { return; } - Measurable measurable = (Measurable) object; - Metrics metrics = measurable.getMetrics(); metrics.addMetric(NamedMetrics.ROLLBACK, 1); escaped.put(object, System.currentTimeMillis()); } @@ -90,6 +101,12 @@ public class MetricExecutionListener extends ExecutionListenerSupport { return; } + Measurable measurable = (Measurable) object; + Metrics metrics = measurable.getMetrics(); + if (metrics.getClass() != Metrics.class) { + return; + } + Map escaped = context.getExt(Key.of(this)); if (escaped == null) { return; @@ -100,8 +117,6 @@ public class MetricExecutionListener extends ExecutionListenerSupport { return; } - Measurable measurable = (Measurable) object; - Metrics metrics = measurable.getMetrics(); long now = System.currentTimeMillis(); metrics.addMetric(NamedMetrics.ROLLBACK_TOTAL_ESCAPE, (now - start)); metrics.addMetric(MetricKind.MAX, NamedMetrics.ROLLBACK_MAX_ESCAPE, (now - start)); 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 4106c3f..c0198cd 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 @@ -18,21 +18,30 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnProperty(name = "smart.flow.manage.http.url") public class FlowHttpManageConfiguration { + /** + * Connect timeout in microseconds. + */ private long timeout; + /** + * Manage request url. + */ private String url; + /** + * request idle in microseconds. + */ private long idle; /** - * Default idle in microseconds. + * First delay in microseconds. */ private long delayAtFirst; /** * Configuration http manager without reloader. */ - @Bean("smart-flow-http-manager") + @Bean(value = "smart-flow-http-manager", initMethod = "start") @ConditionalOnMissingBean(Reloader.class) public HttpManager getHttpManager(){ HttpManager httpManager = new HttpManager(); @@ -40,7 +49,6 @@ public class FlowHttpManageConfiguration { httpManager.setUrl(url); httpManager.setIdle(idle); httpManager.setDelayAtFirst(delayAtFirst); - httpManager.start(); return httpManager; } diff --git a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowInitializerConfiguration.java b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowInitializerConfiguration.java new file mode 100644 index 0000000..f042783 --- /dev/null +++ b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowInitializerConfiguration.java @@ -0,0 +1,91 @@ +package org.smartboot.flow.springboot.extension; + +import org.smartboot.flow.manager.EngineInitializer; +import org.smartboot.flow.manager.reload.Reloader; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +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; + +import java.util.Arrays; + +/** + * smart flow EngineInitializer auto config + * + * @author huqiang + * @since 2022/12/15 16:32 + */ +@Configuration +@ConfigurationProperties(prefix = "smart.flow.initialize") +@ConditionalOnProperty(name = "smart.flow.initialize.engines") +@AutoConfigureAfter(FlowReloadConfiguration.class) +public class FlowInitializerConfiguration implements BeanPostProcessor, BeanFactoryAware { + + /** + * Initializer engines, multiple engine name split with , + */ + private String engines; + + /** + * Ensure EngineInitializer#start execute in high order. + */ + private volatile boolean processed; + private BeanFactory beanFactory; + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + // Fire EngineInitializer#start + this.process(); + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + + private void process() { + if (processed) { + return; + } + + processed = true; + + try { + beanFactory.getBean("springboot-engine-initializer"); + } catch (Exception ignored) { + try { + beanFactory.getBean(EngineInitializer.class); + } catch (Exception ignore) { + + } + } + } + + @Override + public void setBeanFactory(BeanFactory beanFactory) throws BeansException { + this.beanFactory = beanFactory; + } + + @Bean(value = "springboot-engine-initializer", initMethod = "start") + @ConditionalOnBean(Reloader.class) + @ConditionalOnMissingBean(EngineInitializer.class) + public EngineInitializer getInitializer(Reloader reloader) { + EngineInitializer initializer = new EngineInitializer(); + initializer.setReloader(reloader); + initializer.setEngines(Arrays.asList(engines.split(","))); + return initializer; + } + + + public void setEngines(String engines) { + this.engines = engines; + } +} 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/FlowReloadConfiguration.java similarity index 95% rename from smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowHttpReloadConfiguration.java rename to smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java index a466177..b282fe7 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/FlowReloadConfiguration.java @@ -16,14 +16,14 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** - * smart flow httReport auto config + * smart flow reload auto config * * @author huqiang * @since 2022/12/15 16:32 */ @Configuration @ConfigurationProperties(prefix = "smart.flow.manage.reload") -public class FlowHttpReloadConfiguration { +public class FlowReloadConfiguration { /** @@ -31,6 +31,9 @@ public class FlowHttpReloadConfiguration { */ private boolean assemble; + /** + * Selector datasource config. + */ private DataSource datasource; /** @@ -38,6 +41,10 @@ public class FlowHttpReloadConfiguration { */ public static class DataSource { private String url; + + /** + * Ensure driver lib in classpath. + */ private String driver; private String username; private String password; 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 416b82d..0fe6437 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,4 +1,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.smartboot.flow.springboot.extension.FlowHttpManageConfiguration,\ org.smartboot.flow.springboot.extension.FlowHttpReportConfiguration,\ - org.smartboot.flow.springboot.extension.FlowHttpReloadConfiguration \ No newline at end of file + org.smartboot.flow.springboot.extension.FlowReloadConfiguration,\ + org.smartboot.flow.springboot.extension.FlowInitializerConfiguration \ No newline at end of file -- Gitee From c15c5287f7c2fb98165ab010c889263b46f44b28 Mon Sep 17 00:00:00 2001 From: qinluo <1558642210@qq.com> Date: Mon, 9 Jan 2023 18:34:20 +0800 Subject: [PATCH 07/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20=E4=B8=8A?= =?UTF-8?q?=E6=8A=A5=E9=97=B4=E9=9A=94=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/smartboot/flow/manager/change/HttpManager.java | 3 ++- .../org/smartboot/flow/manager/report/AbstractReporter.java | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) 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 d64ee59..418203a 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 @@ -36,7 +36,7 @@ public class HttpManager { private String url; private long timeout; private Map headers; - private long idle; + private long idle = 5000L; private HttpClient client; private String path; private long delayAtFirst; @@ -183,6 +183,7 @@ public class HttpManager { } public void setIdle(long idle) { + AssertUtil.isTrue(idle > 0, "idle must great than zero"); this.idle = idle; } diff --git a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/report/AbstractReporter.java b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/report/AbstractReporter.java index 72ad70c..e6f33ba 100644 --- a/smart-flow-manager/src/main/java/org/smartboot/flow/manager/report/AbstractReporter.java +++ b/smart-flow-manager/src/main/java/org/smartboot/flow/manager/report/AbstractReporter.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; import org.smartboot.flow.core.manager.DefaultEngineManager; import org.smartboot.flow.core.manager.EngineManager; import org.smartboot.flow.core.manager.EngineModel; +import org.smartboot.flow.core.util.AssertUtil; import org.smartboot.flow.manager.NamedThreadFactory; import java.util.List; @@ -25,13 +26,14 @@ public abstract class AbstractReporter { /** * Report idle in mills. */ - protected long idle; + protected long idle = 5000L; public long getIdle() { return idle; } public void setIdle(long idle) { + AssertUtil.isTrue(idle > 0, "idle must great than zero"); this.idle = idle; } -- Gitee From ae3ab25e705edf85f0c80c61e2293c99f0ee30ca Mon Sep 17 00:00:00 2001 From: qinluo <1558642210@qq.com> Date: Mon, 9 Jan 2023 18:42:58 +0800 Subject: [PATCH 08/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9metrics=E8=BF=94=E5=9B=9E=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/smartboot/flow/core/metrics/Metrics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/metrics/Metrics.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/metrics/Metrics.java index 236678e..61c8ee6 100644 --- a/smart-flow-core/src/main/java/org/smartboot/flow/core/metrics/Metrics.java +++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/metrics/Metrics.java @@ -29,7 +29,7 @@ public class Metrics { counter.increment(value); } - public Map getMetrics() { + public Map getMetrics() { return Collections.unmodifiableMap(COUNTERS); } -- Gitee From 069580162be173b4571777c016c8cf2b9884830c Mon Sep 17 00:00:00 2001 From: qinluo <1558642210@qq.com> Date: Tue, 10 Jan 2023 14:48:02 +0800 Subject: [PATCH 09/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/smartboot/flow/manager/reload/XmlParseReloader.java | 2 +- .../flow/springboot/extension/FlowReloadConfiguration.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 986cb46..a4721f9 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 @@ -73,7 +73,7 @@ public class XmlParseReloader extends AbstractReloader { FlowEngine engine = parser.getEngine(p); if (engine != null) { defaultManager.detach(p); - defaultManager.register(engine); + engine.validate(); } }); } else if (visitor != null){ diff --git a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java index b282fe7..af038de 100644 --- a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java +++ b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java @@ -84,7 +84,7 @@ public class FlowReloadConfiguration { @ConditionalOnProperty(name = "smart.flow.manage.reload.spring-object-creator", havingValue = "true") - @ConditionalOnMissingBean(SpringObjectCreator.class) + @ConditionalOnMissingBean(ObjectCreator.class) @Bean("springObjectCreator") public ObjectCreator getSpringObjectCreator(ApplicationContext ctx) { SpringObjectCreator soc = new SpringObjectCreator(); @@ -123,7 +123,7 @@ public class FlowReloadConfiguration { reloader.setAssemble(assemble); try { - SpringObjectCreator creator = ctx.getBean(SpringObjectCreator.class); + ObjectCreator creator = ctx.getBean(ObjectCreator.class); reloader.setObjectCreator(creator); } catch (Exception ignored) { -- Gitee From 14f108374ebde03cb388d6d6d7815f1db782afdd Mon Sep 17 00:00:00 2001 From: qinluo <1558642210@qq.com> Date: Tue, 10 Jan 2023 17:42:37 +0800 Subject: [PATCH 10/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 140913b..dacda08 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ smart-flow 是一个轻量、灵活的业务流程编排框架,支持业务流 - [X] 支持HTTP方式引擎数据上报(包含执行数据) - [X] 支持组件动态管理(动态降级、启用组件等功能) - [ ] 简易管理后台 -- [ ] 支持从数据库等存储介质重新加载 +- [X] 支持从数据库等存储介质重新加载 更多使用文档见: [官方文档](https://www.yuque.com/weifu-fsmes/smart-flow) -- Gitee From 2f463f7dec42ded4578bd3c118170faa477c142c Mon Sep 17 00:00:00 2001 From: qinluo <1558642210@qq.com> Date: Thu, 12 Jan 2023 13:50:19 +0800 Subject: [PATCH 11/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/smartboot/flow/core/attribute/AttributeHolder.java | 4 ++++ .../java/org/smartboot/flow/core/attribute/Attributes.java | 2 +- .../java/org/smartboot/flow/core/parser/ElementUtils.java | 2 +- .../java/org/smartboot/flow/manager/change/HttpManager.java | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/AttributeHolder.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/AttributeHolder.java index 1cac30f..c7f7b02 100644 --- a/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/AttributeHolder.java +++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/AttributeHolder.java @@ -15,6 +15,10 @@ public class AttributeHolder { this.value = value; } + public static AttributeHolder of(Attributes attribute, Object value) { + return new AttributeHolder(attribute, value); + } + public Attributes getAttribute() { return attribute; } diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/Attributes.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/Attributes.java index bc9eafe..835078e 100644 --- a/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/Attributes.java +++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/attribute/Attributes.java @@ -113,7 +113,7 @@ public enum Attributes { } public void apply(Component component, Object value) { - component.addAttribute(new AttributeHolder(this, value)); + component.addAttribute(AttributeHolder.of(this, value)); } public static Attributes byName(String name) { diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/ElementUtils.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/ElementUtils.java index 66921fb..ac162f7 100644 --- a/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/ElementUtils.java +++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/parser/ElementUtils.java @@ -31,7 +31,7 @@ public final class ElementUtils { continue; } - holders.add(new AttributeHolder(attribute, item.getNodeValue())); + holders.add(AttributeHolder.of(attribute, item.getNodeValue())); } return holders; 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 418203a..609fbf9 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 @@ -123,7 +123,7 @@ public class HttpManager { } try { - DefaultEngineManager.getDefaultManager().changeAttributes(cm.getIdentifier(), new AttributeHolder(attribute, cm.getValue())); + DefaultEngineManager.getDefaultManager().changeAttributes(cm.getIdentifier(), AttributeHolder.of(attribute, cm.getValue())); } catch (Exception e) { LOGGER.error("update attribute failed, attribute = {}, identifier = {}, value = {}", attribute, cm.getIdentifier(), cm.getValue(), e); -- Gitee From 6ed84f622c058878101366e2268e4dd49cb58c9b Mon Sep 17 00:00:00 2001 From: yisshengyouni Date: Thu, 12 Jan 2023 16:51:05 +0800 Subject: [PATCH 12/18] =?UTF-8?q?core=E6=A8=A1=E5=9D=97=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=20junit=E4=BE=9D=E8=B5=96=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- smart-flow-core/pom.xml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/smart-flow-core/pom.xml b/smart-flow-core/pom.xml index 295e5ca..fcfcc25 100644 --- a/smart-flow-core/pom.xml +++ b/smart-flow-core/pom.xml @@ -17,20 +17,6 @@ - - - org.junit.jupiter - junit-jupiter-api - 5.9.1 - test - - - - org.junit.jupiter - junit-jupiter-engine - 5.9.1 - test - -- Gitee From fa27d9b2ab060a56957cbb3c62944be3467849f8 Mon Sep 17 00:00:00 2001 From: yisshengyouni Date: Fri, 13 Jan 2023 15:02:49 +0800 Subject: [PATCH 13/18] metrics reset --- .../src/main/java/org/smartboot/flow/core/Measurable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java index 57a12ca..541e5f4 100644 --- a/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java +++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java @@ -25,7 +25,7 @@ public interface Measurable { default void reset() { Metrics metrics = MetricsManager.allocate(this); if (metrics != null) { - metrics.reset(); + metrics = getMetrics(); } } } -- Gitee From 9a5588c1894215ac35f1e708a0b86f3f2f1b11b2 Mon Sep 17 00:00:00 2001 From: yisshengyouni Date: Fri, 13 Jan 2023 15:11:04 +0800 Subject: [PATCH 14/18] metrics reset --- .../src/main/java/org/smartboot/flow/core/Measurable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java index 541e5f4..d5f0cc6 100644 --- a/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java +++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java @@ -25,7 +25,7 @@ public interface Measurable { default void reset() { Metrics metrics = MetricsManager.allocate(this); if (metrics != null) { - metrics = getMetrics(); + getMetrics().reset(); } } } -- Gitee From 190b8c2af4517f378323335f60ced5ea8699a126 Mon Sep 17 00:00:00 2001 From: qinluo <1558642210@qq.com> Date: Fri, 13 Jan 2023 15:15:37 +0800 Subject: [PATCH 15/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/smartboot/flow/core/Measurable.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java b/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java index d5f0cc6..5068150 100644 --- a/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java +++ b/smart-flow-core/src/main/java/org/smartboot/flow/core/Measurable.java @@ -23,9 +23,9 @@ public interface Measurable { * Reset metrics */ default void reset() { - Metrics metrics = MetricsManager.allocate(this); + Metrics metrics = getMetrics(); if (metrics != null) { - getMetrics().reset(); + metrics.reset(); } } } -- Gitee From 60793fa919fe6700a68b6c0bf55cba10b086a3c6 Mon Sep 17 00:00:00 2001 From: qinluo <1558642210@qq.com> Date: Fri, 13 Jan 2023 17:53:00 +0800 Subject: [PATCH 16/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20springboot?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flow/springboot/extension/FlowReloadConfiguration.java | 1 + 1 file changed, 1 insertion(+) diff --git a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java index af038de..7fb40f3 100644 --- a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java +++ b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java @@ -23,6 +23,7 @@ import org.springframework.context.annotation.Configuration; */ @Configuration @ConfigurationProperties(prefix = "smart.flow.manage.reload") +@ConditionalOnProperty(name = "smart.flow.manage.reload.enable", havingValue = "true") public class FlowReloadConfiguration { -- Gitee From 6ef39866b3f79861156549b214a2472737dd9632 Mon Sep 17 00:00:00 2001 From: qinluo <1558642210@qq.com> Date: Fri, 13 Jan 2023 18:05:35 +0800 Subject: [PATCH 17/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20springboot?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flow/springboot/extension/FlowReloadConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java index 7fb40f3..fad3f1a 100644 --- a/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java +++ b/smart-flow-springboot-starter/src/main/java/org/smartboot/flow/springboot/extension/FlowReloadConfiguration.java @@ -101,7 +101,6 @@ public class FlowReloadConfiguration { return visitor; } - @ConditionalOnMissingBean(XmlSelector.class) @ConditionalOnProperty(name = "smart.flow.manage.reload.datasource.url") @Bean("xmlSelector") public XmlSelector getXmlSelector() { -- Gitee From 8ba2cd67a647ab4c46a2a10fb66f94017317e50f Mon Sep 17 00:00:00 2001 From: qinluo <1558642210@qq.com> Date: Sat, 14 Jan 2023 19:04:05 +0800 Subject: [PATCH 18/18] =?UTF-8?q?qinluo:=20=20=20=20=20=20-=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E6=AD=A3=E5=BC=8F=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- smart-flow-core/pom.xml | 2 +- smart-flow-manager/pom.xml | 6 +++--- smart-flow-script-condition/pom.xml | 4 ++-- .../smart-flow-script-groovy/pom.xml | 2 +- smart-flow-script-condition/smart-flow-script-ognl/pom.xml | 2 +- .../smart-flow-script-qlexpress/pom.xml | 2 +- smart-flow-spring-extension/pom.xml | 4 ++-- smart-flow-springboot-starter/pom.xml | 6 +++--- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 3aba23f..72fef30 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.smartboot.flow smart-flow-parent - 1.0.4-SNAPSHOT + 1.0.4 4.0.0 pom smart-flow diff --git a/smart-flow-core/pom.xml b/smart-flow-core/pom.xml index fcfcc25..9cfc49b 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.4-SNAPSHOT + 1.0.4 4.0.0 diff --git a/smart-flow-manager/pom.xml b/smart-flow-manager/pom.xml index 40bd754..307564e 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.4-SNAPSHOT + 1.0.4 4.0.0 @@ -20,13 +20,13 @@ org.smartboot.flow smart-flow-core - 1.0.4-SNAPSHOT + 1.0.4 org.smartboot.flow smart-flow-spring-extension - 1.0.4-SNAPSHOT + 1.0.4 true diff --git a/smart-flow-script-condition/pom.xml b/smart-flow-script-condition/pom.xml index 5604aef..210a90a 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.4-SNAPSHOT + 1.0.4 4.0.0 pom @@ -27,7 +27,7 @@ org.smartboot.flow smart-flow-core - 1.0.4-SNAPSHOT + 1.0.4 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 5863460..572064d 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.4-SNAPSHOT + 1.0.4 4.0.0 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 cad2149..139a2ea 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.4-SNAPSHOT + 1.0.4 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 0fe09b0..2aec95a 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.4-SNAPSHOT + 1.0.4 4.0.0 diff --git a/smart-flow-spring-extension/pom.xml b/smart-flow-spring-extension/pom.xml index 6f41486..ceef2f0 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.4-SNAPSHOT + 1.0.4 4.0.0 @@ -21,7 +21,7 @@ org.smartboot.flow smart-flow-core - 1.0.4-SNAPSHOT + 1.0.4 diff --git a/smart-flow-springboot-starter/pom.xml b/smart-flow-springboot-starter/pom.xml index f8e5a02..aa357a5 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.4-SNAPSHOT + 1.0.4 4.0.0 @@ -25,12 +25,12 @@ org.smartboot.flow smart-flow-spring-extension - 1.0.4-SNAPSHOT + 1.0.4 org.smartboot.flow smart-flow-manager - 1.0.4-SNAPSHOT + 1.0.4 -- Gitee