Sdílet prostřednictvím


Dlouhotrvající operace v sadě Azure SDK pro Javu

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 dlouhotrvající operace 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 vrátí SyncPoller dlouhotrvající operace instanci.
  • V asynchronních klientech vrátí PollerFlux dlouhotrvající operace instanci.

PollerFlux Abstrakce SyncPoller na straně klienta mají zjednodušit interakci 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 rozhraní API, které vrací, SyncPoller okamžitě spustí dlouhotrvající operaci. Rozhraní API vrátí okamžitě SyncPoller , takže budete moci 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()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 dlouho spuštěná operace neskoncí a nevrátí poslední odpověď 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ří:

  1. waitForCompletion(Duration): Počkejte na dokončení dlouhotrvající operace na danou dobu časového limitu.
  2. waitUntil(LongRunningOperationStatus): Počkejte na přijetí daného stavu dlouhotrvající operace.
  3. 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 můžete 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 měli jistotu, že se aplikace neodejde, než se asynchronní operace dokončí.

Asynchronní rozhraní API vrátí okamžitě PollerFlux , ale dlouhotrvající operace se nespustí, dokud se k odběru PollerFluxnehlásíte . Tento proces je způsob, jakým fungují všechna Fluxrozhraní API založená na nich. 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 získáte přerušované aktualizace stavu u 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í, v jakém okamžiku dlouhotrvající operace dosáhla stavu terminálu, a můžete zkontrolovat její stav a určit výsledek. Pokud poller indikuje, že dlouhotrvající operace byla úspěšně dokončena, můžete načíst konečný výsledek a předat ho příjemci v volání odběru.

Další kroky

Teď, když znáte dlouhotrvající rozhraní API v sadě Azure SDK pro Javu, najdete v tématu Konfigurace proxy serverů v sadě Azure SDK pro Javu , kde se dozvíte, jak dále přizpůsobit klienta HTTP.