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:
waitForCompletion(Duration)
: verilen zaman aşımı süresi boyunca uzun süre çalışan 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 ö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 PollerFlux
kadar başlatılmaz. Bu işlem, tüm Flux
tabanlı 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.