IpAddressService ip地址引數校驗 allIpAddressCheck分析

一曲微茫發表於2024-11-21

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 地址的效率,並且透過併發控制保證了執行緒安全。

相關文章