IpAddressService ip地址参数校验 allIpAddressCheck分析
allIpAddressCheck
方法是 IpAddressServiceImpl
类中的一个实现方法,该类实现了 IpAddressService
接口。这个方法的主要功能是对传入的一组 IP 地址进行异步检查,并将结果汇总返回给调用者。下面是对此方法的详细分析:
方法签名
@Override
public AllIpAddressCheckResponse allIpAddressCheck(AllIpAddressCheckRequest request)
- 输入参数:
request
是一个AllIpAddressCheckRequest
对象,包含了需要检查的 IP 地址列表。 - 返回值:
AllIpAddressCheckResponse
对象,包含检查的结果。
方法流程
-
初始化响应对象:
AllIpAddressCheckResponse response = new AllIpAddressCheckResponse(); Map<String, Boolean> map = new ConcurrentHashMap<>(); List<String> ipAddressList = request.getIpAddressList(); response.setResult(true);
- 创建了一个响应对象
response
。 - 使用
ConcurrentHashMap
存储每个 IP 地址的检查结果,确保线程安全。 - 获取请求中的 IP 地址列表。
- 初始化响应结果为
true
,假设所有 IP 地址都通过了检查。
- 创建了一个响应对象
-
参数校验:
if (ipAddressList == null || ipAddressList.isEmpty()) { throw new TitanException("所传参数为空!"); }
- 如果 IP 地址列表为空或未提供,则抛出异常。
-
去重处理:
Set<String> ipAddressSet = new HashSet<>(ipAddressList); CountDownLatch latch = new CountDownLatch(ipAddressSet.size());
- 将 IP 地址列表转换为
HashSet
去重。 - 创建一个
CountDownLatch
对象,用于等待所有异步任务完成。
- 将 IP 地址列表转换为
-
异步检查 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
方法进行异步检查,并传递map
和latch
对象。
-
等待所有任务完成:
latch.await();
- 使用
CountDownLatch
等待所有异步任务完成。
- 使用
-
汇总检查结果:
map.keySet().forEach(key -> { if (!map.get(key)) { response.setResult(false); } });
- 遍历
map
中的所有键,如果某个 IP 地址的检查结果为false
,则将响应结果设置为false
。
- 遍历
-
构建响应对象:
HashMap<String, Boolean> hashMap = Maps.newHashMap(map); response.setMap(hashMap); RespUtils.setSuccess(response);
- 将
ConcurrentHashMap
转换为普通的HashMap
。 - 设置响应对象中的
map
属性。 - 使用
RespUtils.setSuccess
方法设置响应的成功状态。
- 将
-
异常处理:
} 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 地址的效率,并且通过并发控制保证了线程安全。