Copia un blob con programación asincrónica mediante Java
En este artículo se muestra cómo copiar un blob con programación asincrónica mediante la biblioteca cliente de Azure Storage para Java. Puede copiar un blob desde un origen dentro de la misma cuenta de almacenamiento, desde un origen en una cuenta de almacenamiento diferente o desde cualquier objeto accesible recuperado a través de una solicitud HTTP GET en una dirección URL determinada. También puede anular una operación de copia pendiente.
Los métodos de la biblioteca cliente descritos en este artículo usan la operación de la API de REST Copiar blob y se pueden usar cuando desee realizar una copia con programación asincrónica. Para la mayoría de los escenarios de copia en los que desea mover datos a una cuenta de almacenamiento y tener una dirección URL para el objeto de origen, consulte Copiar un blob desde una dirección URL de objeto de origen con Java.
Requisitos previos
- Una suscripción a Azure: cree una cuenta gratuita
- Una cuenta de Azure Storage: cree una cuenta de almacenamiento
- Kit de desarrollo de Java (JDK) versión 8 o posterior (se recomienda la versión 17 para obtener la mejor experiencia)
- Apache Maven se usa para la administración de proyectos en este ejemplo.
Configurar el entorno
Si no tiene un proyecto existente, en esta sección, se muestra cómo configurar un proyecto para que funcione con la biblioteca cliente de Azure Blob Storage para Java. Para más información, consulte Introducción a Azure Blob Storage y Java.
Para trabajar con los ejemplos de código de este artículo, siga los pasos siguientes a fin de configurar el proyecto.
Nota:
En este artículo, se usa la herramienta de compilación de Maven para compilar y ejecutar el código de ejemplo. Otras herramientas de compilación, como Gradle, también funcionan con Azure SDK para Java.
Instalar paquetes
Abra el archivo pom.xml
en el editor de texto. Instale los paquetes mediante la inclusión del archivo BOM o la inclusión de una dependencia directa.
Adición de instrucciones import
Agregue las instrucciones siguientes import
:
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.*;
Authorization
El mecanismo de autorización debe tener los permisos necesarios para realizar una operación de copia, o para abortar una copia pendiente. Para la autorización con Microsoft Entra ID (recomendada), la función integrada Azure RBAC con menos privilegios varía en función de varios factores. Para obtener más información, consulte la guía de autorización de Blob de concesión (API de REST).
Creación de un objeto de cliente
Para conectar una aplicación a Blob Storage, cree una instancia de BlobServiceClient.
En el ejemplo siguiente, se usa BlobServiceClientBuilder para crear un objeto BlobServiceClient
mediante DefaultAzureCredential
, y se muestra cómo crear clientes de contenedores y blobs, si es necesario:
// 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>");
Para obtener más información sobre cómo crear y administrar objetos de cliente, consulte Crear y administrar objetos de cliente que interactúan con los recursos de datos.
Acerca de la copia de blobs con programación asincrónica
La operación Copy Blob
puede finalizar de forma asincrónica y se realiza en función del mejor esfuerzo, lo que significa que no se garantiza que la operación se inicie inmediatamente o se complete dentro de un período de tiempo especificado. La operación de copia se programa en segundo plano y se realiza cuando el servidor tiene recursos disponibles. La operación se puede completar sincrónicamente si la copia se produce dentro de la misma cuenta de almacenamiento.
Una operación Copy Blob
puede realizar cualquiera de las siguientes acciones:
- Copie un blob de origen en un blob de destino con un nombre diferente. El blob de destino puede ser un blob existente del mismo tipo de blob (en bloques, anexos o en páginas), o puede ser un nuevo blob creado por la operación de copia.
- Copie un blob de origen en un blob de destino con el mismo nombre, lo que reemplaza el blob de destino. Este tipo de operación de copia quita los bloques sin confirmar y sobrescribe los metadatos del blob de destino.
- Copie un archivo de origen del servicio Azure File en un blob de destino. El blob de destino puede ser un blob en bloques existente o un nuevo blob de ese tipo creado por la operación de copia. No se admite la copia de archivos a blobs en páginas o blobs en anexos.
- Copie una instantánea sobre su blob base. Si se mueve una instantánea a la posición del blob, puede restaurar una versión anterior de un blob.
- Copie una instantánea en un blob de destino con otro nombre. El blob resultante de destino es un blob en el que se puede escribir y no una instantánea.
Para obtener más información sobre la operación Copy Blob
, incluida la información sobre las propiedades, las etiquetas de índice, los metadatos y la facturación, consulte Comentarios sobre la copia de blobs.
Copiar un blob con programación asincrónica
En esta sección se proporciona información general sobre los métodos proporcionados por la biblioteca cliente de Azure Storage para Java para realizar una operación de copia con programación asincrónica.
El siguiente método encapsula la operación Copiar blob de API de REST, e inicia una copia asíncrona de datos desde el blob de origen:
El método beginCopy
devuelve un SyncPoller para sondear el progreso de la operación de copia. El tipo de respuesta del sondeo es BlobCopyInfo. El método beginCopy
se usa cuando se desea una programación asincrónica para una operación de copia.
Copiar un blob desde un origen dentro de Azure
Si va a copiar un blob dentro de la misma cuenta de almacenamiento, la operación se puede completar de forma sincrónica. El acceso al blob de origen se puede autorizar mediante Microsoft Entra ID, una firma de acceso compartido (SAS) o una clave de cuenta. Para obtener una operación de copia sincrónica alterativa, consulte Copiar un blob desde una dirección URL de objeto de origen con Java.
Si el origen de copia es un blob en otra cuenta de almacenamiento, la operación se puede completar de forma asincrónica. El blob de origen debe ser público o autorizado a través del token de SAS. El token de SAS debe incluir el permiso Lectura (“r”). Para más información sobre los tokens de SAS, consulte Delegación del acceso con firmas de acceso compartido.
En el ejemplo siguiente se muestra un escenario para copiar un blob de origen desde otra cuenta de almacenamiento con programación asincrónica. En este ejemplo, se crea una dirección URL de blob de origen con un token de SAS de delegación de usuarios anexado. En el ejemplo se muestra cómo generar el token de SAS mediante la biblioteca cliente, aunque también puede proporcionar el suyo propio. En este ejemplo también se muestra cómo conceder el blob de origen durante la operación de copia para evitar cambios en el blob desde un cliente diferente. La operación Copy Blob
guarda el valor ETag
del blob de origen cuando se inicia la operación de copia. Si el valor ETag
se cambia antes de que finalice la operación de copia, se produce un error en la operación.
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;
}
Nota:
Los tokens de SAS de delegación de usuarios ofrecen mayor seguridad, ya que se firman con credenciales de Microsoft Entra en lugar de con una clave de cuenta. Para crear un token de SAS de delegación de usuarios, la entidad de seguridad de Microsoft Entra necesita los permisos adecuados. Para conocer los requisitos de autorización, consulte Obtención de la clave de delegación de usuarios.
Copiar un blob desde un origen externo a Azure
Puede realizar una operación de copia en cualquier objeto de origen que se pueda recuperar a través de solicitudes HTTP GET en una dirección URL determinada, incluyendo los objetos accesibles de fuera de Azure. En el ejemplo siguiente se muestra un escenario para copiar un blob desde una dirección URL de objeto de origen accesible.
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);
}
Comprobación del estado de una operación de copia
Para comprobar el estado de una operación Copy Blob
, puede llamar a getCopyStatus en el objeto BlobCopyInfo devuelto por SyncPoller
.
El siguiente ejemplo de código muestra cómo comprobar el estado de una operación de copia:
public void checkCopyStatus(BlobCopyInfo copyInfo) {
// Check the status of the copy operation
System.out.printf("Copy status", copyInfo.getCopyStatus());
}
Anulación de una operación de copia
La anulación de una operación Copy Blob
pendiente da como resultado un blob de destino de longitud cero. Sin embargo, los nuevos valores de los metadatos del blob de destino se copian del blob de origen o se establecen explícitamente durante la operación de copia. Para conservar los metadatos originales anteriores a la copia, cree una instantánea del blob de destino antes de llamar a uno de los métodos de copia.
Para anular una operación de copia pendiente, llame al siguiente método:
Estos métodos encapsulan la operación de la API de RESTAnular copia de blob, que cancela una operación Copy Blob
pendiente. El siguiente ejemplo de código muestra cómo anular una operación Copy Blob
pendiente:
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());
}
}
Recursos
Para obtener más información sobre cómo copiar blobs usando la biblioteca cliente de Azure Blob Storage para Java, consulte los siguientes recursos.
Ejemplos de código
Operaciones de API REST
El SDK de Azure para Java contiene bibliotecas que se crean a partir de la API REST de Azure, lo que le permite interactuar con las operaciones de API REST a través de paradigmas conocidos de Java. Los métodos de biblioteca cliente descritos en este artículo usan las siguientes operaciones de la API de REST:
- Blob de copia (API de REST)
- Anular blob de copia (API de REST)
Recursos de la biblioteca cliente
- Documentación de referencia de la biblioteca cliente
- Código fuente de la biblioteca del cliente
- Paquete (Maven)
Contenido relacionado
- Este artículo forma parte de la guía para desarrolladores de Blob Storage para Java. Para más información, consulte la lista completa de artículos de la guía para desarrolladores en Compilación de la aplicación Java.