Stránkování a iterace v sadě Azure SDK pro Javu

Tento článek obsahuje přehled o tom, jak používat azure SDK pro stránkování a iterační funkce pro efektivní a produktivní práci s velkými datovými sadami.

Mnoho operací poskytovaných klientskými knihovnami v sadě Azure Java SDK vrací více než jeden výsledek. Sada Azure Java SDK v těchto případech definuje sadu přijatelných návratových typů, aby se zajistilo, že vývojářské prostředí je maximalizované prostřednictvím konzistence. Použité návratové typy jsou PagedIterable pro synchronizační rozhraní API a PagedFlux pro asynchronní rozhraní API. Rozhraní API se mírně liší v závislosti na různých případech použití, ale koncepčně mají stejné požadavky:

  • Umožňuje snadno iterovat jednotlivé prvky v kolekci jednotlivě a ignorovat potřebu ručního stránkování nebo sledování tokenů pokračování. PagedFlux Tento PagedIterable úkol lze snadno provést iterací přes stránkovanou odpověď deserializovaný do daného typu T. PagedIterable implementuje Iterable rozhraní a nabízí rozhraní API pro příjem , Streamzatímco PagedFlux poskytuje Flux. Ve všech případech je operace stránkování transparentní a iterace pokračuje, zatímco stále probíhá iterace výsledků.

  • Umožňuje iterovat explicitně stránky po stránkách. Díky tomu budete moct jasněji pochopit, kdy se požadavky provádějí, a umožní vám přístup k informacím o odpovědích na jednotlivé stránky. Obě PagedIterable a PagedFlux mají metody, které vrátí vhodné typy pro iteraci podle stránky, nikoli podle jednotlivých prvků.

Tento článek je rozdělený mezi synchronní a asynchronní rozhraní API sady Java Sdk. Synchronní iterační rozhraní API uvidíte při práci s synchronními klienty a asynchronní iterační rozhraní API při práci s asynchronními klienty.

Synchronní stránkování a iterace

Tato část popisuje synchronní rozhraní API.

Iterace nad jednotlivými prvky

Jak je uvedeno, nejběžnějším případem použití je iterace jednotlivých prvků jednotlivě, nikoli na stránku. Následující příklady kódu ukazují, jak PagedIterable rozhraní API umožňuje používat styl iterace, který dáváte přednost implementaci této funkce.

Použití smyčky pro každou smyčku

Vzhledem k tomu PagedIterable , že implementuje Iterable, můžete iterovat prvky, jak je znázorněno v následujícím příkladu:

PagedIterable<Secret> secrets = client.listSecrets();
for (Secret secret : secrets) {
   System.out.println("Secret is: " + secret);
}

Použití streamu

Vzhledem k tomu PagedIterable , že má na něm definovanou metodu stream() , můžete ji volat tak, aby používala standardní rozhraní API služby Java Stream, jak je znázorněno v následujícím příkladu:

client.listSecrets()
      .stream()
      .forEach(secret -> System.out.println("Secret is: " + secret));

Použití iterátoru

Vzhledem k tomu PagedIterable , že implementuje Iterable, má také metodu iterator() , která umožňuje programovací styl iterátoru Java, jak je znázorněno v následujícím příkladu:

Iterator<Secret> secrets = client.listSecrets().iterator();
while (it.hasNext()) {
   System.out.println("Secret is: " + it.next());
}

Iterace přes stránky

Při práci s jednotlivými stránkami můžete iterovat na stránce, například když potřebujete informace o odpovědi HTTP nebo když jsou pro zachování historie iterace důležité tokeny pokračování. Bez ohledu na to, jestli iterujete podle stránky nebo každé položky, není žádný rozdíl v výkonu ani počtu volání provedených službou. Základní implementace načte další stránku na vyžádání a pokud se kdykoli odhlásíte od odběru PagedFlux , nebudou k dispozici žádná další volání služby.

Použití smyčky pro každou smyčku

Při volání listSecrets()získáte rozhraní PagedIterableAPI, které má iterableByPage() rozhraní API. Toto rozhraní API vytvoří místo Iterable<PagedResponse<Secret>>Iterable<Secret>. Poskytuje PagedResponse metadata odpovědi a přístup k tokenu pokračování, jak je znázorněno v následujícím příkladu:

Iterable<PagedResponse<Secret>> secretPages = client.listSecrets().iterableByPage();
for (PagedResponse<Secret> page : secretPages) {
   System.out.println("Response code: " + page.getStatusCode());
   System.out.println("Continuation Token: " + page.getContinuationToken());
   page.getElements().forEach(secret -> System.out.println("Secret value: " + secret))
}

Existuje také iterableByPage přetížení, které přijímá token pro pokračování. Toto přetížení můžete volat, když se chcete později vrátit ke stejnému bodu iterace.

Použití streamu

Následující příklad ukazuje, jak streamByPage() metoda provádí stejnou operaci, jak je znázorněno výše. Toto rozhraní API má také přetížení tokenu pokračování pro pozdější návrat do stejného bodu iterace.

client.listSecrets()
      .streamByPage()
      .forEach(page -> {
          System.out.println("Response code: " + page.getStatusCode());
          System.out.println("Continuation Token: " + page.getContinuationToken());
          page.getElements().forEach(secret -> System.out.println("Secret value: " + secret))
      });

Asynchronně sledujte stránky a jednotlivé prvky.

Tato část se zabývá asynchronními rozhraními API. 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čí.

Sledování jednotlivých prvků

Následující příklad ukazuje, jak PagedFlux rozhraní API umožňuje asynchronně sledovat jednotlivé prvky. Existují různé způsoby, jak se přihlásit k odběru typu Flux. Další informace najdete v tématu Jednoduché způsoby vytvoření fluxu nebo mono a přihlášení k odběru v referenční příručce Reactor 3. Tento příklad je jednou z různých variant, kde existují tři výrazy lambda, jeden pro příjemce, příjemce chyby a úplný příjemce. Mít všechny tři je dobrý postup, ale v některých případech je nutné mít pouze spotřebitele a případně i příjemce chyby.

asyncClient.listSecrets()
   .subscribe(secret -> System.out.println("Secret value: " + secret),
       ex -> System.out.println("Error listing secrets: " + ex.getMessage()),
       () -> System.out.println("Successfully listed all secrets"));

Sledování stránek

Následující příklad ukazuje, jak PagedFlux rozhraní API umožňuje asynchronně byPage() sledovat jednotlivé stránky pomocí rozhraní API a poskytnutím příjemce, příjemce chyby a příjemce dokončování.

asyncClient.listSecrets().byPage()
  .subscribe(page -> {
          System.out.println("Response code: " + page.getStatusCode());
          System.out.println("Continuation Token: " + page.getContinuationToken());
          page.getElements().forEach(secret -> System.out.println("Secret value: " + secret))
      },
      ex -> System.out.println("Error listing pages with secret: " + ex.getMessage()),
      () -> System.out.println("Successfully listed all pages with secret"));

Další kroky

Teď, když už znáte stránkování a iteraci v sadě Azure SDK pro Javu, zvažte kontrolu dlouhotrvajících operací v sadě Azure SDK pro Javu. Dlouhotrvající operace jsou operace, které běží déle než většina běžných požadavků HTTP, obvykle proto, že vyžadují určité úsilí na straně serveru.