首页 > 解决方案 > Java AWS 开发工具包 S3。按元数据查找对象

问题描述

请告诉我一种通过用户元数据搜索对象的快速方法。我当前的方法需要大约 20 秒才能对 200 个对象的样本执行此操作。

public List<String> findObjectKeysByMetaKey(String metaKey, String keyValue) {
    try {
        ListObjectsV2Request request = new ListObjectsV2Request().withBucketName(bucketName);
        ListObjectsV2Result result;
        List<String> keys = new ArrayList<>();

        do {
            result = amazonS3Client.listObjectsV2(request);
            keys.addAll(result
                    .getObjectSummaries()
                    .stream()
                    .map(S3ObjectSummary::getKey)
                    .filter(key -> keyValue.equals(getValueByMetaKey(bucketName, key, metaKey)))
                    .collect(Collectors.toList()));

            request.setContinuationToken(result.getNextContinuationToken());
        } while (result.isTruncated());

        return keys;

    } catch (S3Exception e) {
        log.error("Exception when get keys by meta key {} with value {} from bucket {}. Message: {}",
                metaKey, keyValue, bucketName, e.getMessage());
        throw new S3ServiceException(
                String.format("Exception when list all objects in bucket %s. Message: %s",
                        bucketName, e.getMessage()));
    }
}

private String getValueByMetaKey(String bucket, String key, String metaKey) {
    return amazonS3Client.getObjectMetadata(bucket, key).getUserMetadata().get(metaKey);
}

标签: javaamazon-s3

解决方案


推荐阅读