职贝云数AI新零售门户

标题: 接口报错预警企微音讯 [打印本页]

作者: ECSGk4    时间: 2023-4-2 15:23
标题: 接口报错预警企微音讯
接口报错预警企微音讯

摘要
及时发现程序报错预警
关键词
企微发送助手音讯接口、自定义注解、aop、解耦
成绩的提出
1- 即时反馈用户端异常状况
2- 减少脏数据的入库
处理思绪以及实际
对于能够导致数据不分歧状况的地方 代码中不要catch 或者catch住要停止处理 或者抛出到controller层 在一致异常处理之前阻拦住异常 调用企微发送音讯接口向配置的员工发送企微音讯

(, 下载次数: 6)

配置文件中配置运用称号、环境称号
在预警音讯中发送异常发生的接口、央求参数、错误信息、还有工夫戳。可以根据工夫戳定位到错误发生地位(方便查询日志)
运用
自定义一个starter starter中尽能够少依赖其他jar包
自定义了一个注解 对于在接口上添加此注解的接口停止错误预警
配置文件中可配置运用、环境、企业、对应企业的员工、能否激活此注解
运用时只需求添加starter依赖、配置你本人的配置文件 在接口报错的时分就会在企微中发给你预警音讯 对应的开发人员可以即时发现即时处理
注解
  1. /**
  2. * @Author ningYu
  3. * @create 2022/6/10 11:17
  4. * @Target 注解用来指定一个注解的运用范围
  5. * @Retention 用于描画注解的生命周期,也就是该注解被保留的工夫长短
  6. * @Documented 注解修饰的注解类会被 JavaDoc 工具提取成文档
  7. * @Inherited 是一个标记注解,用来指定该注解可以被承继
  8. */
  9. @Target(value = {ElementType.METHOD})
  10. @Retention(RetentionPolicy.RUNTIME)
  11. @Documented
  12. @Inherited
  13. @Order(Ordered.HIGHEST_PRECEDENCE)
  14. public @interface WarnNotice {
  15.     //方法名
  16.     String value() ;
  17.     //操作类型
  18.     int operateType();
  19.     //功能类型
  20.     String functionType() ;
  21. }
复制代码
处理注解代码`
  1. @Pointcut("@annotation(com.huibo.warnNotice.annotation.WarnNotice)")
  2. public void access() {
  3. }
  4. /**
  5. * 假如接口抛出错误 企微提示开发人员
  6. *
  7. * @param joinPoint
  8. * @throws Exception
  9. */
  10. @AfterThrowing(value = "access()", throwing = "error")
  11. public void addErrorLogRecord(JoinPoint joinPoint, Exception error) throws Exception {
  12.     String errMsg = "";
  13.     String timeStamp = System.currentTimeMillis() + "";
  14.     log.error(timeStamp + ":" + "接口出现异常 向配置的开发人员发起告诉");
  15.     try {
  16.         Signature sig = joinPoint.getSignature();
  17.         MethodSignature msig = (MethodSignature) sig;
  18.         //根据aop参数获取到目的对象 获取到切面 根据反射和切面获取到方法签名和方法参数获取目的对象的方法  获取到方法的注解 拿到注解的属性
  19.         Object target = joinPoint.getTarget();
  20.         Object[] args = joinPoint.getArgs();
  21.         Method method = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
  22.         LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
  23.         WarnNotice annotation = method.getAnnotation(WarnNotice.class);
  24.         String methodName = annotation.value();
  25.         String[] parameterNames = u.getParameterNames(method);
  26.         Map<String, Object> paramMap = new HashMap<>();
  27.         if (parameterNames.length > 0) {
  28.             int i = 0;
  29.             for (String paramName : parameterNames) {
  30.                 paramMap.put(paramName, args[i]);
  31.             }
  32.         }
  33.         errMsg =   qwUserConfig.getEnvironment() + "环境:" + qwUserConfig.getModuleName() + "bug音讯预警--\n  timeStamp:" + timeStamp + "\n  方法:" + methodName + "\n  param:" + JSON.toJSONString(paramMap) + "\n  error:" + error.getMessage();
  34.         sendQwMsg(errMsg);
  35.     } catch (Throwable e) {
  36.         log.error(timeStamp + ":发音讯代码错误  " + e.getMessage(), e);
  37.     } finally {  //将异常抛出去 交给全局异常处理器处理
  38.         if (error instanceof BizException) {
  39.             BizException e = (BizException) error;
  40.             log.error(timeStamp + e.getMessage(), e);
  41.             throw new BizException(e.getCode(), e.getMessage());
  42.         } else {
  43.             log.error(timeStamp + error.getMessage(), error);
  44.             throw new BizException(BizExceptionEnum.SYSTEM_ERROR);
  45.         }
  46.     }
  47. }`
复制代码
发送企微音讯代码
  1. //这里其实就是调用了一个http接口
  2. public void sendQwMsg(String errMsg) throws Exception {
  3.         log.info("errMsg:[{}]", errMsg);
  4.         LambdaQueryWrapper<QyAgentInfo> qw = new LambdaQueryWrapper<>();
  5.         qw.eq(QyAgentInfo::getIsDelete, 0)
  6.                 .eq(QyAgentInfo::getStatus, 1)
  7.                 .eq(QyAgentInfo::getCorpId, qwUserConfig.getCorpid())
  8.                 .last(" limit 1 ");
  9.         QyAgentInfo qyAgentInfo = qyAgentInfoMapper.selectOne(qw);
  10.         RestTemplate restTemplate = new RestTemplate();
  11.         log.info("qyAgentInfo:[{}]", JSON.toJSONString(qyAgentInfo));
  12.         URI uri = new URI(qwUserConfig.getSendurl() + qyAgentInfo.getAccessToken());
  13.         Map<String, Object> paramMap = new HashMap<>();
  14.         paramMap.put("touser", qwUserConfig.getTouser());
  15.         paramMap.put("msgtype", qwUserConfig.getMsgtype());
  16.         paramMap.put("agentid", qwUserConfig.getAgentid());
  17.         paramMap.put("safe", qwUserConfig.getSafe());
  18.         Map<String, Object> map = new HashMap<>();
  19.         map.put("content", errMsg);
  20.         paramMap.put("text", map);
  21.         RequestEntity<Map<String, Object>> requestEntity = RequestEntity.post(uri).
  22.                 contentType(MediaType.APPLICATION_JSON).body(paramMap);
  23.         ResponseEntity<QiWeiRes> exchange = restTemplate.exchange(requestEntity, QiWeiRes.class);
  24.         return;
  25.     }
复制代码





欢迎光临 职贝云数AI新零售门户 (https://www.taojin168.com/cloud/) Powered by Discuz! X3.5