Share via


Java için Azure SDK'da uzun süre çalışan işlemler

Bu makalede, Java için Azure SDK ile uzun süre çalışan işlemleri kullanmaya genel bir bakış sağlanır.

Azure'da belirli işlemlerin tamamlanması uzun sürebilir. Bu işlemler, hızlı istek/yanıt akışının standart HTTP stilinin dışındadır. Örneğin, bir kaynak URL'den Depolama bloba veri kopyalamak veya formları tanımak için modeli eğitmek, birkaç saniye ila birkaç dakika sürebilecek işlemlerdir. Bu tür işlemler Uzun Süre Çalışan İşlemler olarak adlandırılır ve genellikle 'LRO' olarak kısaltılır. LRO'ların tamamlanması istenen işleme ve sunucu tarafında gerçekleştirilmesi gereken işleme bağlı olarak saniye, dakika, saat, gün veya daha uzun sürebilir.

Azure için Java istemci kitaplıklarında, uzun süre çalışan tüm işlemlerin ön ekiyle begin başladığı bir kural vardır. Bu ön ek, bu işlemin uzun süre çalıştığını ve bu işlemle etkileşim araçlarının normal istek/yanıt akışından biraz farklı olduğunu gösterir. Ön ekin begin yanı sıra, uzun süre çalışan işlem işlevselliğinin tamamını etkinleştirmek için işlemden dönüş türü de normalden farklıdır. Java için Azure SDK'da olduğu gibi, uzun süre çalışan işlemler için hem zaman uyumlu hem de zaman uyumsuz API'ler vardır:

  • Zaman uyumlu istemcilerde, uzun süre çalışan işlemler bir SyncPoller örnek döndürür.
  • Zaman uyumsuz istemcilerde, uzun süre çalışan işlemler bir PollerFlux örnek döndürür.

Hem hem PollerFlux de SyncPoller uzun süre çalışan sunucu tarafı işlemleriyle etkileşimi basitleştirmeye yönelik istemci tarafı soyutlamalarıdır. Bu makalenin geri kalanında bu türlerle çalışırken en iyi yöntemler özetlenmiştir.

Zaman uyumlu uzun süre çalışan işlemler

döndüren herhangi bir SyncPoller API'yi çağırmak, uzun süre çalışan işlemi hemen başlatır. API SyncPoller , uzun süre çalışan işlemin ilerleme durumunu izlemenize ve nihai sonucu almanıza olanak tanır. Aşağıdaki örnekte, kullanarak uzun süre çalışan bir işlemin ilerleme durumunun nasıl izleneceği gösterilmektedir SyncPoller.

SyncPoller<UploadBlobProgress, UploadedBlobProperties> poller = syncClient.beginUploadFromUri(<URI to upload from>)
PollResponse<UploadBlobProgress> response;

do {
    response = poller.poll();
    System.out.println("Status of long running upload operation: " + response.getStatus());
    Duration pollInterval = response.getRetryAfter();
    TimeUnit.MILLISECONDS.sleep(pollInterval.toMillis());
} while (!response.getStatus().isComplete());

Bu örnekte, uzun süre çalışan işlemin ilerleme durumu hakkında bilgi almak için üzerindeki yöntemi SyncPoller kullanılırpoll(). Bu kod durumu konsola yazdırır, ancak daha iyi bir uygulama bu duruma göre ilgili kararlar alır.

yöntemi, getRetryAfter() bir sonraki yoklamadan önce ne kadar bekleyeceğiniz hakkında bilgi döndürür. Azure uzun süre çalışan işlemlerin çoğu HTTP yanıtlarının (yaygın olarak kullanılan retry-after üst bilgi) bir parçası olarak yoklama gecikmesini döndürür. Yanıt yoklama gecikmesini içermiyorsa, getRetryAfter() yöntem uzun süre çalışan işlemi çağırma sırasında verilen süreyi döndürür.

Yukarıdaki örnek, uzun süre çalışan işlem tamamlanana kadar sürekli yoklama yapmak için bir do..while döngü kullanır. Bu ara sonuçlarla ilgilenmiyorsanız, bunun yerine öğesini çağırabilirsiniz waitForCompletion(). Bu çağrı, uzun süre çalışan işlem tamamlanana ve son yoklama yanıtını döndürene kadar geçerli iş parçacığını engeller:

PollResponse<UploadBlobProgress> response = poller.waitForCompletion();

Son yoklama yanıtı uzun süre çalışan işlemin başarıyla tamamlandığını gösteriyorsa, kullanarak getFinalResult()nihai sonucu alabilirsiniz:

if (LongRunningOperationStatus.SUCCESSFULLY_COMPLETED == response.getStatus()) {
    UploadedBlobProperties result = poller.getFinalResult();
}

içindeki diğer yararlı API'ler SyncPoller şunlardır:

  1. waitForCompletion(Duration): verilen zaman aşımı süresi boyunca uzun süre çalışan işlemin tamamlanmasını bekleyin.
  2. waitUntil(LongRunningOperationStatus): verilen uzun süre çalışan işlem durumu alınana kadar bekleyin.
  3. waitUntil(LongRunningOperationStatus, Duration): verilen uzun süre çalışan işlem durumu alınana kadar veya belirtilen zaman aşımı süresi dolana kadar bekleyin.

Zaman uyumsuz uzun süre çalışan işlemler

Aşağıdaki örnekte, öğesinin PollerFlux uzun süre çalışan bir işlemi nasıl gözlemlemenizi sağladığınız gösterilmektedir. Zaman uyumsuz API'lerde, ağ çağrıları çağıran subscribe()ana iş parçacığından farklı bir iş parçacığında gerçekleşir. Bunun anlamı, ana iş parçacığının sonuç kullanılabilir olmadan önce sonlandırılabilmesidir. Zaman uyumsuz işlem tamamlanmadan önce uygulamanın çıkmadığından emin olmak size bağlıdır.

Zaman uyumsuz API hemen bir PollerFlux döndürür, ancak uzun süre çalışan işlemin kendisi abone olana PollerFluxkadar başlatılmaz. Bu işlem, tüm Fluxtabanlı API'lerin nasıl çalıştığıdır. Aşağıdaki örnekte, zaman uyumsuz uzun süre çalışan bir işlem gösterilmektedir:

asyncClient.beginUploadFromUri(...)
    .subscribe(response -> System.out.println("Status of long running upload operation: " + response.getStatus()));

Aşağıdaki örnekte, uzun süre çalışan işlemde aralıklı durum güncelleştirmeleri alacaksınız. Uzun süre çalışan işlemin hala beklenen şekilde çalışıp çalışmadığını belirlemek için bu güncelleştirmeleri kullanabilirsiniz. Bu örnek durumu konsola yazdırır, ancak daha iyi bir uygulama bu duruma göre ilgili hata işleme kararları alır.

Ara durum güncelleştirmeleriyle ilgilenmiyorsanız ve yalnızca son sonuç geldiğinde bildirim almak istiyorsanız, aşağıdaki örneğe benzer bir kod kullanabilirsiniz:

asyncClient.beginUploadFromUri(...)
    .last()
    .flatMap(response -> {
        if (LongRunningOperationStatus.SUCCESSFULLY_COMPLETED == response.getStatus()) {
            return response.getFinalResult();
        }
        return Mono.error(new IllegalStateException("Polling completed unsuccessfully with status: "+ response.getStatus()));
    })
    .subscribe(
        finalResult -> processFormPages(finalResult),
        ex -> countDownLatch.countDown(),
        () -> countDownLatch.countDown());

Bu kodda, çağrısı last()yaparak uzun süre çalışan işlemin nihai sonucunu alırsınız. Bu çağrı, tüm yoklamanın tamamlanmasını beklemek istediğinizi bildirir PollerFlux . Bu noktada uzun süre çalışan işlem terminal durumuna ulaşmıştır ve sonucu belirlemek için durumunu inceleyebilirsiniz. Poller, uzun süre çalışan işlemin başarıyla tamamlandığını belirtiyorsa, nihai sonucu alabilir ve abone olma çağrısında tüketiciye geçirebilirsiniz.

Sonraki adımlar

Java için Azure SDK'daki uzun süre çalışan API'leri öğrendiğinize göre HTTP istemcisini özelleştirmeyi daha fazla öğrenmek için bkz . Java için Azure SDK'da proxy'leri yapılandırma.