Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek obsahuje přehled použití dlouhotrvajících operací se sadou Azure SDK pro Javu.
Dokončení některých operací v Azure může trvat delší dobu. Tyto operace jsou mimo standardní styl HTTP rychlého toku požadavku nebo odpovědi. Například kopírování dat ze zdrojové adresy URL do objektu blob úložiště nebo trénování modelu pro rozpoznávání formulářů jsou operace, které můžou trvat několik sekund až několik minut. Tyto operace se označují jako operace Long-Running a často se zkracují jako LRO. Dokončení LRO může trvat několik sekund, minut, hodin, dnů nebo déle v závislosti na požadované operaci a procesu, který se musí provést na straně serveru.
V klientských knihovnách Javy pro Azure existuje konvence, která všechny dlouhotrvající operace začínají předponou begin . Tato předpona označuje, že tato operace je dlouhotrvající a že se způsob interakce s touto operací mírně liší od obvyklého toku požadavku nebo odpovědi. Kromě předpony begin se návratový typ operace liší i od obvyklého typu, aby bylo možné povolit celou řadu funkcí dlouhotrvajících operací. Stejně jako u většiny věcí v sadě Azure SDK pro Javu existují synchronní i asynchronní rozhraní API pro dlouhotrvající operace:
- V synchronních klientech dlouhotrvající operace vrátí instanci
SyncPoller. - U asynchronních klientů vrátí dlouhotrvající operace instanci
PollerFlux.
SyncPoller i PollerFlux jsou abstrakce na straně klienta určené k zjednodušení interakce s dlouhotrvajícími operacemi na straně serveru. Zbytek tohoto článku popisuje osvědčené postupy při práci s těmito typy.
Synchronní dlouhotrvající operace
Volání libovolného API, které vrací SyncPoller, okamžitě spustí dlouhotrvající operaci. Rozhraní API okamžitě vrátí SyncPoller, což vám umožní sledovat průběh dlouhotrvající operace a načíst konečný výsledek. Následující příklad ukazuje, jak monitorovat průběh dlouhotrvající operace pomocí 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());
Tento příklad používá metodu poll() na SyncPoller k načtení informací o průběhu dlouhotrvající operace. Tento kód vypíše stav do konzoly, ale lepší implementace by na základě tohoto stavu udělala relevantní rozhodnutí.
Metoda getRetryAfter() vrátí informace o tom, jak dlouho čekat před dalším dotazem. Většina dlouhotrvajících operací Azure vrací zpoždění dotazování jako součást odpovědi HTTP (to znamená běžně používané retry-after hlavičky). Pokud odpověď neobsahuje zpoždění dotazování, getRetryAfter() vrátí metoda dobu trvání danou v době vyvolání dlouhotrvající operace.
Výše uvedený příklad používá smyčku do..while k opakovanému dotazování, dokud nebude dokončena dlouhotrvající operace. Pokud vás tyto průběžné výsledky nezajímají, můžete místo toho zavolat waitForCompletion(). Toto volání zablokuje aktuální vlákno, dokud dlouhotrvající operace neskončí a nevrátí poslední odpověď z dotazu:
PollResponse<UploadBlobProgress> response = poller.waitForCompletion();
Pokud poslední odpověď dotazu indikuje, že dlouhotrvající operace byla úspěšně dokončena, můžete konečný výsledek načíst pomocí getFinalResult()příkazu :
if (LongRunningOperationStatus.SUCCESSFULLY_COMPLETED == response.getStatus()) {
UploadedBlobProperties result = poller.getFinalResult();
}
Mezi další užitečná rozhraní API SyncPoller patří:
-
waitForCompletion(Duration): Počkejte na dokončení dlouhotrvající operace na danou dobu časového limitu. -
waitUntil(LongRunningOperationStatus): Počkejte, až bude přijat stav dané dlouhotrvající operace. -
waitUntil(LongRunningOperationStatus, Duration): Počkejte, až se přijme daný stav dlouhotrvající operace nebo dokud nevyprší daná doba časového limitu.
Asynchronní dlouhotrvající operace
Následující příklad ukazuje, jak PollerFlux umožňuje sledovat dlouhotrvající operaci. V asynchronních rozhraních API dochází k síťovým voláním v jiném vlákně než v hlavním vlákně, které volá subscribe(). To znamená, že hlavní vlákno může před dostupností výsledku ukončit. Je na vás, abyste zajistili, že se aplikace neukončí dříve, než bude mít asynchronní operace čas na dokončení.
Asynchronní rozhraní API vrátí okamžitě PollerFlux, ale dlouhotrvající operace se nespustí, dokud se k PollerFlux nepřihlásíte. Tento proces je způsob, jakým fungují všechna rozhraní API založená na Flux. Následující příklad ukazuje asynchronní dlouhotrvající operaci:
asyncClient.beginUploadFromUri(...)
.subscribe(response -> System.out.println("Status of long running upload operation: " + response.getStatus()));
V následujícím příkladu budete dostávat občasné aktualizace stavu dlouhotrvající operace. Tyto aktualizace můžete použít k určení, jestli dlouhotrvající operace stále funguje očekávaným způsobem. Tento příklad vytiskne stav do konzoly, ale lepší implementace by na základě tohoto stavu udělala relevantní rozhodnutí o zpracování chyb.
Pokud nemáte zájem o průběžné aktualizace stavu a chcete dostávat oznámení o konečném výsledku, jakmile přijde, můžete použít kód podobný následujícímu příkladu:
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());
V tomto kódu načtete konečný výsledek dlouhotrvající operace voláním last(). Toto volání říká PollerFlux, že chcete počkat na dokončení veškerého dotazování, a v tomto okamžiku dlouhotrvající operace dosáhne konečného stavu, abyste mohli zkontrolovat její stav a určit výsledek. Pokud indikátor dokončení naznačuje, že dlouhotrvající operace byla úspěšně dokončena, můžete získat konečný výsledek a předat ho příjemci ve volání subscribe.
Další kroky
Teď když znáte dlouho běžící rozhraní API v sadě Azure SDK pro Javu, podívejte se na Konfigurace proxy serverů v sadě Azure SDK pro Javu, kde se dozvíte, jak dále přizpůsobit klienta HTTP.