Aracılığıyla paylaş


Java kullanarak zaman uyumsuz zamanlamayla blob kopyalama

Bu makalede, Java için Azure Depolama istemci kitaplığını kullanarak zaman uyumsuz zamanlamayla bir blobu kopyalama işlemi gösterilmektedir. Blobu aynı depolama hesabındaki bir kaynaktan, farklı bir depolama hesabındaki bir kaynaktan veya belirli bir URL'deki HTTP GET isteği aracılığıyla alınan erişilebilir nesnelerden kopyalayabilirsiniz. Bekleyen kopyalama işlemini de durdurabilirsiniz.

Bu makalede ele alınan istemci kitaplığı yöntemleri, Blob REST API'sini Kopyalama işlemini kullanır ve zaman uyumsuz zamanlamayla bir kopyalama gerçekleştirmek istediğinizde kullanılabilir. Verileri depolama hesabına taşımak istediğiniz ve kaynak nesnenin URL'sine sahip olmak istediğiniz çoğu kopyalama senaryosu için bkz . Java ile kaynak nesne URL'sinden blob kopyalama.

Ön koşullar

  • Bu makalede, Java için Azure Blob Depolama istemci kitaplığıyla çalışmak üzere ayarlanmış bir projeniz olduğu varsayılır. Paket yükleme, yönergeler ekleme import ve yetkili istemci nesnesi oluşturma dahil olmak üzere projenizi ayarlama hakkında bilgi edinmek için bkz. Azure Depolama ve Java ile Çalışmaya Başlama.
  • Yetkilendirme mekanizmasının kopyalama işlemi gerçekleştirme veya bekleyen bir kopyayı durdurma izinleri olmalıdır. Daha fazla bilgi edinmek için aşağıdaki REST API işlemleri için yetkilendirme kılavuzuna bakın:

Zaman uyumsuz zamanlamayla blobları kopyalama hakkında

İşlem Copy Blob zaman uyumsuz olarak tamamlanabilir ve en iyi çaba temelinde gerçekleştirilir. Bu, işlemin belirtilen zaman çerçevesi içinde hemen başlatılması veya tamamlanmasının garanti olmadığı anlamına gelir. Kopyalama işlemi arka planda zamanlanır ve sunucuda kullanılabilir kaynaklar olduğundan gerçekleştirilir. Kopyalama aynı depolama hesabında gerçekleşirse işlem zaman uyumlu olarak tamamlanabilir.

Bir Copy Blob işlem aşağıdaki eylemlerden herhangi birini gerçekleştirebilir:

  • Kaynak blobu farklı bir adla hedef bloba kopyalayın. Hedef blob aynı blob türünde (blok, ekleme veya sayfa) var olan bir blob olabileceği gibi, kopyalama işlemi tarafından oluşturulan yeni bir blob da olabilir.
  • Kaynak blobu hedef blob yerine aynı ada sahip bir hedef bloba kopyalayın. Bu tür kopyalama işlemi, kaydedilmemiş blokları kaldırır ve hedef blobun meta verilerinin üzerine yazar.
  • Azure Dosya hizmetindeki bir kaynak dosyayı hedef bloba kopyalayın. Hedef blob mevcut bir blok blobu veya kopyalama işlemi tarafından oluşturulan yeni bir blok blobu olabilir. Dosyalardan sayfa bloblarına veya ekleme bloblarına kopyalama desteklenmez.
  • Bir anlık görüntüyü temel blobu üzerinden kopyalayın. Anlık görüntüyü temel blobun konumuna yükseltme yoluyla blobun önceki bir sürümünü geri yükleyebilirsiniz.
  • Bir anlık görüntüyü farklı bir adla hedef bloba kopyalayın. Sonuçta elde edilen hedef blob, anlık görüntü değil yazılabilir bir blobdur.

Özellikler, dizin etiketleri, meta veriler ve faturalama gibi işlemler hakkında Copy Blob daha fazla bilgi edinmek için bkz . Blob açıklamalarını kopyalama.

Zaman uyumsuz zamanlamayla blob kopyalama

Bu bölümde, zaman uyumsuz zamanlamayla kopyalama işlemi gerçekleştirmek üzere Java için Azure Depolama istemci kitaplığı tarafından sağlanan yöntemlere genel bir bakış sunulmaktadır.

Aşağıdaki yöntem, Blobu Kopyalama REST API'sini sarmalar ve kaynak blobdan zaman uyumsuz bir veri kopyası başlatır:

yöntemi, beginCopy kopyalama işleminin ilerleme durumunu yoklaması için bir SyncPoller döndürür. Yoklama yanıt türü BlobCopyInfo'dur. Yöntemi beginCopy , bir kopyalama işlemi için zaman uyumsuz zamanlama istediğinizde kullanılır.

Azure'da bir kaynaktan blob kopyalama

Aynı depolama hesabı içindeki bir blobu kopyalıyorsanız işlem zaman uyumlu bir şekilde tamamlanabilir. Kaynak bloba erişim Microsoft Entra Kimliği, paylaşılan erişim imzası (SAS) veya hesap anahtarı aracılığıyla yetkilendirilebilir. Değişiklikli zaman uyumlu kopyalama işlemi için bkz . Java ile kaynak nesne URL'sinden blob kopyalama.

Kopyalama kaynağı farklı bir depolama hesabındaki bir blobsa işlem zaman uyumsuz olarak tamamlanabilir. Kaynak blob genel veya SAS belirteci aracılığıyla yetkilendirilmelidir. SAS belirtecinin Okuma ('r') iznini içermesi gerekir. SAS belirteçleri hakkında daha fazla bilgi edinmek için bkz . Paylaşılan erişim imzalarıyla temsilci erişimi.

Aşağıdaki örnekte, zaman uyumsuz zamanlamayla farklı bir depolama hesabından kaynak blob kopyalamaya yönelik bir senaryo gösterilmektedir. Bu örnekte, eklenen kullanıcı temsilcisi SAS belirteciyle bir kaynak blob URL'si oluşturacağız. Örnekte, istemci kitaplığını kullanarak SAS belirtecinin nasıl oluşturulacağı gösterilmektedir, ancak kendiniz de sağlayabilirsiniz. Örnek ayrıca farklı bir istemciden blobda değişiklik yapılmasını önlemek için kopyalama işlemi sırasında kaynak blobu kiralamayı da gösterir. Kopyalama Copy Blob işlemi başladığında işlem kaynak blobun değerini kaydeder ETag . ETag Kopyalama işlemi tamamlanmadan önce değer değiştirilirse işlem başarısız olur.

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

Dekont

Kullanıcı temsilcisi SAS belirteçleri, hesap anahtarı yerine Microsoft Entra kimlik bilgileriyle imzalanmış olduğundan daha fazla güvenlik sunar. Kullanıcı temsilcisi SAS belirteci oluşturmak için Microsoft Entra güvenlik sorumlusunun uygun izinlere sahip olması gerekir. Yetkilendirme gereksinimleri için bkz . Kullanıcı Temsilcisi Anahtarı Alma.

Azure dışındaki bir kaynaktan blob kopyalama

Azure dışındaki erişilebilir nesneler de dahil olmak üzere belirli bir URL'de HTTP GET isteği aracılığıyla alınabilen herhangi bir kaynak nesne üzerinde kopyalama işlemi gerçekleştirebilirsiniz. Aşağıdaki örnekte, erişilebilir bir kaynak nesne URL'sinden blob kopyalamaya yönelik bir senaryo gösterilmektedir.

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

Kopyalama işleminin durumunu denetleme

Bir Copy Blob işlemin durumunu denetlemek için tarafından SyncPollerdöndürülen BlobCopyInfo nesnesinde getCopyStatus'u çağırabilirsiniz.

Aşağıdaki kod örneği, kopyalama işleminin durumunu denetlemeyi gösterir:

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

Kopyalama işlemini durdurma

Bekleyen Copy Blob bir işlemin durdurularak sıfır uzunlukta bir hedef blob elde edilir. Ancak hedef blob için meta veriler, kaynak blobdan kopyalanan veya kopyalama işlemi sırasında açıkça ayarlanan yeni değerlere sahiptir. Özgün meta verileri kopyalamadan önce tutmak için, kopyalama yöntemlerinden birini çağırmadan önce hedef blobun anlık görüntüsünü alın.

Bekleyen kopyalama işlemini durdurmak için aşağıdaki yöntemi çağırın:

Bu yöntem, Bekleyen Copy Blob işlemi iptal eden Blob Kopyalamayı Durdur REST API işlemini sarmalar. Aşağıdaki kod örneğinde bekleyen Copy Blob bir işlemin nasıl durdurulacakları gösterilmektedir:

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

Kaynaklar

Java için Azure Blob Depolama istemci kitaplığını kullanarak blobları kopyalama hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.

REST API işlemleri

Java için Azure SDK, Azure REST API'sinin üzerinde derlenmiş kitaplıklar içerir ve tanıdık Java paradigmalarıyla REST API işlemleriyle etkileşim kurmanızı sağlar. Bu makalede ele alınan istemci kitaplığı yöntemleri aşağıdaki REST API işlemlerini kullanır:

  • Blobu Kopyalama (REST API)
  • Blob Kopyalamayı Durdur (REST API)

Kod örnekleri

İstemci kitaplığı kaynakları