Megosztás a következőn keresztül:


Blob másolása aszinkron ütemezéssel Java használatával

Ez a cikk bemutatja, hogyan másolhat egy blobot aszinkron ütemezéssel a Java-hoz készült Azure Storage-ügyfélkódtár használatával. Egy blobot másolhat egy forrásból ugyanabban a tárfiókban, egy másik tárfiókban lévő forrásból, vagy bármely akadálymentes objektumból, amely egy adott URL-címen http GET kéréssel kérhető le. A függőben lévő másolási műveletet is megszakíthatja.

A cikkben tárgyalt ügyfélkódtár-metódusok a Blob REST API másolása műveletet használják, és akkor használhatók, ha aszinkron ütemezéssel szeretne másolatot készíteni. A legtöbb olyan másolási forgatókönyv esetében, ahol adatokat szeretne áthelyezni egy tárfiókba, és rendelkezik a forrásobjektum URL-címével, olvassa el a Blob másolása forrásobjektum URL-címéről Java-val című témakört.

Előfeltételek

Saját környezet beállítása

Ha nem rendelkezik meglévő projekttel, ez a szakasz bemutatja, hogyan állíthat be egy projektet a Java Azure Blob Storage ügyfélkódtárával való együttműködésre. További információ: Az Azure Blob Storage és a Java használatának első lépései.

A jelen cikkben szereplő példakódok használatához kövesse az alábbi lépéseket a projekt beállításához.

Feljegyzés

Ez a cikk a Maven buildelési eszközével hozza létre és futtatja a példakódot. Más buildelési eszközök, például a Gradle is együttműködnek a Java Azure SDK-val.

Csomagok telepítése

Nyissa meg a pom.xml fájlt a szövegszerkesztőben. Telepítse a csomagokat a BOM-fájllal, vagy egy közvetlen függőséget is beleértve.

Importálási utasítások hozzáadása

Adja hozzá a következő import-utasításokat:

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.*;

Engedélyezés

Az engedélyezési mechanizmusnak rendelkeznie kell a másolási művelet végrehajtásához vagy a függőben lévő másolat megszakításához szükséges engedélyekkel. A Microsoft Entra-azonosítóval való engedélyezéshez (ajánlott) a legkevésbé kiemelt Azure RBAC beépített szerepkör több tényezőtől függően változik. További információért tekintse meg a Blob másolása (REST API) vagy a Blob másolásának megszakítása (REST API) engedélyezési útmutatóját.

Ügyfélobjektum létrehozása

Ha egy alkalmazást a Blob Storage-hoz szeretne csatlakoztatni, hozzon létre egy BlobServiceClient-példányt.

Az alábbi példa a BlobServiceClientBuilder használatával DefaultAzureCredentialhoz létre objektumotBlobServiceClient, és bemutatja, hogyan hozhat létre tároló- és blobügyfeleket, ha szükséges:

// 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>");

Az ügyfélobjektumok létrehozásáról és kezeléséről további információt az adaterőforrásokat kezelő ügyfélobjektumok létrehozása és kezelése című témakörben talál.

Blobok aszinkron ütemezéssel történő másolása

A Copy Blob művelet aszinkron módon fejeződhet be, és a legjobb munkamennyiség alapján hajtható végre, ami azt jelenti, hogy a művelet nem garantáltan azonnal indul el vagy fejeződik be egy megadott időkereten belül. A másolási művelet a háttérben van ütemezve, és a kiszolgáló rendelkezésre álló erőforrásokkal rendelkezik. A művelet szinkron módon is befejeződhet, ha a másolat ugyanabban a tárfiókban történik.

A Copy Blob művelet a következő műveletek bármelyikét hajthatja végre:

  • Másolja a forrásblobot egy másik nevű célblobba. A célblob lehet ugyanahhoz a blobtípushoz tartozó meglévő blob (blokk, hozzáfűzés vagy oldal), vagy lehet a másolási művelet által létrehozott új blob.
  • Másolja a forrásblobot egy célblobba ugyanazzal a névvel, amely a célblobot helyettesíti. Ez a másolási művelet eltávolítja a nem véglegesített blokkokat, és felülírja a cél blob metaadatait.
  • Másolja a forrásfájlt az Azure File service-ben egy célblobba. A célblob lehet meglévő blokkblob, vagy a másolási művelet által létrehozott új blokkblob. A fájlokról lapblobok vagy hozzáfűző blobok másolása nem támogatott.
  • Pillanatkép másolása az alapblobra. Ha előléptet egy pillanatképet az alapblob helyére, visszaállíthatja a blob egy korábbi verzióját.
  • Pillanatkép másolása másik nevű célblobba. Az eredményként kapott célblob egy írható blob, és nem pillanatkép.

Ha többet szeretne megtudni a műveletről, beleértve a Copy Blob tulajdonságokra, indexcímkékre, metaadatokra és számlázásra vonatkozó információkat, olvassa el a Blob-megjegyzések másolása című témakört.

Blob másolása aszinkron ütemezéssel

Ez a szakasz áttekintést nyújt a Java-hoz készült Azure Storage ügyfélkódtár által a másolási művelet aszinkron ütemezéssel történő végrehajtásához biztosított módszerekről.

A következő metódus körbefuttatja a Blob REST API másolása műveletet, és elindítja az adatok aszinkron másolatát a forrásblobból:

A beginCopy metódus egy SyncPollert ad vissza a másolási művelet előrehaladásának lekérdezéséhez. A lekérdezési válasz típusa BlobCopyInfo. A beginCopy metódus akkor használatos, ha a másolási művelet aszinkron ütemezését szeretné használni.

Blob másolása egy Azure-beli forrásból

Ha egy blobot másol ugyanabban a tárfiókban, a művelet szinkron módon is befejeződhet. A forrásblobhoz való hozzáférés a Microsoft Entra-azonosítón, a közös hozzáférésű jogosultságkódon (SAS) vagy egy fiókkulcson keresztül engedélyezhető. Váltakozó szinkron másolási művelet esetén lásd : Blob másolása forrásobjektum URL-címéről Java-val.

Ha a másolási forrás egy másik tárfiókban lévő blob, a művelet aszinkron módon fejeződhet be. A forrásblobnak nyilvánosnak vagy SAS-jogkivonaton keresztül engedélyezettnek kell lennie. Az SAS-jogkivonatnak tartalmaznia kell az olvasási ('r') engedélyt. Az SAS-jogkivonatokról további információt a Megosztott hozzáférésű jogosultságkódokkal rendelkező hozzáférés delegálása című témakörben talál.

Az alábbi példa egy másik tárfiókból származó forrásblob aszinkron ütemezéssel történő másolásának forgatókönyvét mutatja be. Ebben a példában létrehozunk egy forrás blob URL-címet egy hozzáfűzött felhasználódelegálási SAS-jogkivonattal. A példa bemutatja, hogyan hozhatja létre az SAS-jogkivonatot az ügyfélkódtár használatával, de sajátot is megadhat. A példa azt is bemutatja, hogyan adhatja bérbe a forrásblobot a másolási művelet során, hogy megakadályozza a blob módosítását egy másik ügyféltől. A Copy Blob művelet a másolási művelet indításakor menti ETag a forrásblob értékét. Ha az ETag érték a másolási művelet befejeződése előtt módosul, a művelet meghiúsul.

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;
}

Feljegyzés

A felhasználói delegálási SAS-jogkivonatok nagyobb biztonságot nyújtanak, mivel fiókkulcs helyett Microsoft Entra hitelesítő adatokkal vannak aláírva. Felhasználói delegálási SAS-jogkivonat létrehozásához a Microsoft Entra biztonsági tagnak megfelelő engedélyekre van szüksége. Az engedélyezési követelményekkel kapcsolatban lásd: Felhasználódelegálási kulcs lekérése.

Blob másolása az Azure-on kívüli forrásból

Másolási műveletet bármely olyan forrásobjektumon végrehajthat, amely http GET kéréssel kérhető le egy adott URL-címen, beleértve az Azure-on kívüli akadálymentes objektumokat is. Az alábbi példa egy blob akadálymentes forrásobjektum URL-címéről történő másolásának forgatókönyvét mutatja be.

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);
}

Másolási művelet állapotának ellenőrzése

A Copy Blob művelet állapotának ellenőrzéséhez meghívhatja a getCopyStatus parancsot a BlobCopyInfo objektum által visszaadott SyncPoller.

Az alábbi példakód bemutatja, hogyan ellenőrizheti a másolási művelet állapotát:

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

Másolási művelet megszakítása

A függőben lévő Copy Blob művelet megszakítása nulla hosszúságú célblobot eredményez. A célblob metaadatai azonban a forrásblobból másolt vagy explicit módon beállított új értékeket tartalmaznak a másolási művelet során. Az eredeti metaadatok másolás előtti megőrzéséhez készítsen pillanatképet a célblobról, mielőtt meghívja az egyik másolási metódust.

Függőben lévő másolási művelet megszakításához hívja meg a következő metódust:

Ez a metódus körbefuttatja a Blob REST API megszakítása műveletet, amely megszakít egy függőben lévő Copy Blob műveletet. Az alábbi példakód bemutatja, hogyan szakíthat meg függőben lévő Copy Blob műveletet:

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());
    }
}

Források

Ha többet szeretne megtudni a blobok másolásáról a Java-hoz készült Azure Blob Storage ügyfélkódtár használatával, tekintse meg az alábbi erőforrásokat.

Kódminták

REST API-műveletek

Az Azure SDK for Java olyan kódtárakat tartalmaz, amelyek az Azure REST API-ra épülnek, lehetővé téve a REST API-műveletek használatát ismert Java-paradigmákon keresztül. A cikkben tárgyalt ügyfélkódtár-metódusok a következő REST API-műveleteket használják:

  • Blob másolása (REST API)
  • Blob másolásának megszakítása (REST API)

Ügyfélkódtár erőforrásai