Penggunaan lanjutan

Panduan ini menjelaskan cara menyesuaikan beberapa aspek lanjutan dari library klien Java. Pola umumnya adalah banyak fitur ini bergantung pada Callable yang mendasarinya, bukan metode standar. Secara umum, callable adalah tempat yang baik untuk mencari fitur per RPC lainnya yang tidak didokumentasikan di sini.

Waktu tunggu

Library Java menyediakan platform untuk menyetel waktu tunggu pada 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, Anda harus menggunakan objek callable secara langsung. Misalnya, jika memanggil GoogleAdsService.searchStream(), waktu tunggu akan ditetapkan sebagai:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  // Constructs the SearchGoogleAdsStreamRequest.
  SearchGoogleAdsStreamRequest request = ...

  // Executes the API call, with a timeout of 5 minutes.
  ServerStream<SearchGoogleAdsStreamResponse> result = googleAdsServiceClient
      .searchStreamCallable()
      .call(request,
          GrpcCallContext.createDefault().withTimeout(Duration.of(5, ChronoUnit.MINUTES)));
}

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

Coba lagi setelan

Library Java juga menyediakan platform untuk mengonfigurasi setelan percobaan ulang pada tingkat per panggilan. Untuk menggunakan fitur ini, Anda harus menggunakan objek callable secara langsung. Misalnya, jika memanggil GoogleAdsService.searchStream(), setelan percobaan ulang akan dikonfigurasi sebagai berikut:

// 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());

// Creates and issues a search Google Ads stream request.
ServerStream<SearchGoogleAdsStreamResponse> stream =
    googleAdsServiceClient.searchStreamCallable().call(request, context);

Pengoptimalan performa waktu mulai

Anda mungkin mengalami sedikit penundaan saat pertama kali instance GoogleAdsClient dibuat. Hal ini karena antarmuka yang lancar untuk layanan (GoogleAdsClient.getVersionXX()), yang memuat semua class API sekaligus untuk memberikan mekanisme yang lebih mudah dalam membuat class layanan.

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

  1. Buat GoogleAdsClient saat browser dimulai, sebelum melayani permintaan pengguna.

  2. Kirim beberapa permintaan persiapan 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 (GoogleAdsException 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.getVersionXXX().createYYYServiceClient() akan membuat koneksi TCP baru.

Anda harus memastikan bahwa Anda menutup klien saat tidak lagi diperlukan. Hal ini dapat dilakukan dalam blok try-with-resources atau dengan memanggil close() pada klien layanan.

Jika Anda mencoba menggunakan klien layanan tertutup 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 sebesar 32 MB untuk setiap file yang diupload. JAR untuk google-ads akan jauh lebih besar dari ini, terlebih lagi menggunakan deployment shadow/shadow jar. Jika men-deploy stoples secara manual, Anda mungkin mendapatkan error seperti:

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

Sebagai gantinya, deploy menggunakan plugin Gradle App Engine atau plugin Maven. Masing-masing memiliki opsi untuk enableJarSplitting yang akan membagi setiap jar menjadi potongan 10 MB dan menguploadnya sebagai gantinya.

Dependensi bayangan

Jika project Anda memiliki dependensi yang bertentangan dengan library, Anda harus memeriksa dependensi project menggunakan salah satu perintah berikut, lalu mengubah dependensi project sesuai kebutuhan.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Jika konflik dependensi tidak dapat diselesaikan, Anda dapat menggunakan versi shaded library.

Maven

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

Gradle

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