From fa05b3dc6d86adec07d8d039275e89104e74fcb7 Mon Sep 17 00:00:00 2001 From: "feihu.wang" Date: Tue, 19 Nov 2019 14:25:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A7=84=E5=88=99?= =?UTF-8?q?=E9=A2=91=E7=B9=81=E4=BF=AE=E6=94=B9=E5=8F=AF=E8=83=BD=E4=BC=9A?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=86=85=E5=AD=98=E6=B3=84=E6=BC=8F=E7=9A=84?= =?UTF-8?q?=E9=A3=8E=E9=99=A9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: feihu.wang --- README.md | 6 +++--- .../pgmmers/radar/controller/RuleApiController.java | 2 -- .../java/com/pgmmers/radar/util/GroovyScriptUtil.java | 8 +++++++- .../service/impl/model/AbstractionServiceImpl.java | 10 +++++++++- .../radar/service/impl/model/RuleServiceImpl.java | 8 ++++++++ 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0ce61e9..41dd942 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,8 @@ The project code called Radar, like the code, monitor the transaction at the bac * 配置简单,开箱即用! ## 相关站点 - Github: https://github.com/wfh45678/radar Gitee: https://gitee.com/freshday/radar // 码云为镜像网站,贡献代码请提交到 github + Github: https://github.com/wfh45678/radar 官网: http://radar.pgmmer.top Wiki: https://gitee.com/freshday/radar/wikis/home @@ -56,7 +56,7 @@ The project code called Radar, like the code, monitor the transaction at the bac * Mysql : 本项目中关系数据库,主要用于存放 风险模型的元信息。 -* MongoDB: 用于存放事件JSON, 提供基本统计学计算(例如:max, min, sum, avg, ), +* MongoDB: 用于存放事件JSON, 提供基本统计学计算(例如:max, min, sum, avg,), 复杂的统计学概念(sd,variance, etc...)在内存中计算。 * Redis: 提供缓存支持,Engine 利用发布订阅特性监听管理端相关配置的更新 @@ -104,7 +104,7 @@ https://gitee.com/freshday/radar/wikis/manual?sort_id=1637446 建议大家自行注册用户,避免使用同样的测试账号受干扰. ## 未完待续 - +[Release Note:](https://gitee.com/freshday/radar/wikis/release%20note?sort_id=1723765) https://gitee.com/freshday/radar/wikis/release%20note?sort_id=1723765 ### 重大特性 * 支持机器学习 * 数据分析平台 diff --git a/radar-admin/src/main/java/com/pgmmers/radar/controller/RuleApiController.java b/radar-admin/src/main/java/com/pgmmers/radar/controller/RuleApiController.java index 11e0009..f83043f 100644 --- a/radar-admin/src/main/java/com/pgmmers/radar/controller/RuleApiController.java +++ b/radar-admin/src/main/java/com/pgmmers/radar/controller/RuleApiController.java @@ -47,8 +47,6 @@ public class RuleApiController { @PutMapping public CommonResult save(@RequestBody RuleVO rule, HttpServletRequest request) { -// HttpSession session = request.getSession(); -// UserVO user = (UserVO) session.getAttribute("user"); return ruleService.save(rule, contextHolder.getContext().getUsername()); } diff --git a/radar-commons/src/main/java/com/pgmmers/radar/util/GroovyScriptUtil.java b/radar-commons/src/main/java/com/pgmmers/radar/util/GroovyScriptUtil.java index 87c5b80..f9c72e1 100644 --- a/radar-commons/src/main/java/com/pgmmers/radar/util/GroovyScriptUtil.java +++ b/radar-commons/src/main/java/com/pgmmers/radar/util/GroovyScriptUtil.java @@ -3,7 +3,6 @@ package com.pgmmers.radar.util; import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor; - import java.util.HashMap; import java.util.Map; @@ -58,4 +57,11 @@ public class GroovyScriptUtil { return null; } } + + /** + * 删除不在使用的脚本关联的groovy object, 不然内存有溢出风险。 + */ + public static void removeInactiveScript(String script){ + passedClassMap.remove(script.hashCode() + ""); + } } diff --git a/radar-service-impl/src/main/java/com/pgmmers/radar/service/impl/model/AbstractionServiceImpl.java b/radar-service-impl/src/main/java/com/pgmmers/radar/service/impl/model/AbstractionServiceImpl.java index 6e8b51d..dac6160 100644 --- a/radar-service-impl/src/main/java/com/pgmmers/radar/service/impl/model/AbstractionServiceImpl.java +++ b/radar-service-impl/src/main/java/com/pgmmers/radar/service/impl/model/AbstractionServiceImpl.java @@ -9,6 +9,7 @@ import com.pgmmers.radar.service.cache.CacheService; import com.pgmmers.radar.service.cache.SubscribeHandle; import com.pgmmers.radar.service.common.CommonResult; import com.pgmmers.radar.service.model.AbstractionService; +import com.pgmmers.radar.util.GroovyScriptUtil; import com.pgmmers.radar.vo.model.AbstractionVO; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -79,10 +80,17 @@ public class AbstractionServiceImpl implements AbstractionService, SubscribeHand @Override public CommonResult save(AbstractionVO abstraction) { CommonResult result = new CommonResult(); + if (abstraction.getId() != null) { + AbstractionVO oldAbs = abstractionDal.get(abstraction.getId()); + // 如果规则有更新,以前的编译好的groovy 对象用不到了,应该删除。 + if (!oldAbs.getRuleScript().equals(abstraction.getRuleScript())) { + GroovyScriptUtil.removeInactiveScript(oldAbs.getRuleScript()); + } + } int count = abstractionDal.save(abstraction); if (count > 0) { if(StringUtils.isEmpty(abstraction.getName())){ - abstraction.setName("abstraction_"+abstraction.getId()); + abstraction.setName("abstraction_" + abstraction.getId()); abstractionDal.save(abstraction); } diff --git a/radar-service-impl/src/main/java/com/pgmmers/radar/service/impl/model/RuleServiceImpl.java b/radar-service-impl/src/main/java/com/pgmmers/radar/service/impl/model/RuleServiceImpl.java index 223f11c..7c60577 100644 --- a/radar-service-impl/src/main/java/com/pgmmers/radar/service/impl/model/RuleServiceImpl.java +++ b/radar-service-impl/src/main/java/com/pgmmers/radar/service/impl/model/RuleServiceImpl.java @@ -14,6 +14,7 @@ import com.pgmmers.radar.service.cache.SubscribeHandle; import com.pgmmers.radar.service.common.CommonResult; import com.pgmmers.radar.service.model.RuleService; import com.pgmmers.radar.service.search.SearchEngineService; +import com.pgmmers.radar.util.GroovyScriptUtil; import com.pgmmers.radar.vo.model.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -89,6 +90,13 @@ public class RuleServiceImpl implements RuleService, SubscribeHandle { @Override public CommonResult save(RuleVO rule,String merchantCode) { CommonResult result = new CommonResult(); + if (rule.getId() != null) { + RuleVO oldRule = ruleDal.get(rule.getId()); + // 如果规则有更新,以前的编译好的groovy 对象用不到了,应该删除。 + if (!oldRule.getScripts().equals(rule.getScripts())) { + GroovyScriptUtil.removeInactiveScript(oldRule.getScripts()); + } + } int count = ruleDal.save(rule); if (count > 0) { if(StringUtils.isEmpty(rule.getName())){