Выполнение PutObjectCallableRequest в AWS s3 SDK для C ++ - PullRequest
0 голосов
/ 06 июня 2018

Я хочу выполнить многопоточность для загрузки объектов и получения вызываемого сообщения при использовании AWS S3 SDK для C ++.

Например: когда я загружаю 10 изображений в мое хранилище s3, другой поток увеличивает счетчик.Когда загрузка будет завершена, я должен получить вызываемый объект или указатель, который остановит приращение моего счетчика.

Мне нужна библиотека Thread Safe, чтобы я мог загружать / скачивать или обрабатывать файлы параллельно

PutObjectCallableRequest класс доступен, но типы параметров и определение не определены.Как мне выполнить эту задачу.Я не хочу использовать какие-либо API, необходимо использовать библиотеку s3 SDK.

Я приложил ссылку на пример кода загрузки объекта с помощью PutObjectRequest в aws s3 SDK для C ++.

https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/cpp/example_code/s3/put_object.cpp

Предполагается, что это одна нить.Какую библиотеку мне следует использовать в случае, если я также хочу параллельно перечислять объекты моего сегмента?

Редактировать:

Это то, что я пытаюсь реализовать.Как внести изменения в следующий код, чтобы реализовать асинхронные операции и получить обратный вызов.

#include <aws/core/Aws.h>
#include <aws/core/client/ClientConfiguration.h>
#include <aws/core/http/Scheme.h>
#include <aws/core/utils/threading/Executor.h>
#include <aws/s3/S3Client.h>
#include <aws/transfer/TransferManager.h>

using namespace std;
using namespace Aws::S3;
using namespace Aws::S3::Model;
using namespace Aws::Client;
using namespace Aws::Http;


static const char* const ALLOCATION_TAG = "S3_MULTIPART_TEST";

int main(int /*argc*/, char** /*argv*/)
{
    Aws::SDKOptions options;
    Aws::InitAPI(options);

    Aws::String bucket = "your-bucket-name";

    // Set up S3 client
    ClientConfiguration config;
    config.region = "us-east-1";
    config.connectTimeoutMs = 3000;
    config.requestTimeoutMs = 60000;
    auto s3Client = Aws::MakeShared<Aws::S3Client>(ALLOCATION_TAG, config, false);

   // Aws::S3::S3Client s3Client(config);
    auto sdk_client_executor = Aws::MakeShared<Aws::Utils::Threading::DefaultExecutor>(ALLOCATION_TAG);
    Aws::Transfer::TransferManagerConfiguration transferConfig(sdk_client_executor.get());
    transferConfig.s3Client = s3Client;


    transferConfig.uploadProgressCallback =
    [](const Aws::Transfer::TransferManager*, const std::shared_ptr<const Aws::Transfer::TransferHandle>&transferHandle)
{ std::cout << "Upload Progress: " << transferHandle->GetBytesTransferred() << " of " << transferHandle->GetBytesTotalSize() << " bytes\n"; };

    static std::shared_ptr<Aws::Transfer::TransferManager> transferManager = Aws::Transfer::TransferManager::Create(transferConfig);

    Aws::String fileToUpload = "MyFile.data";
std::shared_ptr<Aws::Transfer::TransferHandle> transferHandle = transferManager->UploadFile(fileToUpload.c_str(), bucket.c_str(), fileToUpload.c_str(),
    "multipart/form-data", Aws::Map<Aws::String, Aws::String>());

    size_t retries = 0;
    transferHandle->WaitUntilFinished();
    while (transferHandle->GetStatus() == Aws::Transfer::TransferStatus::FAILED && retries++ < 5)
    {
        transferManager->RetryUpload(fileToUpload.c_str(), transferHandle);
        transferHandle->WaitUntilFinished();
    }
    transferHandle->SetIsMultipart(true);

    Aws::Transfer::PartStateMap completedParts = transferHandle->GetCompletedParts();
    string eTagList;

    for (const auto &p : completedParts)
    {
        std::cout << "completedparts[" << p.first << "]" << p.second->GetETag() << '\n';
    }

    Aws::Transfer::TransferStatus status = transferHandle->GetStatus();
    std::string res("Result:");
    res.append(std::to_string((int)status));

    std::cout << res.c_str() << std::endl;

    Aws::ShutdownAPI(options);
    return 0;
}

Этот код не работает.

error:no matching function for call to ‘Aws::S3::S3Client::S3Client(Aws::Client::ClientConfiguration&, bool)’

error in line: auto s3Client = Aws::MakeShared<Aws::S3Client>(ALLOCATION_TAG, config, false);

1 Ответ

0 голосов
/ 07 июня 2018

Используйте Transfer Manager .

И посмотрите на тесты для примера использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...