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 地址的效率,并且通过并发控制保证了线程安全。
浙公网安备 33010602011771号