From 7d073b8a4c0366d81c5a3beb5d55da71174f2d82 Mon Sep 17 00:00:00 2001 From: icanci Date: Fri, 2 Dec 2022 08:58:05 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=8E=E8=87=AA=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/service/impl/BaseDataServiceImpl.java | 3 +- .../service/impl/DataSourceServiceImpl.java | 3 +- .../biz/service/impl/StrategyServiceImpl.java | 3 +- .../rec/admin/biz/thread/TriggerThread.java | 84 ++--- rec-engine/rec-engine-script/pom.xml | 8 +- .../script/client/AbstractRetryClient.java | 48 +-- .../rec/engine/script/client/Client.java | 295 +++--------------- .../http/ByteArrayMessageConverter.java | 33 -- .../script/client/http/HttpClientImpl.java | 93 ++++++ .../engine/script/client/http/HttpMethod.java | 43 --- .../script/client/http/MessageConverter.java | 18 -- .../script/client/http/OkHttpClientImpl.java | 240 -------------- .../client/http/StringMessageConverter.java | 25 -- .../http/interceptor/HttpCodeInterceptor.java | 45 --- .../http/interceptor/NetworkInterceptor.java | 54 ---- .../client/serializer/FastJsonSerializer.java | 32 -- .../serializer/NativeFastJsonSerializer.java | 32 -- .../script/client/serializer/Serializer.java | 27 -- .../client/serializer/SerializerEnum.java | 91 ------ .../client/serializer/StringSerializer.java | 30 -- .../script/impl/RecScriptEngineImpl.java | 45 +-- .../script/wrapper/HttpResponseWrapper.java | 6 +- .../test/RecScriptEngineManagerTest.java | 5 +- .../engine/sdk/http/spi/AbstractLoadSPI.java | 35 +-- .../engine/sdk/http/spi/HttpBaseDataSPI.java | 4 +- .../sdk/http/spi/HttpDataSourceSPI.java | 4 +- .../engine/sdk/http/spi/HttpDomainSPI.java | 6 +- .../engine/sdk/http/spi/HttpMetadataSPI.java | 4 +- .../rec/engine/sdk/http/spi/HttpSceneSPI.java | 4 +- .../engine/sdk/http/spi/HttpStrategySPI.java | 12 +- .../sdk/server/RecNettyClientHandler.java | 5 +- .../rec/engine/sdk/server/RegisterClient.java | 31 +- 32 files changed, 286 insertions(+), 1082 deletions(-) delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/ByteArrayMessageConverter.java create mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/HttpClientImpl.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/HttpMethod.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/MessageConverter.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/OkHttpClientImpl.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/StringMessageConverter.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/interceptor/HttpCodeInterceptor.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/interceptor/NetworkInterceptor.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/FastJsonSerializer.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/NativeFastJsonSerializer.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/Serializer.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/SerializerEnum.java delete mode 100644 rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/StringSerializer.java diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java index 309c353..dfd7870 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java @@ -15,7 +15,6 @@ import cn.icanci.rec.common.enums.ModuleTypeEnum; import cn.icanci.rec.common.enums.ResultTypeEnum; import cn.icanci.rec.common.model.TextValue; import cn.icanci.rec.common.model.config.BaseDataVO; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.script.context.RecScriptEngineContext; @@ -115,7 +114,7 @@ public class BaseDataServiceImpl implements BaseDataService { public BaseDataDebugResult debug(BaseDataVO baseData, String scriptContentTest) { RecScriptEngineContext context; ResultTypeEnum resultType = baseData.getResultType(); - Bindings bindings = new SimpleBindings(FastJsonUtils.fromJSONString(scriptContentTest, Map.class)); + Bindings bindings = new SimpleBindings(JSONUtil.toBean(scriptContentTest, Map.class)); if (resultType != null) { Class clazz = ResultTypeMapEnum.getClassByResultType(resultType); context = recScriptEngine.eval(baseData.getScriptType(), bindings, baseData.getScriptContent(), clazz); diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java index a8f9335..481ccab 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java @@ -13,7 +13,6 @@ import cn.icanci.rec.common.enums.LogOperatorTypeEnum; import cn.icanci.rec.common.enums.ModuleTypeEnum; import cn.icanci.rec.common.model.TextValue; import cn.icanci.rec.common.model.config.DataSourceVO; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.script.context.RecScriptEngineContext; @@ -126,7 +125,7 @@ public class DataSourceServiceImpl implements DataSourceService { result.setSuccess(false); result.setExceptionMessage("脚本执行返回类型为:" + realRetVal.getClass().getName()); } else if (realRetVal instanceof String) { - FastJsonUtils.fromJSONString(String.valueOf(realRetVal), Map.class); + JSONUtil.toBean(String.valueOf(realRetVal), Map.class); result.setSuccess(true); result.setRealResult(context.getRealRetVal()); } else if (realRetVal instanceof Map) { diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java index eed88a2..aae54a1 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java @@ -16,7 +16,6 @@ import cn.icanci.rec.common.enums.LogOperatorTypeEnum; import cn.icanci.rec.common.enums.ModuleTypeEnum; import cn.icanci.rec.common.enums.ScriptTypeEnum; import cn.icanci.rec.common.model.config.StrategyVO; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.sdk.actuator.RecRuleEngineActuator; @@ -133,7 +132,7 @@ public class StrategyServiceImpl implements StrategyService { RuleEngineRequest request = new RuleEngineRequest(); request.setDomainCode(domainCode); request.setSceneCode(strategy.getSceneCode()); - request.setParameters(StringUtils.isNotBlank(scriptContentTest) ? FastJsonUtils.fromJSONString(scriptContentTest, Map.class) : Maps.newHashMap()); + request.setParameters(StringUtils.isNotBlank(scriptContentTest) ? JSONUtil.toBean(scriptContentTest, Map.class) : Maps.newHashMap()); // 8.执行 RuleEngineResponse execute = recRuleEngineActuator.executor(request); diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/thread/TriggerThread.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/thread/TriggerThread.java index 06e3105..59b7795 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/thread/TriggerThread.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/thread/TriggerThread.java @@ -1,5 +1,7 @@ package cn.icanci.rec.admin.biz.thread; +import cn.hutool.core.collection.ConcurrentHashSet; +import cn.hutool.http.Method; import cn.icanci.rec.admin.biz.service.LockService; import cn.icanci.rec.admin.biz.service.RegisterService; import cn.icanci.rec.common.model.config.RegisterVO; @@ -9,12 +11,12 @@ import cn.icanci.rec.common.model.socket.UriConstant; import cn.icanci.rec.common.utils.GenerateRegisterKeyUtils; import cn.icanci.rec.engine.script.client.Client; import cn.icanci.rec.engine.script.client.RemoteException; -import cn.icanci.rec.engine.script.client.http.HttpMethod; -import cn.icanci.rec.engine.script.client.http.OkHttpClientImpl; -import cn.icanci.rec.engine.script.client.serializer.SerializerEnum; +import cn.icanci.rec.engine.script.client.http.HttpClientImpl; +import io.netty.util.internal.ThrowableUtil; import java.util.Date; import java.util.List; +import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; @@ -38,40 +40,40 @@ import com.google.common.collect.Sets; @SuppressWarnings("all") public class TriggerThread { - private static final Logger logger = LoggerFactory.getLogger(TriggerThread.class); - - private static final String DEFAULT_APPLICATION_JSON_VALUE = "application/json"; + private static final Logger logger = LoggerFactory.getLogger(TriggerThread.class); // http://{address}:port+UriConstant.heartbeat; - private static String HEARTBEAT_REQUEST_FORMAT = "http://%s:%s" + UriConstant.heartbeat; + private static String HEARTBEAT_REQUEST_FORMAT = "http://%s:%s" + UriConstant.heartbeat; // http://{address}:port+UriConstant.refresh; - private static String REFRESH_REQUEST_FORMAT = "http://%s:%s" + UriConstant.refresh; + private static String REFRESH_REQUEST_FORMAT = "http://%s:%s" + UriConstant.refresh; private static RegisterService registerService; private static LockService lockService; - private static final int CORE_SIZE = Runtime.getRuntime().availableProcessors(); + private static final int CORE_SIZE = Runtime.getRuntime().availableProcessors(); - private static final int REGISTER_TIME_OUT = 90; + private static final int REGISTER_TIME_OUT = 90; - private static final Client CLIENT = OkHttpClientImpl.getInstance(); + private static final Client CLIENT = HttpClientImpl.getInstance(); - private static final ThreadPoolExecutor commonPool = new ThreadPoolExecutor(CORE_SIZE, // - CORE_SIZE << 1, // - 60L, // - TimeUnit.SECONDS, // - new LinkedBlockingQueue<>(2000), // - runnable -> new Thread(runnable, "TriggerThread Biz Pool-" + runnable.hashCode()), // + private static final ThreadPoolExecutor commonPool = new ThreadPoolExecutor(CORE_SIZE, // + CORE_SIZE << 1, // + 60L, // + TimeUnit.SECONDS, // + new LinkedBlockingQueue<>(2000), // + runnable -> new Thread(runnable, "TriggerThread Biz Pool-" + runnable.hashCode()), // (r, executor) -> { throw new RuntimeException("TriggerThread Biz Pool is EXHAUSTED!"); }); - private static final ScheduledThreadPoolExecutor jobPool = new ScheduledThreadPoolExecutor(CORE_SIZE); + private static final ScheduledThreadPoolExecutor jobPool = new ScheduledThreadPoolExecutor(CORE_SIZE); + + private static final ScheduledThreadPoolExecutor timeoutPool = new ScheduledThreadPoolExecutor(CORE_SIZE); - private static final ScheduledThreadPoolExecutor timeoutPool = new ScheduledThreadPoolExecutor(CORE_SIZE); + private static LinkedBlockingQueue triggerQueue = new LinkedBlockingQueue<>();; - private static LinkedBlockingQueue triggerQueue = new LinkedBlockingQueue<>();; + private static Set urlRefreshed = new ConcurrentHashSet<>(); public static void setRegisterService(RegisterService registerService) { TriggerThread.registerService = registerService; @@ -114,22 +116,25 @@ public class TriggerThread { commonPool.execute(new Runnable() { @Override public void run() { - String reqUrl = String.format(REFRESH_REQUEST_FORMAT, register.getClientAddress(), register.getClientPort()); + try { + String reqUrl = String.format(REFRESH_REQUEST_FORMAT, register.getClientAddress(), register.getClientPort()); - PublishDTO publishDTO = new PublishDTO(); + PublishDTO publishDTO = new PublishDTO(); - publishDTO.setDomainCodes(Sets.newHashSet(register.getDomain())); + publishDTO.setDomainCodes(Sets.newHashSet(register.getDomain())); - Client.RpcRequest rpcRequest = new Client.RpcRequest(publishDTO, DEFAULT_APPLICATION_JSON_VALUE, Maps.newHashMap(), reqUrl, HttpMethod.POST.name(), - false, 3, TimeUnit.SECONDS, 0, SerializerEnum.FASTJSON, SerializerEnum.FASTJSON); + Client.RpcRequest rpcRequest = new Client.RpcRequest(reqUrl, publishDTO, Maps.newHashMap(), Method.POST, 3, TimeUnit.SECONDS, 0); - SocketMessage call = CLIENT.call(rpcRequest, SocketMessage.class); - if (call.isSuccess()) { - register.setIsDelete(0); - register.setLastUpdateTime(new Date()); - registerService.save(register); - } else { - logger.warn("[TriggerThread][start][refresh] error message:{}", call.getContent()); + SocketMessage call = CLIENT.call(rpcRequest, SocketMessage.class); + if (call.isSuccess()) { + register.setIsDelete(0); + register.setLastUpdateTime(new Date()); + registerService.save(register); + } else { + logger.warn("[TriggerThread][start][refresh] error message:{}", call.getContent()); + } + } catch (Throwable ex) { + logger.error("[TriggerThread][Run][Throwable] error message:{}", ex.getMessage()); } } }); @@ -156,6 +161,9 @@ public class TriggerThread { for (RegisterVO register : registerList) { commonPool.execute(new HeartbeatRunner(register)); } + // 相同ip和port只需要心跳一次即可 + // 心跳结束更新 + urlRefreshed = new ConcurrentHashSet<>(); } } @@ -184,8 +192,12 @@ public class TriggerThread { int port = register.getClientPort(); String reqUrl = String.format(HEARTBEAT_REQUEST_FORMAT, address, port); - Client.RpcRequest rpcRequest = new Client.RpcRequest(Maps.newHashMap(), DEFAULT_APPLICATION_JSON_VALUE, Maps.newHashMap(), reqUrl, HttpMethod.POST.name(), false, 3, - TimeUnit.SECONDS, 0, SerializerEnum.FASTJSON, SerializerEnum.FASTJSON); + if (urlRefreshed.contains(reqUrl)) { + return; + } + urlRefreshed.add(reqUrl); + + Client.RpcRequest rpcRequest = new Client.RpcRequest(reqUrl, Maps.newHashMap(), Maps.newHashMap(), Method.POST, 3, TimeUnit.SECONDS, 0); SocketMessage call = CLIENT.call(rpcRequest, SocketMessage.class); if (call.isSuccess()) { @@ -197,10 +209,10 @@ public class TriggerThread { } } catch (RemoteException ex) { // no op - logger.error("[HeartbeatRunner][RemoteException] error message:{}", ex.getMessage()); + logger.error("[HeartbeatRunner][RemoteException] error message:{}", ThrowableUtil.stackTraceToString(ex)); } catch (Throwable ex) { // no op - logger.error("[HeartbeatRunner][Throwable] error message:{}", ex.getMessage()); + logger.error("[HeartbeatRunner][Throwable] error message:{}", ThrowableUtil.stackTraceToString(ex)); } finally { lockService.release(key, token); } diff --git a/rec-engine/rec-engine-script/pom.xml b/rec-engine/rec-engine-script/pom.xml index 3b0ea49..ea97e8d 100644 --- a/rec-engine/rec-engine-script/pom.xml +++ b/rec-engine/rec-engine-script/pom.xml @@ -40,10 +40,6 @@ commons-io commons-io - - com.squareup.okhttp3 - okhttp - org.apache.commons commons-collections4 @@ -52,5 +48,9 @@ com.google.guava guava + + cn.hutool + hutool-all + \ No newline at end of file diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/AbstractRetryClient.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/AbstractRetryClient.java index ea27eac..10a1a81 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/AbstractRetryClient.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/AbstractRetryClient.java @@ -1,6 +1,6 @@ package cn.icanci.rec.engine.script.client; -import java.io.IOException; +import java.util.concurrent.*; /** * 自动重试客户端 @@ -10,36 +10,27 @@ import java.io.IOException; */ public abstract class AbstractRetryClient implements Client { - /** - * 远程调用 - * - * @param request http 请求 - * @param clazz 应答类型 - * @return 应答数据 - * @throws RemoteException 远程调用异常 - */ + protected static final ThreadPoolExecutor HTTP_POOL = new ThreadPoolExecutor(40, // + 120, // + 60L, // + TimeUnit.SECONDS, // + new LinkedBlockingQueue<>(2000), // + runnable -> new Thread(runnable, "AbstractRetryClient Biz Pool-" + runnable.hashCode()), // + (r, executor) -> { + throw new RuntimeException("AbstractRetryClient Biz Pool is EXHAUSTED!"); + }); + @Override public V call(RpcRequest request, Class clazz) throws RemoteException { return retry(request, clazz, 0, request.getRetry()); } - /** - * 重试 - * - * @param request 请求 - * @param clazz 序列化类 - * @param retryCount 第几次重试 - * @param retry 重试次数 - * @param 类型 - * @return 结果 - * @throws RemoteException - */ private V retry(RpcRequest request, Class clazz, int retryCount, int retry) throws RemoteException { try { return doExecute(request, clazz); - } catch (RemoteException e) { - throw e; - } catch (IOException e) { + } catch (RemoteException | ExecutionException | InterruptedException e) { + throw new RemoteException(e); + } catch (TimeoutException e) { while (retryCount < retry) { retryCount++; return retry(request, clazz, retry, retryCount); @@ -48,13 +39,6 @@ public abstract class AbstractRetryClient implements Client { } } - /** - * Do execute v. - * - * @param the type parameter - * @param request the request - * @param clazz the clazz - * @return the v - */ - protected abstract V doExecute(RpcRequest request, Class clazz) throws IOException; + protected abstract V doExecute(RpcRequest request, Class clazz) throws ExecutionException, InterruptedException, TimeoutException; + } diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/Client.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/Client.java index e1df477..40bffdd 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/Client.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/Client.java @@ -1,8 +1,7 @@ package cn.icanci.rec.engine.script.client; -import cn.icanci.rec.engine.script.client.serializer.SerializerEnum; +import cn.hutool.http.Method; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -22,302 +21,100 @@ public interface Client { */ V call(RpcRequest request, Class clazz) throws RemoteException; - /** - * The type Http request. - */ class RpcRequest { - private Object body; - private String mediaType; - private Map headers = new HashMap<>(); - private String url; - private String method; - private long readTimeOut; - private TimeUnit timeUnit; - private int retry; - private SerializerEnum reqSerializer; - private SerializerEnum repSerializer; - - // 用于get请求 - private boolean isEncode; - - // Content-Type: application/x-www-form-urlencoded 专用 - private String key; - - /** - * Instantiates a new Http request. - */ - RpcRequest() { - } - - /** - * Instantiates a new Http request. - * - * @param body the body - * @param mediaType the type - * @param headers the headers - * @param url the url - * @param method the method - * @param isEncode the encode - * @param readTimeOut the read timeout - * @param timeUnit the time unit - * @param retry the retry - * @param reqSerializer the request serializer type - * @param repSerializer the response serializer type - */ - public RpcRequest(Object body, String mediaType, Map headers, String url, String method, boolean isEncode, long readTimeOut, TimeUnit timeUnit, int retry, - SerializerEnum reqSerializer, SerializerEnum repSerializer) { - this.body = body; - this.mediaType = mediaType; - this.headers = headers; - this.url = url; - this.method = method; - this.isEncode = isEncode; - this.timeUnit = timeUnit; - this.readTimeOut = readTimeOut; - this.retry = retry; - this.reqSerializer = reqSerializer; - this.repSerializer = repSerializer; - } - /** - * Gets the value of body. - * - * @return the value of body + * 请求路径 */ - public Object getBody() { - return body; - } - - /** - * Gets the value of mediaType. - * - * @return the value of mediaType - */ - public String getMediaType() { - return mediaType; - } - - /** - * Gets the value of headers. - * - * @return the value of headers - */ - public Map getHeaders() { - return headers; - } - + private String url; /** - * Gets the value of url. - * - * @return the value of url + * 请求对象 */ - public String getUrl() { - return url; - } - + private Object body; /** - * Gets the value of method. - * - * @return the value of method + * 请求头 */ - public String getMethod() { - return method; - } - + private Map headers; /** - * Gets the value of isEncode. - * - * @return the value of isEncode + * 执行的方法 */ - public boolean isEncode() { - return isEncode; - } - + private Method method; /** - * Gets the value of readTimeOut. - * - * @return the value of readTimeOut + * 请求超时时间 */ - public long getReadTimeOut() { - return readTimeOut; - } - + private long readTimeOut; /** - * Gets the value of timeUnit. - * - * @return the value of timeUnit + * 超时时间单位 */ - public TimeUnit getTimeUnit() { - return timeUnit; - } - + private TimeUnit timeUnit; /** - * Gets the value of retry. - * - * @return the value of retry + * 重试次数 */ - public int getRetry() { - return retry; - } + private int retry; - /** - * Gets the value of reqSerializer. - * - * @return the value of reqSerializer - */ - public SerializerEnum getReqSerializer() { - return reqSerializer; + public RpcRequest(String url, Object body, Map headers, Method method, long readTimeOut, TimeUnit timeUnit, int retry) { + this.url = url; + this.body = body; + this.headers = headers; + this.method = method; + this.readTimeOut = readTimeOut; + this.timeUnit = timeUnit; + this.retry = retry; } - /** - * Gets the value of repSerializer. - * - * @return the value of repSerializer - */ - public SerializerEnum getRepSerializer() { - return repSerializer; + public String getUrl() { + return url; } - /** - * Gets the value of key. - * - * @return the value of key - */ - public String getKey() { - return key; + public void setUrl(String url) { + this.url = url; } - /** - * Sets the key. - *

You can use getKey() to get the value of key

- * - * @param key key - */ - public void setKey(String key) { - this.key = key; + public Object getBody() { + return body; } - /** - * Sets the body. - *

You can use getBody() to get the value of body

- * - * @param body body - */ public void setBody(Object body) { this.body = body; } - /** - * Sets the mediaType. - *

You can use getMediaType() to get the value of mediaType

- * - * @param mediaType mediaType - */ - public void setMediaType(String mediaType) { - this.mediaType = mediaType; + public Map getHeaders() { + return headers; } - /** - * Sets the headers. - *

You can use getHeaders() to get the value of headers

- * - * @param headers headers - */ public void setHeaders(Map headers) { this.headers = headers; } - /** - * Sets the url. - *

You can use getUrl() to get the value of url

- * - * @param url url - */ - public void setUrl(String url) { - this.url = url; + public Method getMethod() { + return method; } - /** - * Sets the method. - *

You can use getMethod() to get the value of method

- * - * @param method method - */ - public void setMethod(String method) { + public void setMethod(Method method) { this.method = method; } - /** - * Sets the readTimeOut. - *

You can use getReadTimeOut() to get the value of readTimeOut

- * - * @param readTimeOut readTimeOut - */ - public void setReadTimeOut(long readTimeOut) { - this.readTimeOut = readTimeOut; - } - - /** - * Sets the timeUnit. - *

You can use getTimeUnit() to get the value of timeUnit

- * - * @param timeUnit timeUnit - */ - public void setTimeUnit(TimeUnit timeUnit) { - this.timeUnit = timeUnit; + public long getReadTimeOut() { + return readTimeOut; } - /** - * Sets the retry. - *

You can use getRetry() to get the value of retry

- * - * @param retry retry - */ - public void setRetry(int retry) { - this.retry = retry; + public void setReadTimeOut(long readTimeOut) { + this.readTimeOut = readTimeOut; } - /** - * Sets the reqSerializer. - *

You can use getReqSerializer() to get the value of reqSerializer

- * - * @param reqSerializer reqSerializer - */ - public void setReqSerializer(SerializerEnum reqSerializer) { - this.reqSerializer = reqSerializer; + public TimeUnit getTimeUnit() { + return timeUnit; } - /** - * Sets the repSerializer. - *

You can use getRepSerializer() to get the value of repSerializer

- * - * @param repSerializer repSerializer - */ - public void setRepSerializer(SerializerEnum repSerializer) { - this.repSerializer = repSerializer; + public void setTimeUnit(TimeUnit timeUnit) { + this.timeUnit = timeUnit; } - /** - * Sets the isEncode. - *

You can use getEncode() to get the value of isEncode

- * - * @param encode encode - */ - public void setEncode(boolean encode) { - isEncode = encode; + public int getRetry() { + return retry; } - /** - * Get the body content as byte array - * - * @return the byte array - */ - public byte[] getBodyAsBytes() { - byte[] dataBytes = new byte[0]; - if (null != this.getBody()) { - dataBytes = this.getReqSerializer().getSerializer().serialize(this.getBody()).getBytes(); - } - return dataBytes; + public void setRetry(int retry) { + this.retry = retry; } } } diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/ByteArrayMessageConverter.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/ByteArrayMessageConverter.java deleted file mode 100644 index 492ccab..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/ByteArrayMessageConverter.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.icanci.rec.engine.script.client.http; - -import okhttp3.Response; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.apache.commons.io.IOUtils; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:14 - */ -class ByteArrayMessageConverter implements MessageConverter { - /** - * Read internal t - * - * @param response the response - * @return the de-serialized data - */ - @Override - public byte[] readInternal(Response response) { - long contentLength = response.body().contentLength(); - ByteArrayOutputStream bos = new ByteArrayOutputStream(contentLength >= 0L ? (int) contentLength : 4096); - try { - IOUtils.copy(response.body().byteStream(), bos); - return bos.toByteArray(); - } catch (IOException ignore) { - // no op - } - return null; - } -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/HttpClientImpl.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/HttpClientImpl.java new file mode 100644 index 0000000..00ced7d --- /dev/null +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/HttpClientImpl.java @@ -0,0 +1,93 @@ +package cn.icanci.rec.engine.script.client.http; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import cn.icanci.rec.engine.script.client.AbstractRetryClient; +import cn.icanci.rec.engine.script.client.Client; + +import java.util.Map; +import java.util.concurrent.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Maps; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/14 22:14 + */ +@SuppressWarnings("all") +public class HttpClientImpl extends AbstractRetryClient { + + private static final Logger logger = LoggerFactory.getLogger(HttpClientImpl.class); + + private static final long DEFAULT_TIMEOUT = 3; + private static final TimeUnit DEFAULT_TIMEUNIT = TimeUnit.SECONDS; + + public static Client getInstance() { + return HttpClientImplHolder.CLIENT_IMPL; + } + + private static final class HttpClientImplHolder { + private static final HttpClientImpl CLIENT_IMPL = new HttpClientImpl(); + } + + /** + * Do execute v. + * + * @param request the request + * @param clazz the clazz + * @return the v + */ + @Override + protected V doExecute(RpcRequest request, Class clazz) throws ExecutionException, InterruptedException, TimeoutException { + FutureTask task = new FutureTask(new HttpCallRunner(request, clazz)); + HTTP_POOL.execute(task); + return task.get(request.getReadTimeOut(), request.getTimeUnit()); + } + + private static class HttpCallRunner implements Callable { + private final RpcRequest request; + private final Class clazz; + + public HttpCallRunner(RpcRequest request, Class clazz) { + this.request = request; + this.clazz = clazz; + } + + @Override + public V call() throws Exception { + switch (request.getMethod()) { + case GET: + return doGet(request, clazz); + case POST: + return doPost(request, clazz); + default: + throw new IllegalAccessException("Un Support Http Method:" + request.getMethod()); + } + } + + private V doGet(RpcRequest request, Class clazz) { + Map body = Maps.newHashMap(); + if (request.getBody() instanceof Map) { + body = (Map) request.getBody(); + } + String getBody = HttpUtil.createGet(request.getUrl()) // + .addHeaders(request.getHeaders())// + .form(body)// + .execute().body(); + logger.info("[{}][HttpCallRunner][doGet] request:{},resp:{}", Thread.currentThread().getName(), JSONUtil.toJsonStr(request), getBody); + return JSONUtil.toBean(getBody, clazz); + } + + private V doPost(RpcRequest request, Class clazz) { + String postBody = HttpUtil.createPost(request.getUrl()) // + .addHeaders(request.getHeaders())// + .body(JSONUtil.toJsonStr(request.getBody()))// + .execute().body(); + logger.info("[{}][HttpCallRunner][doPost] request:{},resp:{}", Thread.currentThread().getName(), JSONUtil.toJsonStr(request), postBody); + return JSONUtil.toBean(postBody, clazz); + } + } +} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/HttpMethod.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/HttpMethod.java deleted file mode 100644 index ecc5cc0..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/HttpMethod.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.icanci.rec.engine.script.client.http; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:28 - */ -public enum HttpMethod { - - GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; - - private static final Map mappings = new HashMap<>(16); - - static { - for (HttpMethod httpMethod : values()) { - mappings.put(httpMethod.name(), httpMethod); - } - } - - /** - * Resolve the given method value to an {@code HttpMethod}. - * @param method the method value as a String - * @return the corresponding {@code HttpMethod}, or {@code null} if not found - * @since 4.2.4 - */ - public static HttpMethod resolve(String method) { - return (method != null ? mappings.get(method) : null); - } - - /** - * Determine whether this {@code HttpMethod} matches the given - * method value. - * @param method the method value as a String - * @return {@code true} if it matches, {@code false} otherwise - * @since 4.2.4 - */ - public boolean matches(String method) { - return (this == resolve(method)); - } - -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/MessageConverter.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/MessageConverter.java deleted file mode 100644 index 52755a5..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/MessageConverter.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.icanci.rec.engine.script.client.http; - -import okhttp3.Response; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:14 - */ -public interface MessageConverter { - - /** - * Read internal t - * - * @param response the response - * @return the de-serialized data - */ - T readInternal(Response response); -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/OkHttpClientImpl.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/OkHttpClientImpl.java deleted file mode 100644 index 7f5df8b..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/OkHttpClientImpl.java +++ /dev/null @@ -1,240 +0,0 @@ -package cn.icanci.rec.engine.script.client.http; - -import cn.icanci.rec.engine.script.client.AbstractRetryClient; -import cn.icanci.rec.engine.script.client.Client; -import cn.icanci.rec.engine.script.client.http.interceptor.HttpCodeInterceptor; -import cn.icanci.rec.engine.script.client.http.interceptor.NetworkInterceptor; -import cn.icanci.rec.engine.script.client.serializer.Serializer; -import cn.icanci.rec.engine.script.client.serializer.SerializerEnum; -import okhttp3.*; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:14 - */ -@SuppressWarnings("all") -public class OkHttpClientImpl extends AbstractRetryClient { - private static final long DEFAULT_TIMEOUT = 3; - private static final TimeUnit DEFAULT_TIMEUNIT = TimeUnit.SECONDS; - private static final OkHttpClient CLIENT = new OkHttpClient(); - private static final Map CLIENTS = new ConcurrentHashMap<>(); - private static final Map CONVERTER_MAP = new HashMap<>(); - private static final Interceptor NETWORK_INTERCEPTOR = new NetworkInterceptor(); - private static final Interceptor HTTP_CODE_INTERCEPTOR = new HttpCodeInterceptor(); - - static { - CONVERTER_MAP.put(String.class, new StringMessageConverter()); - CONVERTER_MAP.put(byte[].class, new ByteArrayMessageConverter()); - } - - /** - * Get the instance of client - * - * @return the instance of client - */ - public static Client getInstance() { - return OkHttpClientImplHolder.CLIENT_IMPL; - } - - /** - * Do execute v. - * - * @param request the request - * @param clazz the clazz - * @return the v - */ - @Override - protected V doExecute(RpcRequest request, Class clazz) throws IOException { - Request.Builder builder = new Request.Builder(); - addHeaders(request, builder); - - try { - switch (request.getMethod()) { - case "GET": - String url = buildGetInfo(request); - builder.url(url).get(); - return doExecute(request, builder.build(), clazz); - - case "POST": - RequestBody content = buildPostInfo(request); - builder.url(request.getUrl()).post(content); - return doExecute(request, builder.build(), clazz); - - case "PUT": - case "DELETE": - default: - throw new UnsupportedOperationException("HTTP method: " + request.getMethod()); - - } - } catch (IOException e) { - throw e; - } - } - - /** - * 构建 POST 方法请求参数 - * - * @param request http 请求 - * @return http 请求数据 - */ - protected RequestBody buildPostInfo(RpcRequest request) { - MediaType mediaType = MediaType.parse(request.getMediaType()); - Object param = request.getBody(); - if (param == null) { - return RequestBody.create(mediaType, StringUtils.EMPTY); - } - if (String.class.isAssignableFrom(param.getClass())) { - return RequestBody.create(mediaType, String.class.cast(param)); - } - - if (request.getReqSerializer() == null) { - throw new IllegalArgumentException("The serializer is required for type " + param.getClass()); - } - Serializer serializer = request.getReqSerializer().getSerializer(); - String dataString = serializer.serialize(param); - return RequestBody.create(mediaType, dataString); - } - - /** - * 构建 GET 方法请求参数 - * - * @param request http 请求 - * @return GET 方法请求参数 - * @throws UnsupportedEncodingException 异常 - */ - protected String buildGetInfo(RpcRequest request) throws UnsupportedEncodingException { - String url = request.getUrl(); - if (request.getBody() == null || StringUtils.isBlank(request.getBody().toString())) { - return url; - } - Map params = (Map) request.getBody(); - boolean encoded = request.isEncode(); - - if (MapUtils.isNotEmpty(params)) { - StringBuilder sb = new StringBuilder(); - if (encoded) { - for (Map.Entry param : params.entrySet()) { - sb.append(param.getKey()).append("=").append(URLEncoder.encode(param.getValue(), StandardCharsets.UTF_8.name())); - sb.append("&"); - } - } else { - for (Map.Entry param : params.entrySet()) { - sb.append(param.getKey()).append("=").append(param.getValue()); - sb.append("&"); - } - } - String paramStr = StringUtils.stripEnd(sb.toString(), "&"); - url = url + "?" + paramStr; - } - return url; - } - - /** - * http calling - * - * @param rpcRequest rpc request - * @param request http request - * @param clazz response class - * @param the response type - * @return response object - * @throws IOException io 异常 - */ - private V doExecute(RpcRequest rpcRequest, Request request, Class clazz) throws IOException { - OkHttpClient client = getClient(rpcRequest.getReadTimeOut(), rpcRequest.getTimeUnit()); - Response response = client.newCall(request).execute(); - if (clazz != String.class && clazz != byte[].class) { - String metaData = (String) CONVERTER_MAP.get(String.class).readInternal(response); - SerializerEnum serializerEnum = rpcRequest.getRepSerializer(); - return serializerEnum == null ? (V) metaData : serializerEnum.getSerializer().deserialize(metaData, clazz); - } - return (V) CONVERTER_MAP.get(clazz).readInternal(response); - } - - /** - * 构建 HTTP 头信息 - * - * @param request http request - * @param builder request builder - */ - private void addHeaders(RpcRequest request, Request.Builder builder) { - Map headers = request.getHeaders(); - if (MapUtils.isEmpty(headers)) { - return; - } - for (Map.Entry item : request.getHeaders().entrySet()) { - builder.addHeader(item.getKey(), item.getValue()); - } - } - - /** - * 获取客户端连接 - * - * @return okhttp client - */ - private OkHttpClient getClient(long timeout, TimeUnit timeUnit) { - if (timeout == 0) { - timeout = DEFAULT_TIMEOUT; - timeUnit = DEFAULT_TIMEUNIT; - } - - String key = buildClientKey(timeout, timeUnit); - - OkHttpClient client = CLIENTS.get(key); - if (client == null) { - client = newClient(timeout, timeUnit); - } - return client; - } - - /** - * 创建新客户端 - * - * @param timeout the timeout - * @param timeUnit the unit of timeout - * @return the okhttp client instance - */ - private OkHttpClient newClient(long timeout, TimeUnit timeUnit) { - OkHttpClient.Builder builder = CLIENT.newBuilder(); - builder.connectTimeout(timeout, timeUnit); - builder.readTimeout(timeout, timeUnit); - builder.writeTimeout(timeout, timeUnit); - builder.connectionPool(new ConnectionPool(64, 180, TimeUnit.SECONDS)); - builder.addInterceptor(HTTP_CODE_INTERCEPTOR); - builder.addNetworkInterceptor(NETWORK_INTERCEPTOR); - OkHttpClient client = builder.build(); - String key = buildClientKey(timeout, timeUnit); - CLIENTS.putIfAbsent(key, client); - return client; - } - - /** - * Build client key - * timeout + timeout unit - * - * @param timeout 超时时间 - * @param timeUnit 超时时间单位 - * @return key - */ - private static String buildClientKey(long timeout, TimeUnit timeUnit) { - return timeout + timeUnit.toString(); - } - - /** - * Ok http client holder - */ - private static final class OkHttpClientImplHolder { - private static final OkHttpClientImpl CLIENT_IMPL = new OkHttpClientImpl(); - } -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/StringMessageConverter.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/StringMessageConverter.java deleted file mode 100644 index 756ff79..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/StringMessageConverter.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.icanci.rec.engine.script.client.http; - -import okhttp3.Response; -import okhttp3.ResponseBody; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:14 - */ -class StringMessageConverter implements MessageConverter { - /** - * Read internal t - * - * @param response the response - * @return the de-serialized data - */ - @Override - public String readInternal(Response response) { - try (ResponseBody body = response.body()) { - return body.string(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/interceptor/HttpCodeInterceptor.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/interceptor/HttpCodeInterceptor.java deleted file mode 100644 index e4841ee..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/interceptor/HttpCodeInterceptor.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.icanci.rec.engine.script.client.http.interceptor; - -import cn.icanci.rec.engine.script.client.RemoteException; -import okhttp3.Interceptor; -import okhttp3.Request; -import okhttp3.Response; - -import java.io.IOException; - -import org.apache.commons.lang3.StringUtils; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:28 - */ -public class HttpCodeInterceptor implements Interceptor { - private static final String FORMAT = "[%s] %s: %s"; - - @Override - public Response intercept(Chain chain) throws IOException { - Request request = chain.request(); - Response response = chain.proceed(request); - int code = response.code(); - boolean success = isSuccess(code); - if (success) { - return response; - } - - String errMsg = response.message(); - String body = response.body().string(); - String error = String.format(FORMAT, code, errMsg, body); - throw new RemoteException(code, error); - } - - /** - * 判断 http 调用是否成功 - * - * @param code http 编码 - * @return http 调用是否成功 - */ - private boolean isSuccess(int code) { - String httpCode = String.valueOf(code); - return StringUtils.startsWith(httpCode, "2") || StringUtils.startsWith(httpCode, "3"); - } -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/interceptor/NetworkInterceptor.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/interceptor/NetworkInterceptor.java deleted file mode 100644 index 82d5f5e..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/interceptor/NetworkInterceptor.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.icanci.rec.engine.script.client.http.interceptor; - -import okhttp3.Interceptor; -import okhttp3.Request; -import okhttp3.Response; - -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:28 - */ -public class NetworkInterceptor implements Interceptor { - /** Client network log */ - private static final Logger LOG = LoggerFactory.getLogger("MERCHANT-CLIENT-LOGGER"); - - @Override - public Response intercept(Chain chain) throws IOException { - long start = System.currentTimeMillis(); - Request request = chain.request(); - - // process request - String url = null; - String method = null; - - try { - url = request.url().toString(); - method = request.method(); - } catch (Exception e) { - LOG.error(e.getMessage(), e); - } finally { - LOG.info("[REQUEST] URL={}, METHOD={}", url, method); - } - - // delegate the request to okhttp - Response response = chain.proceed(request); - - // process response - String code = null; - try { - code = String.valueOf(response.code()); - } catch (Exception e) { - LOG.error(e.getMessage(), e); - } finally { - long end = System.currentTimeMillis(); - String duration = String.valueOf(end - start); - LOG.info("[RESPONSE] URL={}, RT={}, CODE={}", url, duration, code); - } - return response; - } -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/FastJsonSerializer.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/FastJsonSerializer.java deleted file mode 100644 index 7471d03..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/FastJsonSerializer.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.icanci.rec.engine.script.client.serializer; - -import cn.icanci.rec.common.utils.FastJsonUtils; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:14 - */ -public class FastJsonSerializer implements Serializer { - /** - * 反序列化 - * - * @param json JSON 结构数据 - * @param clazz 待反序列化类结构 - * @return 反序列化实例 - */ - @Override - public T deserialize(String json, Class clazz) { - return FastJsonUtils.fromJSONString(json, clazz); - } - - /** - * 序列化 - * - * @param t 待序列化数据 - * @return JSON 结构数据 - */ - @Override - public String serialize(T t) { - return FastJsonUtils.toJSONString(t); - } -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/NativeFastJsonSerializer.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/NativeFastJsonSerializer.java deleted file mode 100644 index 9009d4a..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/NativeFastJsonSerializer.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.icanci.rec.engine.script.client.serializer; - -import com.alibaba.fastjson.JSON; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:14 - */ -public class NativeFastJsonSerializer implements Serializer { - /** - * 反序列化 - * - * @param json JSON 结构数据 - * @param clazz 待反序列化类结构 - * @return 反序列化实例 - */ - @Override - public T deserialize(String json, Class clazz) { - return JSON.parseObject(json, clazz); - } - - /** - * 序列化 - * - * @param t 待序列化数据 - * @return JSON 结构数据 - */ - @Override - public String serialize(T t) { - return JSON.toJSONString(t); - } -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/Serializer.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/Serializer.java deleted file mode 100644 index ce579b5..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/Serializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.icanci.rec.engine.script.client.serializer; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:14 - */ -public interface Serializer { - - /** - * 反序列化 - * - * @param json JSON 结构数据 - * @param clazz 待反序列化类结构 - * @param 待反序列化类型 - * @return 反序列化实例 - */ - T deserialize(String json, Class clazz); - - /** - * 序列化 - * - * @param t 待序列化数据 - * @param 待序列化数据类型 - * @return JSON 结构数据 - */ - String serialize(T t); -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/SerializerEnum.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/SerializerEnum.java deleted file mode 100644 index a90ebc7..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/SerializerEnum.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.icanci.rec.engine.script.client.serializer; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:14 - */ -public enum SerializerEnum { - /** - * FASTJSON - */ - FASTJSON("FASTJSON", new FastJsonSerializer()), - /** - * NATIVE-FASTJSON - */ - NATIVE_FASTJSON("NATIVE-FASTJSON", new NativeFastJsonSerializer()), - /** - * STRING - */ - STRING("STRING", new StringSerializer()), - - ; - - /** - * 序列化方式 - */ - private String code; - - /** - * 序列化器 - */ - private Serializer serializer; - - /** - * 私有构造方法 - * - * @param code 序列化方式 - * @param serializer 序列化器 - */ - SerializerEnum(String code, Serializer serializer) { - this.code = code; - this.serializer = serializer; - } - - /** - * 根据序列化方式获取序列化器 - * - * @param code 序列化方式 - * @return 序列化器 - */ - public static Serializer getByCode(String code) { - for (SerializerEnum e : SerializerEnum.values()) { - if (e.getCode().equals(code)) { - return e.getSerializer(); - } - } - throw new IllegalArgumentException("The serializer code [" + code + "] is not supported."); - } - - /** - * 根据序列化方式获取序列化器 - * - * @param code 序列化方式 - * @return 序列化器 - */ - public static SerializerEnum toEnum(String code) { - for (SerializerEnum e : SerializerEnum.values()) { - if (e.getCode().equals(code)) { - return e; - } - } - throw new IllegalArgumentException("The serializer code [" + code + "] is not supported."); - } - - /** - * 获取序列化方式 - * - * @return 序列化方式 - */ - public String getCode() { - return code; - } - - /** - * 获取序列化器 - * - * @return 序列化器 - */ - public Serializer getSerializer() { - return serializer; - } -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/StringSerializer.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/StringSerializer.java deleted file mode 100644 index 0bd7616..0000000 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/serializer/StringSerializer.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.icanci.rec.engine.script.client.serializer; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/14 22:14 - */ -public class StringSerializer implements Serializer { - /** - * 反序列化 - * - * @param json JSON 结构数据 - * @param clazz 待反序列化类结构 - * @return 反序列化实例 - */ - @Override - public T deserialize(String json, Class clazz) { - return (T) json; - } - - /** - * 序列化 - * - * @param t 待序列化数据 - * @return JSON 结构数据 - */ - @Override - public String serialize(T t) { - return (String) t; - } -} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/impl/RecScriptEngineImpl.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/impl/RecScriptEngineImpl.java index f8ed1b8..fa13651 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/impl/RecScriptEngineImpl.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/impl/RecScriptEngineImpl.java @@ -1,34 +1,33 @@ package cn.icanci.rec.engine.script.impl; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import javax.script.*; - -import com.google.common.collect.Maps; - +import cn.hutool.http.Method; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.enums.HttpRequestTypeEnum; import cn.icanci.rec.common.enums.ScriptTypeEnum; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.script.client.Client; -import cn.icanci.rec.engine.script.client.http.HttpMethod; -import cn.icanci.rec.engine.script.client.http.OkHttpClientImpl; -import cn.icanci.rec.engine.script.client.serializer.SerializerEnum; +import cn.icanci.rec.engine.script.client.http.HttpClientImpl; import cn.icanci.rec.engine.script.context.RecScriptEngineContext; import cn.icanci.rec.engine.script.factory.ScriptEngineFactory; import cn.icanci.rec.engine.script.wrapper.HttpResponseWrapper; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.script.*; + +import org.apache.commons.lang3.StringUtils; + +import com.google.common.collect.Maps; + /** * @author icanci * @since 1.0 Created in 2022/11/12 22:46 */ public class RecScriptEngineImpl implements RecScriptEngine { /** http实例 */ - private static final Client CLIENT = OkHttpClientImpl.getInstance(); - /** DEFAULT_APPLICATION_JSON_VALUE */ - public static final String DEFAULT_APPLICATION_JSON_VALUE = "application/json"; + private static final Client CLIENT = HttpClientImpl.getInstance(); @Override public ScriptEngine findEngine(ScriptTypeEnum scriptType) { @@ -150,20 +149,20 @@ public class RecScriptEngineImpl implements RecScriptEngine { @Override public HttpResponseWrapper httpEval(HttpRequestTypeEnum requestType, String reqUrl, String reqParam, int timeout) { - HttpMethod httpMethod = null; + Method method = null; switch (requestType) { case GET: - httpMethod = HttpMethod.GET; + method = Method.GET; break; case POST: - httpMethod = HttpMethod.POST; + method = Method.POST; break; default: // no op } - if (httpMethod == null) { + if (method == null) { throw new NullPointerException("HttpMethod is Null !"); } @@ -172,9 +171,11 @@ public class RecScriptEngineImpl implements RecScriptEngine { } HashMap headers = Maps.newHashMap(); - Map reqMap = FastJsonUtils.fromJSONString(reqParam, Map.class); - Client.RpcRequest rpcRequest = new Client.RpcRequest(reqMap, DEFAULT_APPLICATION_JSON_VALUE, headers, reqUrl, httpMethod.name(), false, timeout, TimeUnit.SECONDS, 0, - SerializerEnum.FASTJSON, SerializerEnum.FASTJSON); + Map reqMap = Maps.newHashMap(); + if (StringUtils.isNotBlank(reqParam)) { + reqMap = JSONUtil.toBean(reqParam, Map.class); + } + Client.RpcRequest rpcRequest = new Client.RpcRequest(reqUrl, reqMap, headers, method, timeout, TimeUnit.SECONDS, 0); HttpResponseWrapper wrapper = new HttpResponseWrapper(); try { diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/wrapper/HttpResponseWrapper.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/wrapper/HttpResponseWrapper.java index 5297c4c..27a197d 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/wrapper/HttpResponseWrapper.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/wrapper/HttpResponseWrapper.java @@ -1,6 +1,6 @@ package cn.icanci.rec.engine.script.wrapper; -import cn.icanci.rec.common.utils.FastJsonUtils; +import cn.hutool.json.JSONUtil; import java.util.Map; import java.util.StringJoiner; @@ -29,7 +29,7 @@ public class HttpResponseWrapper { * @return 判断返回是否是JSON */ public boolean isJson() { - return FastJsonUtils.isJson(response); + return JSONUtil.isJson(response); } /** @@ -41,7 +41,7 @@ public class HttpResponseWrapper { if (response == null) { return Maps.newHashMap(); } - return FastJsonUtils.fromJSONString(response, Map.class); + return JSONUtil.toBean(response, Map.class); } /** diff --git a/rec-engine/rec-engine-script/src/test/java/cn/icanci/rec/engine/script/test/RecScriptEngineManagerTest.java b/rec-engine/rec-engine-script/src/test/java/cn/icanci/rec/engine/script/test/RecScriptEngineManagerTest.java index be65726..58aadba 100644 --- a/rec-engine/rec-engine-script/src/test/java/cn/icanci/rec/engine/script/test/RecScriptEngineManagerTest.java +++ b/rec-engine/rec-engine-script/src/test/java/cn/icanci/rec/engine/script/test/RecScriptEngineManagerTest.java @@ -3,7 +3,6 @@ package cn.icanci.rec.engine.script.test; import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.enums.HttpRequestTypeEnum; import cn.icanci.rec.common.enums.ScriptTypeEnum; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.script.context.RecScriptEngineContext; @@ -50,8 +49,8 @@ public class RecScriptEngineManagerTest { @Test public void fastjsonIsJson() { // System.out.println(FastJsonUtils.isJson("「9999")); - System.out.println(FastJsonUtils.isJson("TRUE")); - System.out.println(FastJsonUtils.isJson("false ")); + System.out.println(JSONUtil.isJson("TRUE")); + System.out.println(JSONUtil.isJson("false ")); // System.out.println(FastJsonUtils.isJson("11.1")); System.out.println(Boolean.parseBoolean("true")); System.out.println(Boolean.parseBoolean("false")); diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java index 0cf35b8..df01031 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java @@ -1,13 +1,12 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.hutool.http.Method; import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.aggregation.WebApiRequest; import cn.icanci.rec.common.aggregation.WebApiResponse; import cn.icanci.rec.common.utils.PropertiesUtil; import cn.icanci.rec.engine.script.client.Client; -import cn.icanci.rec.engine.script.client.http.HttpMethod; -import cn.icanci.rec.engine.script.client.http.OkHttpClientImpl; -import cn.icanci.rec.engine.script.client.serializer.SerializerEnum; +import cn.icanci.rec.engine.script.client.http.HttpClientImpl; import java.util.List; import java.util.Map; @@ -23,41 +22,38 @@ import com.google.common.collect.Maps; */ public abstract class AbstractLoadSPI { - private static final String PROPERTIES_NAME = "rec-http-spi-load.properties"; + private static final String PROPERTIES_NAME = "rec-http-spi-load.properties"; - private static final String REQ_HTTP_PATH_PROP = "rec-http-request-url"; + private static final String REQ_HTTP_PATH_PROP = "rec-http-request-url"; /** 服务请求请求路径 */ protected static final String REQ_HTTP_PATH; /** 域请求路径 */ protected static String LOAD_DOMAIN_PATH; /** 域Codes请求路径 */ protected static String LOAD_DOMAIN_CODES_PATH; - private static String LOAD_DOMAIN_PATH_SUFFIX = "/rec/webapi/loadDomains"; - private static String LOAD_DOMAIN_CODE_PATH_SUFFIX = "/rec/webapi/loadDomainCodes"; + private static String LOAD_DOMAIN_PATH_SUFFIX = "/rec/webapi/loadDomains"; + private static String LOAD_DOMAIN_CODE_PATH_SUFFIX = "/rec/webapi/loadDomainCodes"; /** 场景请求路径 */ protected static String LOAD_SCENE_PATH; - private static String LOAD_SCENE_PATH_SUFFIX = "/rec/webapi/loadScenes"; + private static String LOAD_SCENE_PATH_SUFFIX = "/rec/webapi/loadScenes"; /** 元数据请求路径 */ protected static String LOAD_METADATA_PATH; - private static String LOAD_METADATA_PATH_SUFFIX = "/rec/webapi/loadMetadatas"; + private static String LOAD_METADATA_PATH_SUFFIX = "/rec/webapi/loadMetadatas"; /** 基础数据请求路径 */ protected static String LOAD_BASE_DATA_PATH; - private static String LOAD_BASE_DATA_PATH_SUFFIX = "/rec/webapi/loadBaseDatas"; + private static String LOAD_BASE_DATA_PATH_SUFFIX = "/rec/webapi/loadBaseDatas"; /** 数据源请求路径 */ protected static String LOAD_DATA_SOURCE_PATH; - private static String LOAD_DATA_SOURCE_PATH_SUFFIX = "/rec/webapi/loadDataSources"; + private static String LOAD_DATA_SOURCE_PATH_SUFFIX = "/rec/webapi/loadDataSources"; /** 策略请求路径 */ protected static String LOAD_STRATEGY_PATH; - private static String LOAD_STRATEGY_PATH_SUFFIX = "/rec/webapi/loadStrategies"; + private static String LOAD_STRATEGY_PATH_SUFFIX = "/rec/webapi/loadStrategies"; /** http实例 */ - protected static final Client CLIENT = OkHttpClientImpl.getInstance(); - - /** DEFAULT_APPLICATION_JSON_VALUE */ - public static final String DEFAULT_APPLICATION_JSON_VALUE = "application/json"; + protected static final Client CLIENT = HttpClientImpl.getInstance(); /** DEFAULT_TIMEOUT */ - private static final int DEFAULT_TIMEOUT = 3; + private static final int DEFAULT_TIMEOUT = 3; static { // 加载数据 @@ -84,10 +80,9 @@ public abstract class AbstractLoadSPI { * @return 返回执行结果 */ @SuppressWarnings("all") - public WebApiResponse call(Class clazz, String reqPath, HttpMethod httpMethod, WebApiRequest request) { + public WebApiResponse call(Class clazz, String reqPath, Method httpMethod, WebApiRequest request) { - Client.RpcRequest rpcRequest = new Client.RpcRequest(request, DEFAULT_APPLICATION_JSON_VALUE, Maps.newHashMap(), reqPath, httpMethod.name(), false, DEFAULT_TIMEOUT, - TimeUnit.SECONDS, 3, SerializerEnum.FASTJSON, SerializerEnum.FASTJSON); + Client.RpcRequest rpcRequest = new Client.RpcRequest(reqPath, request, Maps.newHashMap(), httpMethod, DEFAULT_TIMEOUT, TimeUnit.SECONDS, 3); List ret = CLIENT.call(rpcRequest, WebApiResponse.class).getRet(); return new WebApiResponse<>(JSONUtil.toList(JSONUtil.parseArray(ret), clazz)); diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpBaseDataSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpBaseDataSPI.java index 72c0f10..4f6b5ba 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpBaseDataSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpBaseDataSPI.java @@ -1,8 +1,8 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.hutool.http.Method; import cn.icanci.rec.common.aggregation.WebApiRequest; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; -import cn.icanci.rec.engine.script.client.http.HttpMethod; import cn.icanci.rec.engine.sdk.spi.BaseDataSPI; import java.util.List; @@ -19,7 +19,7 @@ public class HttpBaseDataSPI extends AbstractLoadSPI implements BaseDataSPI { @Override public List load(Set domains) { WebApiRequest request = new WebApiRequest(domains); - return call(BaseDataDTO.class, LOAD_BASE_DATA_PATH, HttpMethod.POST, request).getRet(); + return call(BaseDataDTO.class, LOAD_BASE_DATA_PATH, Method.POST, request).getRet(); } @Override diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java index f61bf95..7d51183 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java @@ -1,8 +1,8 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.hutool.http.Method; import cn.icanci.rec.common.aggregation.WebApiRequest; import cn.icanci.rec.common.aggregation.model.DataSourceDTO; -import cn.icanci.rec.engine.script.client.http.HttpMethod; import cn.icanci.rec.engine.sdk.spi.DataSourceSPI; import java.util.List; @@ -18,7 +18,7 @@ public class HttpDataSourceSPI extends AbstractLoadSPI implements DataSourceSPI @Override public List load(Set domains) { WebApiRequest request = new WebApiRequest(domains); - return call(DataSourceDTO.class, LOAD_DATA_SOURCE_PATH, HttpMethod.POST, request).getRet(); + return call(DataSourceDTO.class, LOAD_DATA_SOURCE_PATH, Method.POST, request).getRet(); } @Override diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java index bba4691..ab0816d 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java @@ -1,8 +1,8 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.hutool.http.Method; import cn.icanci.rec.common.aggregation.WebApiRequest; import cn.icanci.rec.common.aggregation.model.DomainDTO; -import cn.icanci.rec.engine.script.client.http.HttpMethod; import cn.icanci.rec.engine.sdk.spi.DomainSPI; import java.util.List; @@ -23,13 +23,13 @@ public class HttpDomainSPI extends AbstractLoadSPI implements DomainSPI { @Override public Set loadAllDomainCodes() { - return Sets.newHashSet(call(String.class, LOAD_DOMAIN_CODES_PATH, HttpMethod.POST, null).getRet()); + return Sets.newHashSet(call(String.class, LOAD_DOMAIN_CODES_PATH, Method.POST, null).getRet()); } @Override public List load(Set domains) { WebApiRequest request = new WebApiRequest(domains); - return call(DomainDTO.class, LOAD_DOMAIN_PATH, HttpMethod.POST, request).getRet(); + return call(DomainDTO.class, LOAD_DOMAIN_PATH, Method.POST, request).getRet(); } diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpMetadataSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpMetadataSPI.java index a26ac4e..061c3c5 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpMetadataSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpMetadataSPI.java @@ -1,8 +1,8 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.hutool.http.Method; import cn.icanci.rec.common.aggregation.WebApiRequest; import cn.icanci.rec.common.aggregation.model.MetadataDTO; -import cn.icanci.rec.engine.script.client.http.HttpMethod; import cn.icanci.rec.engine.sdk.spi.MetadataSPI; import java.util.List; @@ -18,7 +18,7 @@ public class HttpMetadataSPI extends AbstractLoadSPI implements MetadataSPI { @Override public List load(Set domains) { WebApiRequest request = new WebApiRequest(domains); - return call(MetadataDTO.class, LOAD_METADATA_PATH, HttpMethod.POST, request).getRet(); + return call(MetadataDTO.class, LOAD_METADATA_PATH, Method.POST, request).getRet(); } @Override diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpSceneSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpSceneSPI.java index 87ea5bc..9ca1ffa 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpSceneSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpSceneSPI.java @@ -1,8 +1,8 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.hutool.http.Method; import cn.icanci.rec.common.aggregation.WebApiRequest; import cn.icanci.rec.common.aggregation.model.SceneDTO; -import cn.icanci.rec.engine.script.client.http.HttpMethod; import cn.icanci.rec.engine.sdk.spi.SceneSPI; import java.util.List; @@ -18,7 +18,7 @@ public class HttpSceneSPI extends AbstractLoadSPI implements SceneSPI { @Override public List load(Set domains) { WebApiRequest request = new WebApiRequest(domains); - return call(SceneDTO.class, LOAD_SCENE_PATH, HttpMethod.POST, request).getRet(); + return call(SceneDTO.class, LOAD_SCENE_PATH, Method.POST, request).getRet(); } @Override diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java index 190e657..027f0a0 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java @@ -1,15 +1,15 @@ package cn.icanci.rec.engine.sdk.http.spi; -import cn.icanci.rec.common.aggregation.WebApiRequest; -import cn.icanci.rec.common.aggregation.model.StrategyDTO; -import cn.icanci.rec.engine.script.client.http.HttpMethod; -import cn.icanci.rec.engine.sdk.spi.StrategySPI; - import java.util.List; import java.util.Set; import com.google.common.collect.Sets; +import cn.hutool.http.Method; +import cn.icanci.rec.common.aggregation.WebApiRequest; +import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.engine.sdk.spi.StrategySPI; + /** * @author icanci * @since 1.0 Created in 2022/11/15 21:29 @@ -18,7 +18,7 @@ public class HttpStrategySPI extends AbstractLoadSPI implements StrategySPI { @Override public List load(Set domains) { WebApiRequest request = new WebApiRequest(domains); - return call(StrategyDTO.class, LOAD_STRATEGY_PATH, HttpMethod.POST, request).getRet(); + return call(StrategyDTO.class, LOAD_STRATEGY_PATH, Method.POST, request).getRet(); } @Override diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RecNettyClientHandler.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RecNettyClientHandler.java index 0a65391..9243864 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RecNettyClientHandler.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RecNettyClientHandler.java @@ -4,7 +4,6 @@ import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.model.socket.PublishDTO; import cn.icanci.rec.common.model.socket.SocketMessage; import cn.icanci.rec.common.model.socket.UriConstant; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; @@ -71,15 +70,17 @@ public class RecNettyClientHandler extends SimpleChannelInboundHandler domainCodes = publish.getDomainCodes(); if (CollectionUtils.isEmpty(domainCodes)) { return SocketMessage.fail("The domain code list to refresh is empty"); } engineRepositoryHolder.refresh(domainCodes); + logger.info("[{}][RecNettyClientHandler][process] domainCodes:{} was refreshed!", Thread.currentThread().getName(), domainCodes); return SocketMessage.success(); default: return SocketMessage.fail("Invalid request, uri-mapping(" + uri + ") not found"); diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java index ad694b7..9ce9090 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java @@ -1,5 +1,6 @@ package cn.icanci.rec.engine.sdk.server; +import cn.hutool.http.Method; import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.model.socket.RegisterDTO; import cn.icanci.rec.common.model.socket.UriConstant; @@ -7,9 +8,7 @@ import cn.icanci.rec.common.result.R; import cn.icanci.rec.common.utils.IPUtils; import cn.icanci.rec.engine.script.client.Client; import cn.icanci.rec.engine.script.client.RemoteException; -import cn.icanci.rec.engine.script.client.http.HttpMethod; -import cn.icanci.rec.engine.script.client.http.OkHttpClientImpl; -import cn.icanci.rec.engine.script.client.serializer.SerializerEnum; +import cn.icanci.rec.engine.script.client.http.HttpClientImpl; import cn.icanci.rec.engine.sdk.properties.RecProperties; import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import cn.icanci.rec.engine.sdk.spi.DomainSPI; @@ -34,9 +33,9 @@ import com.google.common.collect.Sets; */ @Service public class RegisterClient implements InitializingBean { - private static final Logger logger = LoggerFactory.getLogger(RegisterClient.class); + private static final Logger logger = LoggerFactory.getLogger(RegisterClient.class); /** http实例 */ - private static final Client CLIENT = OkHttpClientImpl.getInstance(); + private static final Client CLIENT = HttpClientImpl.getInstance(); @Resource private RecProperties recProperties; @Resource @@ -44,23 +43,20 @@ public class RegisterClient implements InitializingBean { @Resource private EngineRepositoryHolder engineRepositoryHolder; - private static final int CORE_SIZE = Runtime.getRuntime().availableProcessors(); + private static final int CORE_SIZE = Runtime.getRuntime().availableProcessors(); - private static final ThreadPoolExecutor registerPool = new ThreadPoolExecutor(CORE_SIZE, // - CORE_SIZE << 1, // - 60L, // - TimeUnit.SECONDS, // - new LinkedBlockingQueue<>(2000), // - runnable -> new Thread(runnable, "RegisterClient Biz Pool-" + runnable.hashCode()), // + private static final ThreadPoolExecutor registerPool = new ThreadPoolExecutor(CORE_SIZE, // + CORE_SIZE << 1, // + 60L, // + TimeUnit.SECONDS, // + new LinkedBlockingQueue<>(2000), // + runnable -> new Thread(runnable, "RegisterClient Biz Pool-" + runnable.hashCode()), // (r, executor) -> { throw new RuntimeException("RegisterClient Biz Pool is EXHAUSTED!"); }); - /** DEFAULT_APPLICATION_JSON_VALUE */ - public static final String DEFAULT_APPLICATION_JSON_VALUE = "application/json"; - /** 注册请求地址 */ - private static final String REQ_URL_FORMAT = "http://%s:%s%s"; + private static final String REQ_URL_FORMAT = "http://%s:%s%s"; /** * 将SDK所在服务注册到注册中心 @@ -145,8 +141,7 @@ public class RegisterClient implements InitializingBean { RegisterDTO registerDTO = new RegisterDTO(IPUtils.getHostIpAddress(), clientPort, appName, domain); String reqUrl = String.format(REQ_URL_FORMAT, address, serverPort, UriConstant.register); - Client.RpcRequest rpcRequest = new Client.RpcRequest(registerDTO, DEFAULT_APPLICATION_JSON_VALUE, Maps.newHashMap(), reqUrl, HttpMethod.POST.name(), false, 3, - TimeUnit.SECONDS, 3, SerializerEnum.FASTJSON, SerializerEnum.FASTJSON); + Client.RpcRequest rpcRequest = new Client.RpcRequest(reqUrl, registerDTO, Maps.newHashMap(), Method.POST, 3, TimeUnit.SECONDS, 3); R call = CLIENT.call(rpcRequest, R.class); -- Gitee