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
- Azure-előfizetés – hozzon létre egyet ingyenesen
- Azure Storage-fiók – tárfiók létrehozása
- Java Development Kit (JDK) 8-es vagy újabb verzió (a legjobb élmény érdekében a 17-es verziót javasoljuk)
- Ebben a példában az Apache Maven a projektkezeléshez használatos
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 DefaultAzureCredential
hoz 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:
Ügyfélkódtár erőforrásai
Kapcsolódó tartalom
- Ez a cikk a Java Blob Storage fejlesztői útmutatójának része. További információkért tekintse meg a Java-alkalmazás buildeléséhez kapcsolódó fejlesztői útmutatók teljes listáját.