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