From 2c3be456b6274bcf24330f9c564372cc882ef9e4 Mon Sep 17 00:00:00 2001
From: byteblogs168 <598092184@qq.com>
Date: Sun, 10 Sep 2023 23:12:34 +0800
Subject: [PATCH] =?UTF-8?q?feat:2.3.0=201.=20=E6=96=B0=E5=A2=9EbizNo?=
=?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=A7=A3=E6=9E=90=E5=BC=95=E6=93=8E?=
=?UTF-8?q?Aviator=E3=80=81SpEl=E3=80=81QL?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
easy-retry-client-core/pom.xml | 14 +++++
.../retry/client/core/ExpressionEngine.java | 24 +++++++++
.../expression/AbstractExpressionEngine.java | 43 +++++++++++++++
.../expression/AviatorExpressionEngine.java | 31 +++++++++++
.../core/expression/QLExpressEngine.java | 35 +++++++++++++
.../core/expression/SpELExpressionEngine.java | 36 +++++++++++++
.../core/loader/EasyRetrySpiLoader.java | 11 ++++
.../client/core/report/AbstractReport.java | 11 ++--
.../client/core/spel/SPELParamFunction.java | 52 -------------------
.../easy-retry-common-client-api/pom.xml | 1 +
.../easy-retry-common-core/pom.xml | 10 ++--
.../easy/retry/common/core/util/JsonUtil.java | 13 ++---
.../easy-retry-common-server-api/pom.xml | 1 +
.../access/task/AbstractTaskAccess.java | 9 ----
.../datasource/utils/RequestDataHelper.java | 4 +-
15 files changed, 213 insertions(+), 82 deletions(-)
create mode 100644 easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/ExpressionEngine.java
create mode 100644 easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/AbstractExpressionEngine.java
create mode 100644 easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/AviatorExpressionEngine.java
create mode 100644 easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/QLExpressEngine.java
create mode 100644 easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/SpELExpressionEngine.java
delete mode 100644 easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/spel/SPELParamFunction.java
diff --git a/easy-retry-client-core/pom.xml b/easy-retry-client-core/pom.xml
index e66dbfbe2..ad644f202 100644
--- a/easy-retry-client-core/pom.xml
+++ b/easy-retry-client-core/pom.xml
@@ -49,6 +49,20 @@
provided
true
+
+ com.googlecode.aviator
+ aviator
+ 5.3.3
+ provided
+ true
+
+
+ com.alibaba
+ QLExpress
+ 3.3.1
+ provided
+ true
+
io.netty
netty-all
diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/ExpressionEngine.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/ExpressionEngine.java
new file mode 100644
index 000000000..cbb2d8f0f
--- /dev/null
+++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/ExpressionEngine.java
@@ -0,0 +1,24 @@
+package com.aizuda.easy.retry.client.core;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * 参数表达式解析引擎
+ *
+ * @author www.byteblogs.com
+ * @date 2023-09-10 12:30:23
+ * @since 2.3.0
+ */
+public interface ExpressionEngine {
+
+ /**
+ * 执行表达式
+ * @param expression 表达式
+ *
+ * @param args 参数信息
+ * @param method 方法对象
+ * @return 执行结果
+ */
+ Object eval(String expression, Object[] args, Method method);
+}
diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/AbstractExpressionEngine.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/AbstractExpressionEngine.java
new file mode 100644
index 000000000..4cd5fa0cf
--- /dev/null
+++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/AbstractExpressionEngine.java
@@ -0,0 +1,43 @@
+package com.aizuda.easy.retry.client.core.expression;
+
+import cn.hutool.core.util.StrUtil;
+import com.aizuda.easy.retry.client.core.ExpressionEngine;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.core.DefaultParameterNameDiscoverer;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author www.byteblogs.com
+ * @date 2023-09-10 12:31:17
+ * @since 2.3.0
+ */
+public abstract class AbstractExpressionEngine implements ExpressionEngine {
+ private static final DefaultParameterNameDiscoverer DISCOVERER = new DefaultParameterNameDiscoverer();
+
+ @Override
+ public Object eval(String expression, Object[] args, Method method) {
+
+ if (StringUtils.isBlank(expression)) {
+ return StrUtil.EMPTY;
+ }
+
+ // 获取参数名称
+ String[] paramNameArr = DISCOVERER.getParameterNames(method);
+ if (ArrayUtils.isEmpty(paramNameArr)) {
+ return null;
+ }
+
+ Map context = new HashMap<>(args.length);
+ for (int i = 0; i < paramNameArr.length; i++) {
+ context.put(paramNameArr[i], args[i]);
+ }
+
+ return doEval(expression, context);
+ }
+
+ protected abstract Object doEval(String expression, Map context);
+}
diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/AviatorExpressionEngine.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/AviatorExpressionEngine.java
new file mode 100644
index 000000000..673769424
--- /dev/null
+++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/AviatorExpressionEngine.java
@@ -0,0 +1,31 @@
+package com.aizuda.easy.retry.client.core.expression;
+
+import com.aizuda.easy.retry.client.core.exception.EasyRetryClientException;
+import com.aizuda.easy.retry.common.core.util.JsonUtil;
+import com.googlecode.aviator.AviatorEvaluator;
+import com.googlecode.aviator.AviatorEvaluatorInstance;
+
+import java.util.Map;
+
+/**
+ * Aviator 表达式
+ *
+ * @author www.byteblogs.com
+ * @date 2023-09-10 17:34:07
+ * @since 2.3.0
+ */
+public class AviatorExpressionEngine extends AbstractExpressionEngine{
+
+ private static final AviatorEvaluatorInstance ENGINE = AviatorEvaluator.getInstance();
+
+ @Override
+ protected Object doEval(String expression, Map context) {
+
+ try {
+ return ENGINE.execute(expression, context);
+ } catch (Exception e) {
+ throw new EasyRetryClientException("Aviator表达式解析异常. expression:[{}] context:[{}]",
+ expression, JsonUtil.toJsonString(context), e);
+ }
+ }
+}
diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/QLExpressEngine.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/QLExpressEngine.java
new file mode 100644
index 000000000..1a9949231
--- /dev/null
+++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/QLExpressEngine.java
@@ -0,0 +1,35 @@
+package com.aizuda.easy.retry.client.core.expression;
+
+import cn.hutool.extra.expression.ExpressionException;
+import com.aizuda.easy.retry.client.core.exception.EasyRetryClientException;
+import com.aizuda.easy.retry.common.core.util.JsonUtil;
+import com.ql.util.express.DefaultContext;
+import com.ql.util.express.ExpressRunner;
+
+import java.util.Map;
+
+/**
+ * QL表达式解析器
+ *
+ * @author www.byteblogs.com
+ * @date 2023-09-10 17:40:34
+ * @since 2.3.0
+ */
+public class QLExpressEngine extends AbstractExpressionEngine {
+
+ private static final ExpressRunner ENGINE = new ExpressRunner();
+
+ @Override
+ protected Object doEval(String expression, Map context) {
+
+ final DefaultContext defaultContext = new DefaultContext<>();
+ defaultContext.putAll(context);
+ try {
+ return ENGINE.execute(expression, defaultContext, null, true, false);
+ } catch (Exception e) {
+ throw new EasyRetryClientException("QL表达式解析异常. expression:[{}] context:[{}]",
+ expression, JsonUtil.toJsonString(context), e);
+ }
+
+ }
+}
diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/SpELExpressionEngine.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/SpELExpressionEngine.java
new file mode 100644
index 000000000..05536e389
--- /dev/null
+++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/expression/SpELExpressionEngine.java
@@ -0,0 +1,36 @@
+package com.aizuda.easy.retry.client.core.expression;
+
+import com.aizuda.easy.retry.client.core.exception.EasyRetryClientException;
+import com.aizuda.easy.retry.common.core.util.JsonUtil;
+import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+
+import java.util.Map;
+
+/**
+ * Spel表达式解析引擎
+ *
+ * @author www.byteblogs.com
+ * @date 2023-09-10 12:36:56
+ * @since 2.3.0
+ */
+public class SpELExpressionEngine extends AbstractExpressionEngine {
+
+ private final static ExpressionParser ENGINE = new SpelExpressionParser();
+
+ @Override
+ protected Object doEval(String expression, Map context) {
+
+ try {
+ final EvaluationContext evaluationContext = new StandardEvaluationContext();
+ context.forEach(evaluationContext::setVariable);
+ return ENGINE.parseExpression(expression).getValue(evaluationContext, String.class);
+ } catch (Exception e) {
+ throw new EasyRetryClientException("SpEL表达式解析异常. expression:[{}] context:[{}]",
+ expression, JsonUtil.toJsonString(context), e);
+ }
+
+ }
+}
diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/loader/EasyRetrySpiLoader.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/loader/EasyRetrySpiLoader.java
index 25dd5d902..8050d376a 100644
--- a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/loader/EasyRetrySpiLoader.java
+++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/loader/EasyRetrySpiLoader.java
@@ -1,10 +1,12 @@
package com.aizuda.easy.retry.client.core.loader;
import cn.hutool.core.util.ServiceLoaderUtil;
+import com.aizuda.easy.retry.client.core.ExpressionEngine;
import com.aizuda.easy.retry.client.core.RetryArgSerializer;
import com.aizuda.easy.retry.client.core.event.EasyRetryListener;
import com.aizuda.easy.retry.client.core.event.SimpleEasyRetryListener;
import com.aizuda.easy.retry.client.core.RetrySiteSnapshotContext;
+import com.aizuda.easy.retry.client.core.expression.SpELExpressionEngine;
import com.aizuda.easy.retry.client.core.intercepter.ThreadLockRetrySiteSnapshotContext;
import com.aizuda.easy.retry.client.core.serializer.JacksonSerializer;
import org.springframework.util.CollectionUtils;
@@ -58,4 +60,13 @@ public class EasyRetrySpiLoader {
return Optional.ofNullable(ServiceLoaderUtil.loadFirst(RetrySiteSnapshotContext.class)).orElse(new ThreadLockRetrySiteSnapshotContext(new ThreadLocal<>()));
}
+ /**
+ * 表达式引擎SPI类
+ *
+ * @return {@link SpELExpressionEngine} 默认序列化类为SpELExpressionEngine
+ */
+ public static ExpressionEngine loadExpressionEngine() {
+ return Optional.ofNullable(ServiceLoaderUtil.loadFirst(ExpressionEngine.class)).orElse(new SpELExpressionEngine());
+ }
+
}
diff --git a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/report/AbstractReport.java b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/report/AbstractReport.java
index 42ab1539a..f3c224dea 100644
--- a/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/report/AbstractReport.java
+++ b/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/report/AbstractReport.java
@@ -1,6 +1,7 @@
package com.aizuda.easy.retry.client.core.report;
import cn.hutool.core.lang.Assert;
+import com.aizuda.easy.retry.client.core.ExpressionEngine;
import com.aizuda.easy.retry.client.core.IdempotentIdGenerate;
import com.aizuda.easy.retry.client.core.Report;
import com.aizuda.easy.retry.client.core.RetryArgSerializer;
@@ -8,9 +9,8 @@ import com.aizuda.easy.retry.client.core.cache.RetryerInfoCache;
import com.aizuda.easy.retry.client.core.config.EasyRetryProperties;
import com.aizuda.easy.retry.client.core.exception.EasyRetryClientException;
import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot;
-import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
import com.aizuda.easy.retry.client.core.loader.EasyRetrySpiLoader;
-import com.aizuda.easy.retry.client.core.spel.SPELParamFunction;
+import com.aizuda.easy.retry.client.core.retryer.RetryerInfo;
import com.aizuda.easy.retry.common.core.log.LogUtils;
import com.aizuda.easy.retry.common.core.model.IdempotentIdContext;
import com.aizuda.easy.retry.server.model.dto.RetryTaskDTO;
@@ -18,7 +18,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;
-import java.util.function.Function;
/**
* 上报抽象类
@@ -80,9 +79,9 @@ public abstract class AbstractReport implements Report {
retryTaskDTO.setGroupName(EasyRetryProperties.getGroup());
retryTaskDTO.setSceneName(scene);
- String bizNoSpel = retryerInfo.getBizNo();
- Function