Kopiera en blob med asynkron schemaläggning med Java
Den här artikeln visar hur du kopierar en blob med asynkron schemaläggning med hjälp av Azure Storage-klientbiblioteket för Java. Du kan kopiera en blob från en källa inom samma lagringskonto, från en källa i ett annat lagringskonto eller från alla tillgängliga objekt som hämtas via HTTP GET-begäran på en viss URL. Du kan också avbryta en väntande kopieringsåtgärd.
De klientbiblioteksmetoder som beskrivs i den här artikeln använder åtgärden Kopiera BLOB REST API och kan användas när du vill utföra en kopia med asynkron schemaläggning. De flesta kopieringsscenarier där du vill flytta data till ett lagringskonto och ha en URL för källobjektet finns i Kopiera en blob från en källobjekt-URL med Java.
Förutsättningar
- Azure-prenumeration – skapa en kostnadsfritt
- Azure Storage-konto – skapa ett lagringskonto
- Java Development Kit (JDK) version 8 eller senare (vi rekommenderar version 17 för bästa möjliga upplevelse)
- Apache Maven används för projekthantering i det här exemplet
Konfigurera din miljö
Om du inte har ett befintligt projekt visar det här avsnittet hur du konfigurerar ett projekt för att arbeta med Azure Blob Storage-klientbiblioteket för Java. Mer information finns i Kom igång med Azure Blob Storage och Java.
Följ de här stegen för att konfigurera projektet om du vill arbeta med kodexemplen i den här artikeln.
Kommentar
Den här artikeln använder verktyget Maven-kompilering för att skapa och köra exempelkoden. Andra byggverktyg, till exempel Gradle, fungerar också med Azure SDK för Java.
Installera paket
pom.xml
Öppna filen i textredigeraren. Installera paketen genom att inkludera BOM-filen eller inkludera ett direkt beroende.
Lägga till importinstruktioner
Lägg till följande import
-uttryck:
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.*;
Auktorisering
Auktoriseringsmekanismen måste ha de behörigheter som krävs för att utföra en kopieringsåtgärd eller avbryta en väntande kopia. För auktorisering med Microsoft Entra-ID (rekommenderas) varierar den minst privilegierade inbyggda Azure RBAC-rollen baserat på flera faktorer. Mer information finns i auktoriseringsvägledningen för Copy Blob (REST API) eller Abort Copy Blob (REST API).
Skapa ett klientobjekt
Om du vill ansluta en app till Blob Storage skapar du en instans av BlobServiceClient.
I följande exempel används BlobServiceClientBuilder för att skapa ett BlobServiceClient
objekt med , DefaultAzureCredential
och visar hur du skapar container- och blobklienter om det behövs:
// 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>");
Mer information om hur du skapar och hanterar klientobjekt finns i Skapa och hantera klientobjekt som interagerar med dataresurser.
Om att kopiera blobar med asynkron schemaläggning
Åtgärden Copy Blob
kan slutföras asynkront och utförs på bästa sätt, vilket innebär att åtgärden inte garanteras starta omedelbart eller slutföras inom en angiven tidsram. Kopieringsåtgärden schemaläggs i bakgrunden och utförs eftersom servern har tillgängliga resurser. Åtgärden kan slutföras synkront om kopian sker inom samma lagringskonto.
En Copy Blob
åtgärd kan utföra någon av följande åtgärder:
- Kopiera en källblob till en målblob med ett annat namn. Målbloben kan vara en befintlig blob av samma blobtyp (block, tillägg eller sida) eller en ny blob som skapas av kopieringsåtgärden.
- Kopiera en källblob till en målblob med samma namn, vilket ersätter målbloben. Den här typen av kopieringsåtgärd tar bort alla icke-obligatoriska block och skriver över målblobens metadata.
- Kopiera en källfil i Azure File-tjänsten till en målblob. Målbloben kan vara en befintlig blockblob eller vara en ny blockblob som skapas av kopieringsåtgärden. Kopiering från filer till sidblobar eller tilläggsblobar stöds inte.
- Kopiera en ögonblicksbild över dess basblob. Genom att befordra en ögonblicksbild till basblobens position kan du återställa en tidigare version av en blob.
- Kopiera en ögonblicksbild till en målblob med ett annat namn. Den resulterande målbloben är en skrivbar blob och inte en ögonblicksbild.
Mer information om åtgärden, inklusive information om egenskaper, indextaggar, metadata och fakturering finns i Copy Blob
Kopiera blobkommentarer.
Kopiera en blob med asynkron schemaläggning
Det här avsnittet ger en översikt över metoder som tillhandahålls av Azure Storage-klientbiblioteket för Java för att utföra en kopieringsåtgärd med asynkron schemaläggning.
Följande metod omsluter REST API-åtgärden Kopiera blob och påbörjar en asynkron kopia av data från källbloben:
Metoden beginCopy
returnerar en SyncPoller för att avsöka förloppet för kopieringsåtgärden. Avsökningssvarstypen är BlobCopyInfo. Metoden beginCopy
används när du vill ha asynkron schemaläggning för en kopieringsåtgärd.
Kopiera en blob från en källa i Azure
Om du kopierar en blob i samma lagringskonto kan åtgärden slutföras synkront. Åtkomst till källbloben kan auktoriseras via Microsoft Entra-ID, en signatur för delad åtkomst (SAS) eller en kontonyckel. En alterativ synkron kopieringsåtgärd finns i Kopiera en blob från en url för källobjekt med Java.
Om kopieringskällan är en blob i ett annat lagringskonto kan åtgärden slutföras asynkront. Källbloben måste antingen vara offentlig eller auktoriserad via SAS-token. SAS-token måste innehålla behörigheten Läs ('r'). Mer information om SAS-token finns i Delegera åtkomst med signaturer för delad åtkomst.
I följande exempel visas ett scenario för att kopiera en källblob från ett annat lagringskonto med asynkron schemaläggning. I det här exemplet skapar vi en källblob-URL med en bifogad SAS-token för användardelegering. Exemplet visar hur du genererar SAS-token med hjälp av klientbiblioteket, men du kan också ange en egen. Exemplet visar också hur du lånar källbloben under kopieringsåtgärden för att förhindra ändringar i bloben från en annan klient. Åtgärden Copy Blob
sparar värdet för ETag
källbloben när kopieringsåtgärden startar. Om värdet ETag
ändras innan kopieringsåtgärden är klar misslyckas åtgärden.
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;
}
Kommentar
SAS-token för användardelegering ger större säkerhet eftersom de är signerade med Microsoft Entra-autentiseringsuppgifter i stället för en kontonyckel. För att skapa en SAS-token för användardelegering behöver Microsoft Entra-säkerhetsobjektet lämpliga behörigheter. Auktoriseringskrav finns i Hämta användardelegeringsnyckel.
Kopiera en blob från en källa utanför Azure
Du kan utföra en kopieringsåtgärd på alla källobjekt som kan hämtas via HTTP GET-begäran på en viss URL, inklusive tillgängliga objekt utanför Azure. I följande exempel visas ett scenario för att kopiera en blob från en URL för tillgängligt källobjekt.
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);
}
Kontrollera status för en kopieringsåtgärd
Om du vill kontrollera status för en Copy Blob
åtgärd kan du anropa getCopyStatus på BlobCopyInfo-objektet som returneras av SyncPoller
.
I följande kodexempel visas hur du kontrollerar status för en kopieringsåtgärd:
public void checkCopyStatus(BlobCopyInfo copyInfo) {
// Check the status of the copy operation
System.out.printf("Copy status", copyInfo.getCopyStatus());
}
Avbryt en kopieringsåtgärd
Om du avbryter en väntande Copy Blob
åtgärd resulterar det i en målblob med noll längd. Metadata för målbloben har dock de nya värdena kopierade från källbloben eller anges uttryckligen under kopieringsåtgärden. Om du vill behålla de ursprungliga metadata från före kopian skapar du en ögonblicksbild av målbloben innan du anropar någon av kopieringsmetoderna.
Om du vill avbryta en väntande kopieringsåtgärd anropar du följande metod:
Den här metoden omsluter rest-API-åtgärden Avbryt kopieringsblob , vilket avbryter en väntande Copy Blob
åtgärd. Följande kodexempel visar hur du avbryter en väntande Copy Blob
åtgärd:
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());
}
}
Resurser
Mer information om hur du kopierar blobar med hjälp av Azure Blob Storage-klientbiblioteket för Java finns i följande resurser.
Kodexempel
REST API-åtgärder
Azure SDK för Java innehåller bibliotek som bygger på Azure REST API, så att du kan interagera med REST API-åtgärder via välbekanta Java-paradigm. De klientbiblioteksmetoder som beskrivs i den här artikeln använder följande REST API-åtgärder:
- Kopiera blob (REST API)
- Avbryt kopieringsblob (REST API)
Klientbiblioteksresurser
Relaterat innehåll
- Den här artikeln är en del av utvecklarguiden för Blob Storage för Java. Mer information finns i den fullständiga listan över utvecklarguideartiklar i Skapa din Java-app.