1
0

2 Commits 9df54ad5bd ... 5e39890103

Autor SHA1 Mensagem Data
  hidewnd 5e39890103 doc: 部署文档更新; há 4 dias atrás
  hidewnd a8ec340b7b fix: 风控校验补充null判断; 全局异常处理优化日志打印; há 4 dias atrás

+ 11 - 0
ReadMe.md

@@ -178,6 +178,7 @@ shaogardenios       25097
 arithmeticios       25098
 poetryios           25099
 xintuios            25100
+sorterios           25101
 ```
 
 #### 核心服务
@@ -2021,6 +2022,16 @@ lemonios-service.jar > xintuios.log 2>&1 &
 ```
 
 
+#### IOS: 次元分拣师 sorterios
+
+```shell
+nohup java -jar -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+-XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 \
+-XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=300 \
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-ios-sorter/sorterios.hprof \
+lemonios-service.jar > sorterios.log 2>&1 &
+
+```
 
 
 

+ 40 - 54
yt-risk/risk-manage/src/main/java/com/ytpm/handle/CustomerExceptionHandler.java

@@ -26,6 +26,7 @@ import javax.validation.ConstraintViolation;
 import javax.validation.ConstraintViolationException;
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeoutException;
@@ -37,43 +38,42 @@ import java.util.concurrent.TimeoutException;
 @Slf4j(topic = "risk-exception")
 @RestControllerAdvice(annotations = RestController.class)
 public class CustomerExceptionHandler implements HandlerExceptionResolver {
+
     @ResponseBody
     @ExceptionHandler(Exception.class)
-    public Result<?> handleException(Exception ex) {
+    public Result<Void> handleException(Exception ex) {
         //打印异常信息
-        log.error("系统异常: {}", ex.getMessage(), ex);
+        log.error(StrUtil.format("系统异常: {}", ex.getMessage()), ex);
         String msg = "查询超时,请稍后重试!";
         // 根据异常类型返回不同的错误信息
         if (ex instanceof NullPointerException) {
-            return new Result(StatusCode.ERROR, msg);
+            return new Result<>(StatusCode.ERROR, msg);
         } else if (ex instanceof TimeoutException) {
-            return new Result(StatusCode.ERROR, msg);
+            return new Result<>(StatusCode.ERROR, msg);
         }
         return new Result<>(StatusCode.ERROR, msg);
     }
 
     @ResponseBody
     @ExceptionHandler({ClientAbortException.class, IOException.class})
-    public Result handleNetworkException(Exception ex) {
-        if (ex instanceof ClientAbortException ||
-                (ex instanceof IOException && "Broken pipe".equals(ex.getMessage()))) {
+    public Result<Void> handleNetworkException(Exception ex) {
+        if (ex instanceof ClientAbortException
+                || (ex instanceof IOException && "Broken pipe".equals(ex.getMessage()))) {
             // 客户端断开连接,不需要完整记录堆栈,减少日志量
             log.warn("客户端断开连接: {}", ex.getMessage());
-            return new Result(StatusCode.ERROR, "网络开小差,请稍后重试!");
+            return new Result<>(StatusCode.ERROR, "网络开小差,请稍后重试!");
         }
         log.error("网络IO异常: {}", ex.getMessage());
-        return new Result(StatusCode.ERROR, "网络开小差,请稍后重试!");
+        return new Result<>(StatusCode.ERROR, "网络开小差,请稍后重试!");
     }
+
     /**
      * 对象参数校验失败
-     *
-     * @param ex
-     * @return
      */
     @ResponseBody
     @ExceptionHandler(MissingServletRequestParameterException.class)
-    public Result<?> handleMissingServletRequestParameterException(Exception ex) {
-        log.error("对象参数校验失败,异常信息为:e={}", ex);
+    public Result<Void> handleMissingServletRequestParameterException(Exception ex) {
+        log.error(StrUtil.format("对象参数校验失败,异常信息为:e={}", ex.getMessage()), ex);
         String msg = MessageFormat.format("缺少参数{0}", ((MissingServletRequestParameterException) ex).getParameterName());
         return new Result<>(StatusCode.MISSING_PARAMETER, msg);
     }
@@ -81,70 +81,48 @@ public class CustomerExceptionHandler implements HandlerExceptionResolver {
     /**
      * 单个参数校验失败
      *
-     * @param ex
-     * @return
      */
     @ResponseBody
     @ExceptionHandler(ConstraintViolationException.class)
-    public Result handleConstraintViolationException(Exception ex) {
-        log.error("单个参数校验失败,异常信息为:ex={}",ex);
+    public Result<Void> handleConstraintViolationException(Exception ex) {
+        log.error(StrUtil.format("单个参数校验失败,异常信息为:ex={}", ex.getMessage()), ex);
         Set<ConstraintViolation<?>> sets = ((ConstraintViolationException) ex).getConstraintViolations();
         if (!CollectionUtils.isEmpty(sets)) {
-            StringBuilder sb = new StringBuilder();
-            sets.forEach(error -> {
-//                if (error instanceof FieldError) {
-//                    sb.append(((FieldError) error).getField()).append(":");
-//                }
-                sb.append(error.getMessage()).append(";");
-            });
-            String msg = sb.toString();
-            msg = StrUtil.sub(msg, 0, msg.length() - 1);
-            return new Result(StatusCode.PARAMETER_CHECK_ERR, msg);
+            List<String> list = new ArrayList<>();
+            sets.forEach(error -> list.add(error.getMessage()));
+            String msg = String.join(";", list);
+            return new Result<>(StatusCode.PARAMETER_CHECK_ERR, msg);
         }
-        return new Result(StatusCode.PARAMETER_CHECK_ERR, "参数校验失败");
+        return new Result<>(StatusCode.PARAMETER_CHECK_ERR, "参数校验失败");
     }
 
     /**
-     * 自定义校验异常信息捕获
+     * 方法参数传递非法或不适当 异常信息捕获
      *
-     * @param ex
-     * @return
      */
     @ResponseBody
     @ExceptionHandler(IllegalArgumentException.class)
-    public Result handleSpringCheckException(Exception ex) {
-        log.error("自定义校验异常信息捕获,异常信息为:ex={}",ex);
+    public Result<Void> handleSpringCheckException(Exception ex) {
+        log.error(StrUtil.format("参数不合法,异常信息为:ex={}", ex.getMessage()), ex);
         String msg = ex.getMessage();
-        return new Result(StatusCode.PARAMETER_CHECK_ERR, msg);
+        return new Result<>(StatusCode.PARAMETER_CHECK_ERR, msg);
     }
 
     /**
-     * POST 请求参数校验失败
-     *
-     * @param ex
-     * @return
+     * POST 请求参数校验失败 异常捕获
      */
     @ResponseBody
     @ExceptionHandler(MethodArgumentNotValidException.class)
-    public Result handleMethodArgumentNotValidException(Exception ex) {
-        log.error(" 请求参数校验失败,异常信息为:ex={}",ex);
+    public Result<Void> handleMethodArgumentNotValidException(Exception ex) {
+        log.error(StrUtil.format("请求参数校验失败,异常信息为:ex={}", ex.getMessage()), ex);
         List<ObjectError> errors = ((MethodArgumentNotValidException) ex).getBindingResult().getAllErrors();
         String msg = getValidExceptionMsg(errors);
-        return new Result(StatusCode.PARAMETER_CHECK_ERR, msg);
-    }
-
-    @ResponseBody
-    @ExceptionHandler(ValidatedException.class)
-    public Result handleValidatedException(Exception ex) {
-        log.error(" 请求参数校验失败,异常信息为:ex={}", ex.getMessage());
-        return new Result(StatusCode.BUSINESS_CERTIFICATE_TYPE_STATUS_ERROR, ex.getMessage());
+        return new Result<>(StatusCode.PARAMETER_CHECK_ERR, msg);
     }
 
     /**
      * 获取属性校验异常信息
      *
-     * @param errors
-     * @return
      */
     private String getValidExceptionMsg(List<ObjectError> errors) {
         if (!CollectionUtils.isEmpty(errors)) {
@@ -157,16 +135,24 @@ public class CustomerExceptionHandler implements HandlerExceptionResolver {
         return "绑定异常";
     }
 
+    @ResponseBody
+    @ExceptionHandler(ValidatedException.class)
+    public Result<Void> handleValidatedException(Exception ex) {
+        log.error("请求参数校验失败,异常信息为:ex={}", ex.getMessage());
+        return new Result<>(StatusCode.BUSINESS_CERTIFICATE_TYPE_STATUS_ERROR, ex.getMessage());
+    }
+
+
     @ResponseBody
     @ExceptionHandler(MaxUploadSizeExceededException.class)
     public Result<?> handlerFileUploadException(MaxUploadSizeExceededException ex) {
-        log.error("抛出异常信息,异常信息为:ex={}", ex.getMessage(), ex);
+        log.error(StrUtil.format("抛出异常信息,异常信息为:ex={}", ex.getMessage()), ex);
         return new Result<>(StatusCode.ERROR, "文件超出限制(10MB)");
     }
 
     @Override
     public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
-        log.error(" 系统异常,异常信息为:e={}", e.getMessage(), e);
+        log.error(StrUtil.format("系统异常,异常信息为:e={}", e.getMessage()), e);
         ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
         if (e instanceof MultipartException) {
             mv.addObject("message", "系统异常");
@@ -181,7 +167,7 @@ public class CustomerExceptionHandler implements HandlerExceptionResolver {
     @ResponseBody
     @ExceptionHandler(CustomerException.class)
     public Result<?> handleCustomerException(Exception ex) {
-        log.error("自定义校验异常信息捕获,异常信息为:ex={}", ex.getMessage(), ex);
+        log.error(StrUtil.format("自定义校验异常信息捕获,异常信息为:ex={}", ex.getMessage()), ex);
         String msg = ex.getMessage();
         return new Result<>(StatusCode.ACCESS_ERR, msg);
     }

+ 8 - 4
yt-risk/risk-manage/src/main/java/com/ytpm/strategy/Risk322Strategy.java

@@ -1,5 +1,6 @@
 package com.ytpm.strategy;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
@@ -44,10 +45,13 @@ public class Risk322Strategy extends DefaultRiskStrategy {
         int days = Integer.parseInt(configMap.get("days"));
         Date currentDate = new Date();
         //过滤该用户注册时间在三天内的渠道数
-        long ditchCount = dyzUsers.stream()
-                .filter(user -> user.getRegistryTime() != null)
-                .filter(user -> (days > DateUtil.between(currentDate, user.getRegistryTime(), DateUnit.DAY)))
-                .count();
+        long ditchCount = 0;
+        if (CollectionUtil.isNotEmpty(dyzUsers)) {
+            ditchCount = dyzUsers.stream()
+                    .filter(user -> user.getRegistryTime() != null)
+                    .filter(user -> (days > DateUtil.between(currentDate, user.getRegistryTime(), DateUnit.DAY)))
+                    .count();
+        }
         //三天内注册的渠道数小于预设的渠道数通过校验,否则风控锁定用户
         if (ditchCount < uidCount && (sameDeviceCount == null || sameDeviceCount <= 1)) {
             return;

+ 1 - 1
yt-risk/risk-manage/src/main/java/com/ytpm/strategy/Risk333Strategy.java

@@ -32,7 +32,7 @@ public class Risk333Strategy extends DefaultRiskStrategy {
         //得到配置的时间间隔
         int hours = Integer.parseInt(configMap.getOrDefault("hours", "0"));
         Integer sameDeviceDitchRegCount = getPararm(params, "sameDeviceDitchRegCount", Integer.class);
-        if (sameDeviceDitchRegCount >= uidCount) {
+        if (sameDeviceDitchRegCount != null && sameDeviceDitchRegCount >= uidCount) {
             String superiorId = getPararm(params, "superiorId", String.class);
             log.info("[risk 333]superiorId:{} appId:{} userId:{} sameDeviceDitchRegCount:{}",
                     superiorId, dyzUser.getAppId(), dyzUser.getUserId(), sameDeviceDitchRegCount);

+ 3 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/strategy/Risk334Strategy.java

@@ -47,6 +47,9 @@ public class Risk334Strategy extends DefaultRiskStrategy {
         Map<String, String> configMap = templateVo.getConfigMap();
         int limitCount = Integer.parseInt(configMap.get("limitCount"));
         Integer userCount = getPararm(params, "sameIpUserCount", Integer.class);
+        if (userCount == null) {
+            userCount = 0;
+        }
         if (redisService.hasKey(passkey) && limitCount <= userCount) {
             log.warn(StrUtil.format("[risk 334] superiorId:{} appId:{} userId:{} limitCount:{}",
                     superiorId, dyzUser.getAppId(), dyzUser.getUserId(), limitCount));

+ 4 - 2
yt-risk/risk-manage/src/main/java/com/ytpm/strategy/Risk344Strategy.java

@@ -38,8 +38,10 @@ public class Risk344Strategy extends DefaultRiskStrategy {
             }
         }
         if (totalRevenue.compareTo(limitValue) < 0) {
-            log.warn(StrUtil.format("[risk 344]appId:{} userId:{} totalRevenue:{} revenueLimit:{}",
-                    dyzUser.getAppId(), dyzUser.getUserId(), totalRevenue, limitValue));
+            String superiorId = getPararm(params, "superiorId", String.class);
+            log.warn(StrUtil.format(
+                    "[risk 344]superiorId:{} appId:{} userId:{} totalRevenue:{} revenueLimit:{}",
+                    superiorId, dyzUser.getAppId(), dyzUser.getUserId(), totalRevenue, limitValue));
             throw new RiskException(getRiskCode(), "预估收益不到上限游客用户风控", RepMessage.RISK_VISITOR_LOWER_VALUE);
         }
     }

+ 3 - 2
yt-risk/risk-manage/src/main/java/com/ytpm/strategy/Risk345Strategy.java

@@ -37,8 +37,9 @@ public class Risk345Strategy extends DefaultRiskStrategy{
             }
         }
         if (totalEcpm.compareTo(limitValue) < 0) {
-            log.warn(StrUtil.format("[risk 345]]appId:{} userId:{}, totalEcpm:{} ecpmLimit:{}",
-                    dyzUser.getAppId(), dyzUser.getUserId(), totalEcpm, limitValue));
+            String superiorId = getPararm(params, "superiorId", String.class);
+            log.warn(StrUtil.format("[risk 345]superiorId:{} appId:{} userId:{}, totalEcpm:{} ecpmLimit:{}",
+                    superiorId, dyzUser.getAppId(), dyzUser.getUserId(), totalEcpm, limitValue));
             throw new RiskException(getRiskCode(), "预估收益不到上限游客用户风控", RepMessage.RISK_VISITOR_LOWER_VALUE);
         }
     }

+ 1 - 1
yt-risk/risk-manage/src/main/java/com/ytpm/strategy/Risk767Strategy.java

@@ -33,7 +33,7 @@ public class Risk767Strategy extends DefaultRiskStrategy {
             return;
         }
         Integer monthVideoAdCount = getPararm(params, "monthVideoAdCount", Integer.class);
-        if (monthVideoAdCount > monthTaskLimit) {
+        if (monthVideoAdCount != null && monthVideoAdCount > monthTaskLimit) {
             String superiorId = getPararm(params, "superiorId", String.class);
             log.warn(StrUtil.format("[risk 767]superiorId:{} appId:{} userId:{} adRecordCount:{} monthTaskLimit:{}",
                     superiorId, dyzUser.getAppId(),dyzUser.getUserId(), monthVideoAdCount, monthTaskLimit));

+ 1 - 1
yt-risk/risk-manage/src/main/java/com/ytpm/strategy/Risk768Strategy.java

@@ -33,7 +33,7 @@ public class Risk768Strategy extends DefaultRiskStrategy{
         if (hourCount <= 0 || hourTaskLimit <= 0) {
             return;
         }
-        if (hourVideoAdCount > hourTaskLimit) {
+        if (hourVideoAdCount != null && hourVideoAdCount > hourTaskLimit) {
             String superiorId = getPararm(params, "superiorId", String.class);
             log.warn(StrUtil.format("[risk 768]superiorId:{} appId:{} userId:{} adRecordCount:{} hourLimit:{}",
                     superiorId, dyzUser.getAppId(),dyzUser.getUserId(), hourVideoAdCount, hourTaskLimit));

+ 13 - 3
yt-risk/risk-manage/src/main/java/com/ytpm/strategy/RiskStrategyContext.java

@@ -188,11 +188,21 @@ public class RiskStrategyContext {
         }
         String riskCode = templateVo.getRiskCode();
         YtApp ytApp = appMapper.selectRiskApp(dyzUser.getAppId());
-        YtPlatformUserApp userApp = appMapper.selectParentApp(ytApp.getSuperiorId());
+        if (ytApp == null) {
+            log.warn(StrUtil.format("[RiskStrategyContext]校验应用查询不存在:appId: {} userId: {}",
+                    dyzUser.getAppId(), dyzUser.getUserId()));
+        }
+        YtPlatformUserApp userApp = ytApp == null ? null : appMapper.selectParentApp(ytApp.getSuperiorId());
+        if (ytApp != null && userApp == null) {
+            log.warn(StrUtil.format("[RiskStrategyContext]校验母包应用查询不存在:superiorId:{} appId: {} userId: {}",
+                    ytApp.getSuperiorId(), dyzUser.getAppId(), dyzUser.getUserId()));
+        }
         params.put("app", ytApp);
         params.put("platformUserApp", userApp);
-        params.put("superiorId", userApp.getAppId());
-        params.put("serviceName", userApp.getServiceName());
+        if (userApp != null) {
+            params.put("superiorId", userApp.getAppId());
+            params.put("serviceName", userApp.getServiceName());
+        }
         // 获取对应的策略实现,如果没有对应的则使用默认策略
         RiskStrategy strategy = strategyMap.getOrDefault(riskCode, strategyMap.get("default"));
         if (strategy == null) {