IpAddressService ip地址参数校验 allIpAddressCheck分析

allIpAddressCheck 方法是 IpAddressServiceImpl 类中的一个实现方法,该类实现了 IpAddressService 接口。这个方法的主要功能是对传入的一组 IP 地址进行异步检查,并将结果汇总返回给调用者。下面是对此方法的详细分析:

方法签名

@Override
public AllIpAddressCheckResponse allIpAddressCheck(AllIpAddressCheckRequest request)
  • 输入参数request 是一个 AllIpAddressCheckRequest 对象,包含了需要检查的 IP 地址列表。
  • 返回值AllIpAddressCheckResponse 对象,包含检查的结果。

方法流程

  1. 初始化响应对象

    AllIpAddressCheckResponse response = new AllIpAddressCheckResponse();
    Map<String, Boolean> map = new ConcurrentHashMap<>();
    List<String> ipAddressList = request.getIpAddressList();
    response.setResult(true);
    
    • 创建了一个响应对象 response
    • 使用 ConcurrentHashMap 存储每个 IP 地址的检查结果,确保线程安全。
    • 获取请求中的 IP 地址列表。
    • 初始化响应结果为 true,假设所有 IP 地址都通过了检查。
  2. 参数校验

    if (ipAddressList == null || ipAddressList.isEmpty()) {
        throw new TitanException("所传参数为空!");
    }
    
    • 如果 IP 地址列表为空或未提供,则抛出异常。
  3. 去重处理

    Set<String> ipAddressSet = new HashSet<>(ipAddressList);
    CountDownLatch latch = new CountDownLatch(ipAddressSet.size());
    
    • 将 IP 地址列表转换为 HashSet 去重。
    • 创建一个 CountDownLatch 对象,用于等待所有异步任务完成。
  4. 异步检查 IP 地址

    for (String ipAddress : ipAddressSet) {
        if (ipAddress == null || ipAddress.isEmpty()) {
            throw new TitanException("所传 IP 地址为空");
        }
    
        if (!ipAddressCheck(ipAddress)) {
            throw new TitanException("所传 IP 地址格式错误");
        }
    
        ipCheckService.asyncIpCheck(ipAddress, map, latch);
    }
    
    • 遍历去重后的 IP 地址集合。
    • 检查每个 IP 地址是否为空或格式是否正确。
    • 调用 ipCheckService.asyncIpCheck 方法进行异步检查,并传递 maplatch 对象。
  5. 等待所有任务完成

    latch.await();
    
    • 使用 CountDownLatch 等待所有异步任务完成。
  6. 汇总检查结果

    map.keySet().forEach(key -> {
        if (!map.get(key)) {
            response.setResult(false);
        }
    });
    
    • 遍历 map 中的所有键,如果某个 IP 地址的检查结果为 false,则将响应结果设置为 false
  7. 构建响应对象

    HashMap<String, Boolean> hashMap = Maps.newHashMap(map);
    response.setMap(hashMap);
    RespUtils.setSuccess(response);
    
    • ConcurrentHashMap 转换为普通的 HashMap
    • 设置响应对象中的 map 属性。
    • 使用 RespUtils.setSuccess 方法设置响应的成功状态。
  8. 异常处理

    } catch (InterruptedException e) {
        log.error("IP 检验线程数据同步异常", e);
        throw new TitanException("IP 检验线程数据同步异常", e);
    } catch (Exception e) {
        log.error("IP 检验异常", e);
        throw new TitanException("IP 检验异常", e);
    }
    
    • 捕获并处理可能发生的 InterruptedException 和其他异常,记录日志并抛出自定义异常 TitanException

总结

allIpAddressCheck 方法通过异步方式检查多个 IP 地址的有效性和状态,使用 CountDownLatch 确保所有任务完成后才继续执行后续逻辑。这种方法可以提高处理大量 IP 地址的效率,并且通过并发控制保证了线程安全。

posted @ 2024-11-21 00:01  一曲微茫  阅读(9)  评论(0编辑  收藏  举报