Penggunaan lanjutan

Panduan ini menguraikan cara menyesuaikan beberapa aspek yang lebih canggih dari library klien Java. Pola umumnya adalah bahwa banyak fitur ini bergantung pada Callable yang mendasarinya, bukan metode praktis standar. Callable umumnya adalah tempat yang tepat untuk mencari fitur per-RPC lainnya yang tidak didokumentasikan di sini.

Waktu habis

Library Java menyediakan platform untuk menetapkan waktu tunggu di tingkat per-panggilan. Nilai default ditetapkan berdasarkan setelan method_config/timeout di googleads_grpc_service_config.json. Tetapkan nilai yang lebih rendah jika Anda perlu menerapkan batas yang lebih singkat pada waktu maksimum untuk panggilan API.

Untuk menggunakan fitur ini, panggil objek Callable secara langsung. Misalnya, saat memanggil GoogleAdsService.searchStream(), tetapkan waktu tunggu sebagai berikut:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  // Constructs the SearchGoogleAdsStreamRequest.
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery("SELECT campaign.id, campaign.name FROM campaign")
          .build();

  // Executes the API call with a timeout of 5 minutes.
  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient
          .searchStreamCallable()
          .call(
              request,
              GrpcCallContext.createDefault()
                  .withTimeout(Duration.of(5, ChronoUnit.MINUTES)));
  for (SearchGoogleAdsStreamResponse response : stream) {
    // Processes the response rows.
  }
}

Anda dapat menetapkan waktu tunggu hingga 2 jam atau lebih, tetapi API mungkin masih mengalami waktu tunggu untuk permintaan yang berjalan sangat lama dan menampilkan error DEADLINE_EXCEEDED. Jika hal ini menjadi masalah, sebaiknya bagi kueri dan jalankan bagian secara paralel; hal ini menghindari situasi ketika permintaan yang berjalan lama gagal dan satu-satunya cara untuk memulihkannya adalah dengan memicu permintaan lagi dari awal.

Setelan percobaan ulang

Library Java juga menyediakan platform untuk mengonfigurasi setelan percobaan ulang di tingkat per-panggilan. Untuk menggunakan fitur ini, panggil objek Callable secara langsung. Misalnya, saat memanggil GoogleAdsService.searchStream(), konfigurasikan setelan percobaan ulang sebagai berikut:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery("SELECT campaign.id, campaign.name FROM campaign")
          .build();

  // Creates a context object with the custom retry settings.
  GrpcCallContext context =
      GrpcCallContext.createDefault()
          .withRetrySettings(
              RetrySettings.newBuilder()
                  .setInitialRetryDelay(Duration.ofMillis(10L))
                  .setMaxRetryDelay(Duration.ofSeconds(10L))
                  .setRetryDelayMultiplier(1.4)
                  .setMaxAttempts(10)
                  .setLogicalTimeout(Duration.ofSeconds(30L))
                  .build());

  // Issues the streaming search request.
  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient.searchStreamCallable().call(request, context);
  for (SearchGoogleAdsStreamResponse response : stream) {
    // Processes the response rows.
  }
}

Pengoptimalan performa waktu startup

Anda mungkin melihat sedikit penundaan saat instance GoogleAdsClient dibuat untuk pertama kalinya. Hal ini disebabkan oleh antarmuka lancar untuk layanan (GoogleAdsClient.getLatestVersion()), yang memuat class layanan API sekaligus untuk menyediakan mekanisme yang mudah untuk membuat klien layanan.

Jika performa permintaan pertama berada di jalur penting untuk aplikasi Anda, ikuti langkah-langkah berikut:

  1. Buat GoogleAdsClient saat startup, sebelum menayangkan permintaan pengguna.

  2. Kirim beberapa permintaan pemanasan ke Google Ads API saat proses pertama kali dimulai. Contoh:

    // Runs some warm-up requests.
    try (GoogleAdsServiceClient googleAdsServiceClient =
        googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
      // Runs 5 warm-up requests. In our profiling we see that 90% of
      // performance loss is only experienced on the first API call. After 3
      // subsequent calls we saw a negligible improvement in performance.
      for (int i = 0; i < 5; ++i) {
        // Warm-up queries are run with a nonexistent CID so the calls will
        // fail. If you have a CID that you know will be accessible with the
        // OAuth credentials provided you may want to provide that instead and
        // avoid the try-catch.
        try {
          googleAdsServiceClient.search("-1", "Warm-up query");
        } catch (ApiException ex) {
          // Do nothing, we're expecting this to fail.
        }
      }
    }
    

Permintaan pemanasan hanya perlu dijalankan sekali per proses. Setiap pembuatan klien layanan berikutnya akan otomatis menggunakan kembali class yang telah dimuat sebelumnya.

Penggunaan ulang klien layanan

Anda harus menggunakan kembali instance klien layanan jika memungkinkan karena setiap panggilan ke GoogleAdsClient.getLatestVersion().createYYYServiceClient() (atau pengakses khusus versi seperti getVersion26()) akan membuat koneksi dasar baru dan resource terkait.

Pastikan Anda menutup klien layanan saat tidak lagi diperlukan. Anda dapat melakukannya di blok try-with-resources atau dengan memanggil close() di klien layanan.

Jika Anda mencoba menggunakan klien layanan yang ditutup untuk membuat permintaan API, metode klien layanan akan menampilkan java.util.concurrent.RejectedExecutionException.

App Engine gagal di-deploy jika JAR > 32 MB

App Engine memiliki kuota 32 MB untuk setiap file yang diupload. JAR untuk google-ads jauh lebih besar dari ini, terutama saat menggunakan deployment JAR shade atau shadow. Jika Anda men-deploy JAR secara manual, Anda mungkin akan mendapatkan error seperti:

ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-48.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])

Sebagai gantinya, lakukan deployment menggunakan plugin Gradle App Engine Gradle atau Maven. Setiap plugin menyediakan opsi enableJarSplitting yang membagi setiap JAR menjadi bagian 10 MB dan menguploadnya.

Dependensi shadow

Jika project Anda memiliki dependensi yang bertentangan dengan dependensi library, periksa hierarki dependensi project Anda menggunakan salah satu perintah berikut, lalu ubah dependensi project Anda sesuai kebutuhan (atau gunakan Bill of Materials):

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Jika mengatasi konflik dependensi tidak memungkinkan, Anda dapat bergantung pada versi library yang di- shade:

Maven

<dependency>
  <groupId>com.google.api-ads</groupId>
  <artifactId>google-ads-shadowjar</artifactId>
  <version>48.0.0</version>
</dependency>

Gradle

implementation 'com.google.api-ads:google-ads-shadowjar:48.0.0'