This commit is contained in:
2025-05-30 10:31:21 +08:00
parent 115edc19fa
commit 80f4491836
73 changed files with 310 additions and 485 deletions

View File

@@ -23,14 +23,11 @@ public class FaceBodyFactory {
}
public static IFaceBodyAdapter getAdapter(FaceBodyAdapterType type) {
switch (type) {
case ALI:
return new AliFaceBodyAdapter();
case BCE:
return new BceFaceBodyAdapter();
default:
throw new FaceBodyUnsupportedException("不支持的Adapter类型");
}
return switch (type) {
case ALI -> new AliFaceBodyAdapter();
case BCE -> new BceFaceBodyAdapter();
default -> throw new FaceBodyUnsupportedException("不支持的Adapter类型");
};
}

View File

@@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -62,33 +63,31 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
}
private IRateLimiter getLimiter(LOCK_TYPE type) {
switch (type) {
case ADD_DB:
return addDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case ADD_ENTITY:
return addEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case ADD_FACE:
return addFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case LIST_DB:
return listDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS));
case LIST_FACE:
return listFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(2));
case SEARCH_FACE:
return searchFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(200, TimeUnit.MILLISECONDS));
case DELETE_DB:
return deleteDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case DELETE_ENTITY:
return deleteEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
default:
return new FixedRateLimiter(600, TimeUnit.MILLISECONDS);
}
return switch (type) {
case ADD_DB ->
addDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case ADD_ENTITY ->
addEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case ADD_FACE ->
addFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case LIST_DB ->
listDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS));
case LIST_FACE -> listFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(2));
case SEARCH_FACE ->
searchFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(200, TimeUnit.MILLISECONDS));
case DELETE_DB ->
deleteDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case DELETE_ENTITY ->
deleteEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
default -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS);
};
}
@Override
public boolean addFaceDb(String dbName) {
IRateLimiter addDbLimiter = getLimiter(LOCK_TYPE.ADD_DB);
try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient();
IAcsClient client = clientWrapper.client();
CreateFaceDbRequest request = new CreateFaceDbRequest();
request.setName(dbName);
try {
@@ -112,7 +111,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
request.setOrder("asc");
request.setLimit(200);
try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient();
IAcsClient client = clientWrapper.client();
while (true) {
ListFaceEntitiesResponse response = client.getAcsResponse(request);
if (response.getData().getTotalCount() == 0) {
@@ -151,7 +150,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
public List<String> listFaceDb() {
ListFaceDbsRequest request = new ListFaceDbsRequest();
try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient();
IAcsClient client = clientWrapper.client();
ListFaceDbsResponse response = client.getAcsResponse(request);
return response.getData().getDbList().stream().map(ListFaceDbsResponse.Data.DbListItem::getName).collect(Collectors.toList());
} catch (ClientException e) {
@@ -168,7 +167,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
request.setDbName(dbName);
request.setEntityId(entityId);
try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient();
IAcsClient client = clientWrapper.client();
try {
addEntityLimiter.acquire();
} catch (InterruptedException ignored) {
@@ -207,7 +206,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
request.setDbName(dbName);
request.setEntityId(entityId);
try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient();
IAcsClient client = clientWrapper.client();
try {
deleteEntityLimiter.acquire();
} catch (InterruptedException ignored) {
@@ -231,16 +230,12 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
if (offset != null) {
listFaceEntitiesRequest.setOffset(offset);
}
if (size != null) {
listFaceEntitiesRequest.setLimit(size);
} else {
listFaceEntitiesRequest.setLimit(200);
}
listFaceEntitiesRequest.setLimit(Objects.requireNonNullElse(size, 200));
if (StringUtils.isNotEmpty(prefix)) {
listFaceEntitiesRequest.setEntityIdPrefix(prefix);
}
try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient();
IAcsClient client = clientWrapper.client();
try {
listFaceLimiter.acquire();
} catch (InterruptedException ignored) {
@@ -260,7 +255,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
SearchFaceResp resp = new SearchFaceResp();
IRateLimiter searchFaceLimiter = getLimiter(LOCK_TYPE.SEARCH_FACE);
try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient();
IAcsClient client = clientWrapper.client();
SearchFaceRequest request = new SearchFaceRequest();
request.setDbName(dbName);
request.setImageUrl(faceUrl);
@@ -276,7 +271,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
resp.setOriginalFaceScore(0f);
return resp;
}
SearchFaceResponse.Data.MatchListItem matchItem = matchList.get(0);
SearchFaceResponse.Data.MatchListItem matchItem = matchList.getFirst();
resp.setOriginalFaceScore(matchItem.getQualitieScore());
resp.setResult(matchItem.getFaceItems().stream().map(item -> {
SearchFaceResultItem resultItem = new SearchFaceResultItem();
@@ -287,7 +282,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
return resultItem;
}).collect(Collectors.toList()));
if (!resp.getResult().isEmpty()) {
resp.setFirstMatchRate(resp.getResult().get(0).getScore());
resp.setFirstMatchRate(resp.getResult().getFirst().getScore());
}
return resp;
} catch (ClientException e) {
@@ -304,13 +299,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
return new ClientWrapper(client);
}
@Getter
public static class ClientWrapper implements AutoCloseable {
private final IAcsClient client;
public ClientWrapper(IAcsClient client) {
this.client = client;
}
public record ClientWrapper(IAcsClient client) implements AutoCloseable {
@Override
public void close() {
@@ -319,7 +308,6 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
}
client.shutdown();
}
}
protected enum LOCK_TYPE {
ADD_DB,

View File

@@ -304,7 +304,7 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
}
resp.setResult(result);
if (!result.isEmpty()) {
resp.setFirstMatchRate(result.get(0).getScore());
resp.setFirstMatchRate(result.getFirst().getScore());
}
return resp;
} else {
@@ -334,26 +334,25 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
}
private IRateLimiter getLimiter(LOCK_TYPE type) {
switch (type) {
case ADD_DB:
return addDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case ADD_FACE:
return addFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getAddQps()));
case LIST_DB:
return listDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case LIST_FACE:
return listFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case SEARCH_FACE:
return searchFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getSearchQps()));
case DELETE_DB:
return deleteDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case DELETE_ENTITY:
return deleteEntityLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case DELETE_FACE:
return deleteFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
default:
return new FixedRateLimiter(500, TimeUnit.MILLISECONDS);
}
return switch (type) {
case ADD_DB ->
addDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case ADD_FACE ->
addFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getAddQps()));
case LIST_DB ->
listDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case LIST_FACE ->
listFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case SEARCH_FACE ->
searchFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getSearchQps()));
case DELETE_DB ->
deleteDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case DELETE_ENTITY ->
deleteEntityLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case DELETE_FACE ->
deleteFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
default -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS);
};
}
protected enum LOCK_TYPE {