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

Bu makale, Java’ya yönelik Azure SDK’sındaki uzun süreli işlemleri açıklar ve daha az manuel yoklama mantığıyla ilerleme durumunun nasıl izleneceğini ve nihai sonuçların nasıl alınacağını gösterir.

Azure belirli işlemlerin tamamlanması uzun zaman alır. Bu işlemler, hızlı istek ve yanıt akışının standart HTTP stiline uymaz. Örneğin, bir kaynak URL'den Depolama blob'una veri kopyalamak veya formları tanımak için modeli eğitmek, birkaç saniye ila birkaç dakika sürebilecek işlemlerdir. Bu işlemler uzun süre çalışan işlemlerdir ve genellikle LRO olarak kısaltılır. LRO'ların tamamlanması istenen işleme ve sunucunun gerçekleştirmesi 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şlemler ön ek ile begin başlar. Bu ön ek, işlemin uzun süre çalıştığını ve bu işlemle etkileşim araçlarının normal istek ve 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 çoğu şeyde olduğu gibi, uzun süre çalışan işlemlerin hem zaman uyumlu hem de zaman uyumsuz API'leri vardır:

  • Zaman uyumlu istemcilerde, uzun süre çalışan işlemler bir SyncPoller örnek döndürür.
  • Eşzamansız istemcilerde, uzun süren işlemler bir PollerFlux örneği döndürür.

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

Eşzamanlı uzun süre çalışan işlemler

SyncPoller döndüren bir API'yi çağırdığınızda, uzun süren işlem hemen başlar. API hemen değerini döndürür SyncPoller , böylece uzun süre çalışan işlemin ilerleme durumunu izleyebilir ve nihai sonucu alabilirsiniz. Aşağıdaki örnekte, SyncPoller kullanılarak uzun süre çalışan bir işlemin ilerleme durumunun nasıl izleneceği gösterilmektedir.

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 örnek, uzun süreli işlemin ilerlemesi hakkında bilgi almak için SyncPoller üzerindeki poll() yöntemini kullanır. Bu kod durumu konsola yazdırır, ancak daha iyi bir uygulama bu duruma göre ilgili kararlar verir.

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

Yukarıdaki örnek, uzun süre çalışan işlem bitene kadar sürekli yoklama yapmak için bir do..while döngü kullanır. İlginizi bu ara sonuçlar çekmiyorsa, yerine waitForCompletion() çağırabilirsiniz. Bu çağrı, uzun süren işlem tamamlanana kadar mevcut iş parçacığını engeller ve son yoklama yanıtını döndürür:

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

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

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

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

  • waitForCompletion(Duration): belirtilen zaman aşımı süresi boyunca uzun süren işlemin tamamlanmasını bekleyin.
  • waitUntil(LongRunningOperationStatus): verilen uzun süre çalışan işlem durumu alınana kadar bekleyin.
  • 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 örnek, PollerFlux öğesinin uzun süren bir işlemi izlemenizi nasıl sağladığını gösterir. Eşzamansız API'lerde ağ çağrıları, subscribe() öğesini çağıran ana iş parçacığından farklı bir iş parçacığında gerçekleşir. Bu mimari, ana iş parçacığının sonuç elde edilmeden önce sonlanabileceği anlamına gelir. Eşzamansız işlem tamamlanmadan önce uygulamanın kapanmamasını sağlamanız gerekir.

Asenkron API hemen bir PollerFlux döndürür, ancak uzun süreli işlemin kendisi, siz PollerFlux öğesine abone olana kadar başlamaz. 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 alırsı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 kullanın:

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ı, PollerFlux tüm yoklamanın tamamlanmasını beklemek istediğinizi bildirir. Bu noktada, uzun süren işlem nihai bir duruma ulaşır ve sonucun ne olduğunu 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.