Delen via


Een blob kopiëren met asynchrone planning met behulp van Java

In dit artikel wordt beschreven hoe u een blob kopieert met asynchrone planning met behulp van de Azure Storage-clientbibliotheek voor Java. U kunt een blob kopiëren vanuit een bron binnen hetzelfde opslagaccount, van een bron in een ander opslagaccount of van een toegankelijk object dat via een HTTP GET-aanvraag op een bepaalde URL wordt opgehaald. U kunt ook een in behandeling zijnde kopieerbewerking afbreken.

De clientbibliotheekmethoden die in dit artikel worden behandeld, maken gebruik van de bewerking Blob REST API kopiëren en kunnen worden gebruikt wanneer u een kopie wilt uitvoeren met asynchrone planning. Voor de meeste kopieerscenario's waarin u gegevens naar een opslagaccount wilt verplaatsen en een URL voor het bronobject wilt hebben, raadpleegt u Een blob kopiëren van een bronobject-URL met Java.

Vereisten

Uw omgeving instellen

Als u geen bestaand project hebt, ziet u in deze sectie hoe u een project instelt voor gebruik met de Azure Blob Storage-clientbibliotheek voor Java. Zie Aan de slag met Azure Blob Storage en Java voor meer informatie.

Als u wilt werken met de codevoorbeelden in dit artikel, volgt u deze stappen om uw project in te stellen.

Notitie

In dit artikel wordt het Maven-buildhulpprogramma gebruikt om de voorbeeldcode te bouwen en uit te voeren. Andere buildhulpprogramma's, zoals Gradle, werken ook met de Azure SDK voor Java.

Pakketten installeren

Open het pom.xml bestand in de teksteditor. Installeer de pakketten door het BOM-bestand op te slaan of door een directe afhankelijkheid op te slaan.

Importinstructies toevoegen

Voeg de volgende import instructies toe:

import com.azure.core.util.polling.*;
import com.azure.storage.blob.*;
import com.azure.storage.blob.models.*;
import com.azure.storage.blob.options.*;
import com.azure.storage.blob.sas.BlobSasPermission;
import com.azure.storage.blob.sas.BlobServiceSasSignatureValues;
import com.azure.storage.blob.specialized.*;

import java.time.*;
import java.util.*;

Autorisatie

Het autorisatiemechanisme moet over de benodigde machtigingen beschikken om een kopieerbewerking uit te voeren of om een in behandeling zijnde kopie af te breken. Voor autorisatie met Microsoft Entra ID (aanbevolen), varieert de ingebouwde rol van Azure RBAC met minimale bevoegdheden op basis van verschillende factoren. Zie de autorisatierichtlijnen voor Copy Blob (REST API) of Abort Copy Blob (REST API) voor meer informatie.

Een clientobject maken

Als u een app wilt verbinden met Blob Storage, maakt u een exemplaar van BlobServiceClient.

In het volgende voorbeeld wordt BlobServiceClientBuilder gebruikt om een BlobServiceClient object te bouwen met behulp vanDefaultAzureCredential, en ziet u hoe u indien nodig container- en blobclients maakt:

// Azure SDK client builders accept the credential as a parameter
// TODO: Replace <storage-account-name> with your actual storage account name
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
        .endpoint("https://<storage-account-name>.blob.core.windows.net/")
        .credential(new DefaultAzureCredentialBuilder().build())
        .buildClient();

// If needed, you can create a BlobContainerClient object from the BlobServiceClient
BlobContainerClient containerClient = blobServiceClient
        .getBlobContainerClient("<container-name>");

// If needed, you can create a BlobClient object from the BlobContainerClient
BlobClient blobClient = containerClient
        .getBlobClient("<blob-name>");

Zie Clientobjecten maken en beheren die interactie hebben met gegevensbronnen voor meer informatie over het maken en beheren van clientobjecten.

Over het kopiëren van blobs met asynchrone planning

De Copy Blob bewerking kan asynchroon worden voltooid en wordt uitgevoerd op basis van best effort, wat betekent dat de bewerking niet gegarandeerd onmiddellijk of binnen een opgegeven tijdsbestek wordt gestart of voltooid. De kopieerbewerking wordt op de achtergrond gepland en uitgevoerd als de server beschikbare resources heeft. De bewerking kan synchroon worden voltooid als de kopie plaatsvindt binnen hetzelfde opslagaccount.

Een Copy Blob bewerking kan een van de volgende acties uitvoeren:

  • Kopieer een bron-blob naar een doel-blob met een andere naam. De doel-blob kan een bestaande blob zijn van hetzelfde blobtype (blok, toevoeg of pagina), of kan een nieuwe blob zijn die is gemaakt door de kopieerbewerking.
  • Kopieer een bron-blob naar een doel-blob met dezelfde naam, waardoor de doel-blob wordt vervangen. Met dit type kopieerbewerking worden eventuele niet-doorgevoerde blokken verwijderd en worden de metagegevens van de doel-blob overschreven.
  • Kopieer een bronbestand in de Azure File-service naar een doel-blob. De doel-blob kan een bestaande blok-blob zijn of kan een nieuwe blok-blob zijn die is gemaakt door de kopieerbewerking. Kopiëren van bestanden naar pagina-blobs of toevoeg-blobs wordt niet ondersteund.
  • Kopieer een momentopname over de basis-blob. Door een momentopname te promoveren naar de positie van de basis-blob, kunt u een eerdere versie van een blob herstellen.
  • Kopieer een momentopname naar een doel-blob met een andere naam. De resulterende doel-blob is een beschrijfbare blob en geen momentopname.

Zie Blob-opmerkingen kopiëren voor meer informatie over de Copy Blob bewerking, waaronder informatie over eigenschappen, indextags, metagegevens en facturering.

Een blob kopiëren met asynchrone planning

In deze sectie vindt u een overzicht van methoden die door de Azure Storage-clientbibliotheek voor Java worden geboden om een kopieerbewerking uit te voeren met asynchrone planning.

Met de volgende methode wordt de rest API-bewerking voor kopiëren blob verpakt en wordt een asynchrone kopie van gegevens uit de bron-blob gestart:

De beginCopy methode retourneert een SyncPoller om de voortgang van de kopieerbewerking te peilen. Het antwoordtype poll is BlobCopyInfo. De beginCopy methode wordt gebruikt wanneer u asynchrone planning voor een kopieerbewerking wilt.

Een blob kopiëren vanuit een bron in Azure

Als u een blob in hetzelfde opslagaccount kopieert, kan de bewerking synchroon worden voltooid. Toegang tot de bron-blob kan worden geautoriseerd via Microsoft Entra ID, een Shared Access Signature (SAS) of een accountsleutel. Zie Een blob kopiëren van een bronobject-URL met Java voor een afwisselende synchrone kopieerbewerking.

Als de kopieerbron een blob in een ander opslagaccount is, kan de bewerking asynchroon worden voltooid. De bron-blob moet openbaar of geautoriseerd zijn via een SAS-token. Het SAS-token moet de machtiging Lezen ('r') bevatten. Zie Toegang delegeren met handtekeningen voor gedeelde toegang voor meer informatie over SAS-tokens.

In het volgende voorbeeld ziet u een scenario voor het kopiëren van een bronblob uit een ander opslagaccount met asynchrone planning. In dit voorbeeld maken we een bron-blob-URL met een toegevoegd SAS-token voor gebruikersdelegering. In het voorbeeld ziet u hoe u het SAS-token genereert met behulp van de clientbibliotheek, maar u kunt ook uw eigen token opgeven. In het voorbeeld ziet u ook hoe u de bron-blob tijdens de kopieerbewerking kunt leasen om wijzigingen in de blob van een andere client te voorkomen. Met Copy Blob de bewerking wordt de ETag waarde van de bron-blob opgeslagen wanneer de kopieerbewerking wordt gestart. Als de ETag waarde wordt gewijzigd voordat de kopieerbewerking is voltooid, mislukt de bewerking.

public void copyBlobAcrossStorageAccounts(BlobClient sourceBlob, BlockBlobClient destinationBlob) {
    // Lease the source blob during copy to prevent other clients from modifying it
    BlobLeaseClient lease = new BlobLeaseClientBuilder()
            .blobClient(sourceBlob)
            .buildClient();

    // Create a SAS token for the source blob or use an existing one
    String sasToken = generateUserDelegationSAS(
            sourceBlob.getContainerClient().getServiceClient(),
            sourceBlob);

    // Get the source blob URL and append the SAS token
    String sourceBlobSasURL = sourceBlob.getBlobUrl() + "?" + sasToken;

    try {
        // Specifying -1 creates an infinite lease
        lease.acquireLease(-1);

        // Start the copy operation and wait for it to complete
        final SyncPoller<BlobCopyInfo, Void> poller = destinationBlob.beginCopy(
                sourceBlobSasURL,
                Duration.ofSeconds(2));
        PollResponse<BlobCopyInfo> response = poller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED);
    } finally {
        // Release the lease once the copy operation completes
        lease.releaseLease();
    }
}

public String generateUserDelegationSAS(BlobServiceClient blobServiceClient, BlobClient sourceBlob) {
    // Get a user delegation key
    OffsetDateTime delegationKeyStartTime = OffsetDateTime.now();
    OffsetDateTime delegationKeyExpiryTime = OffsetDateTime.now().plusDays(1);
    UserDelegationKey key = blobServiceClient.getUserDelegationKey(
        delegationKeyStartTime,
        delegationKeyExpiryTime);

    // Create a SAS token that's valid for one day, as an example
    OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);

    // Set the Read (r) permission on the SAS token
    BlobSasPermission permission = new BlobSasPermission().setReadPermission(true);

    BlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiryTime, permission)
            .setStartTime(OffsetDateTime.now());

    // Create a SAS token that's valid for one day
    String sasToken = sourceBlob.generateUserDelegationSas(sasValues, key);

    return sasToken;
}

Notitie

SAS-tokens voor gebruikersdelegatie bieden meer beveiliging, omdat ze zijn ondertekend met Microsoft Entra-referenties in plaats van een accountsleutel. Voor het maken van een SAS-token voor gebruikersdelegering heeft de Microsoft Entra-beveiligingsprincipaal de juiste machtigingen nodig. Zie Sleutel voor gebruikersdelegering ophalen voor autorisatievereisten.

Een blob kopiëren van een bron buiten Azure

U kunt een kopieerbewerking uitvoeren op elk bronobject dat kan worden opgehaald via een HTTP GET-aanvraag op een bepaalde URL, inclusief toegankelijke objecten buiten Azure. In het volgende voorbeeld ziet u een scenario voor het kopiëren van een blob vanuit een toegankelijke bronobject-URL.

public void copyFromExternalSourceAsyncScheduling(String sourceURL, BlockBlobClient destinationBlob) {
    // Start the copy operation and wait for it to complete
    final SyncPoller<BlobCopyInfo, Void> poller = destinationBlob.beginCopy(
            sourceURL,
            Duration.ofSeconds(2));
    PollResponse<BlobCopyInfo> response = poller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED);
}

De status van een kopieerbewerking controleren

Als u de status van een Copy Blob bewerking wilt controleren, kunt u getCopyStatus aanroepen op het BlobCopyInfo-object dat wordt geretourneerd door SyncPoller.

In het volgende codevoorbeeld ziet u hoe u de status van een kopieerbewerking kunt controleren:

public void checkCopyStatus(BlobCopyInfo copyInfo) {
    // Check the status of the copy operation 
    System.out.printf("Copy status", copyInfo.getCopyStatus());
}

Een kopieerbewerking afbreken

Het afbreken van een in behandeling zijnde Copy Blob bewerking resulteert in een doel-blob met een lengte van nul. De metagegevens voor de doel-blob bevatten echter de nieuwe waarden die uit de bron-blob zijn gekopieerd of expliciet zijn ingesteld tijdens de kopieerbewerking. Als u de oorspronkelijke metagegevens van vóór de kopie wilt bewaren, maakt u een momentopname van de doel-blob voordat u een van de kopieermethoden aanroept.

Als u een kopieerbewerking in behandeling wilt afbreken, roept u de volgende methode aan:

Met deze methode wordt de bewerking Abort Copy Blob REST API verpakt, waardoor een bewerking in behandeling Copy Blob wordt geannuleerd. In het volgende codevoorbeeld ziet u hoe u een bewerking in behandeling Copy Blob kunt afbreken:

public void abortCopy(BlobCopyInfo copyInfo, BlobClient destinationBlob) {
    // Check the copy status and abort if pending
    if (copyInfo.getCopyStatus() == CopyStatusType.PENDING) {
        destinationBlob.abortCopyFromUrl(copyInfo.getCopyId());
        System.out.printf("Copy operation %s has been aborted%n", copyInfo.getCopyId());
    }
}

Resources

Zie de volgende resources voor meer informatie over het kopiëren van blobs met behulp van de Azure Blob Storage-clientbibliotheek voor Java.

Codevoorbeelden

REST API-bewerkingen

De Azure SDK voor Java bevat bibliotheken die zijn gebaseerd op de Azure REST API, zodat u kunt communiceren met REST API-bewerkingen via bekende Java-paradigma's. De clientbibliotheekmethoden die in dit artikel worden behandeld, gebruiken de volgende REST API-bewerkingen:

  • Blob kopiëren (REST API)
  • Blob kopiëren afbreken (REST API)

Clientbibliotheekbronnen

  • Dit artikel maakt deel uit van de ontwikkelaarshandleiding voor Blob Storage voor Java. Zie de volledige lijst met artikelen over ontwikkelaarshandleidingen in Uw Java-app bouwen voor meer informatie.