Aracılığıyla paylaş


Java için Azure SDK'da sayfalandırma ve yineleme

Bu makalede, büyük veri kümeleriyle verimli ve üretken bir şekilde çalışmak üzere Java sayfalandırma ve yineleme işlevselliği için Azure SDK'nın nasıl kullanılacağına ilişkin genel bir bakış sağlanmaktadır.

Azure Java SDK'sı içindeki istemci kitaplıkları tarafından sağlanan birçok işlem birden fazla sonuç döndürür. Azure Java SDK'sı, tutarlılık aracılığıyla geliştirici deneyiminin en üst düzeye çıkarılmasını sağlamak için bu durumlarda kabul edilebilir bir dizi dönüş türü tanımlar. Kullanılan PagedIterable dönüş türleri, eşitleme API'leri ve PagedFlux zaman uyumsuz API'ler içindir. API'ler farklı kullanım örnekleri açısından biraz farklılık gösterir, ancak kavramsal olarak aynı gereksinimlere sahiptir:

  • El ile sayfalandırma veya devamlılık belirteçlerini izleme gereksinimini göz ardı ederek koleksiyondaki her öğe üzerinde ayrı ayrı kolayca yinelemeyi mümkün hale getirin. PagedIterable ve PagedFlux hem de sayfalandırılmış bir yanıtı belirli bir türde T seri durumdan çıkararak üzerinde yineleme yaparak bu görevi kolaylaştırır. PagedIterable, Iterable arabirimini uygular ve bir Stream almanız için API sunar, PagedFlux ise bir Flux sağlar. Her durumda, sayfalandırma işlemi saydamdır ve üzerinde yinelenebilecek hâlâ sonuçlar varken yineleme devam eder.

  • Açıkça sayfa sayfa yinelemeyi mümkün hale getirin. Bunu yapmak, istekler yapıldığında daha net bir şekilde anlamanıza ve sayfa başına yanıt bilgilerine erişmenize olanak tanır. Hem PagedIterable hem de PagedFlux, tek tek öğeler yerine sayfaya göre yinelemek için uygun türleri döndüren yöntemlere sahiptir.

Bu makale, Java Azure SDK zaman uyumlu ve zaman uyumsuz API'ler arasında bölünmüştür. Zaman uyumlu istemcilerle çalışırken zaman uyumlu yineleme API'lerini ve zaman uyumsuz istemcilerle çalışırken zaman uyumsuz yineleme API'lerini görürsünüz.

Zaman uyumlu sayfalandırma ve yineleme

Bu bölüm zaman uyumlu API'leri kapsar.

Tek tek öğeleri tekrar et

Belirtildiği gibi, en yaygın kullanım örneği sayfa başına değil, her öğeyi ayrı ayrı yinelemektir. Aşağıdaki kod örnekleri, API'nin PagedIterable bu işlevi uygulamak için tercih ettiğiniz yineleme stilini kullanmanıza nasıl izin vereceğini gösterir.

Bir for-each döngüsü kullanın

PagedIterable uyguladığındanIterable, aşağıdaki örnekte gösterildiği gibi öğeleri yineleyebilirsiniz:

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

Stream'i kullanma

Üzerinde tanımlanmış bir PagedIterable yöntem olduğundanstream(), aşağıdaki örnekte gösterildiği gibi standart Java Stream API'lerini kullanmak için çağırabilirsiniz:

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

Yineleyici kullanma

PagedIterable uyguladığındanIterable, aşağıdaki örnekte gösterildiği gibi Java yineleyici programlama stiline izin veren bir iterator() yöntemi de vardır:

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

Sayfalar arasında döngü yap

Tek tek sayfalarla çalışırken, örneğin HTTP yanıt bilgilerine ihtiyacınız olduğunda veya yineleme geçmişini korumak için devamlılık belirteçlerinin önemli olduğu durumlarda sayfa başına yineleme yapabilirsiniz. Sayfaya veya her öğeye göre yinelemeden bağımsız olarak, performansta veya hizmete yapılan çağrıların sayısında bir fark yoktur. Temel alınan uygulanış bir sonraki sayfayı isteğe bağlı olarak yükler ve PagedFlux aboneliğini istediğiniz zaman kaldırırsanız hizmete başka çağrı yapılmaz.

Bir for-each döngüsü kullanın

listSecrets() çağrısı yaptığınızda, PagedIterable API'sine sahip bir iterableByPage() alırsınız. Bu API, Iterable<PagedResponse<Secret>> yerine bir Iterable<Secret> üretir. PagedResponse aşağıdaki örnekte gösterildiği gibi yanıt meta verilerini ve devamlılık belirtecine erişimi sağlar:

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))
}

Ayrıca devamlılık iterableByPage belirtecini kabul eden bir aşırı yükleme de vardır. Daha sonra aynı yineleme noktasına dönmek istediğinizde bu aşırı yüklemeyi çağırabilirsiniz.

Stream'i kullanma

Aşağıdaki örnekte yöntemin streamByPage() yukarıda gösterildiği gibi aynı işlemi nasıl gerçekleştirdiği gösterilmektedir. Bu API ayrıca daha sonra aynı yineleme noktasına dönmek için bir devamlılık belirteci aşırı yüklemesine sahiptir.

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))
      });

Sayfaları ve tek tek öğeleri zaman uyumsuz olarak gözlemleyin.

Bu bölüm zaman uyumsuz API'leri kapsar. Asenkron API'lerde, ağ çağrıları ana iş parçacığını çağıran subscribe() 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.

Tek tek öğeleri gözlemleme

Aşağıdaki örnekte, API'nin PagedFlux tek tek öğeleri zaman uyumsuz olarak gözlemlemenize nasıl olanak tanıyan bir örnek gösterilmektedir. Flux türüne abone olmanın çeşitli yolları vardır. Daha fazla bilgi için Reactor 3 Başvuru Kılavuzu'ndaAkı veya Mono Oluşturmanın Basit Yolları ve Buna Abone Olma bölümüne bakın. Bu örnek, her biri tüketici, hata tüketicisi ve tam tüketici için birer tane olan üç lambda ifadesinin bulunduğu bir çeşittir. Üçüne de sahip olmak iyi bir uygulamadır, ancak bazı durumlarda yalnızca tüketicinin ve muhtemelen hata tüketicisinin olması gerekir.

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"));

Sayfaları gözlemle

Aşağıdaki örnek, PagedFlux API'sinin her sayfayı zaman uyumsuz olarak gözlemlemenize nasıl olanak tanıdığını göstermektedir. Bu, byPage() API'sini kullanarak ve bir tüketici, hata tüketicisi ve tamamlama tüketicisi sağlayarak yapılır.

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"));

Sonraki Adımlar

Java için Azure SDK'da sayfalandırma ve yineleme hakkında bilgi edindiğinize göre, Java için Azure SDK'da uzun süre çalışan işlemleri gözden geçirmeyi göz önünde bulundurun. Uzun süre çalışan işlemler, genellikle sunucu tarafında biraz çaba gerektirdiğinden çoğu normal HTTP isteğinden daha uzun süre çalışan işlemlerdir.