Fortgeschrittene Nutzung

In diesem Leitfaden wird beschrieben, wie Sie einige der erweiterten Aspekte der Java-Clientbibliothek anpassen. Viele dieser Funktionen basieren auf dem zugrunde liegenden Callable und nicht auf den Standardmethoden. Das Callable ist in der Regel ein guter Ort, um nach anderen RPC-spezifischen Funktionen zu suchen, die hier nicht dokumentiert sind.

Zeitüberschreitung

Die Java-Bibliothek bietet eine Oberfläche zum Festlegen von Zeitlimits auf Anrufebene. Der Standardwert wird anhand der method_config/timeout Einstellung in googleads_grpc_service_config.json festgelegt. Legen Sie einen niedrigeren Wert fest, wenn Sie ein kürzeres Limit für die maximale Zeit für einen API-Aufruf erzwingen möchten.

Wenn Sie diese Funktion verwenden möchten, rufen Sie das Callable-Objekt direkt auf. Wenn Sie beispielsweise GoogleAdsService.searchStream() aufrufen, legen Sie das Zeitlimit so fest:

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

Sie können das Zeitlimit auf 2 Stunden oder mehr festlegen. Die API kann jedoch bei extrem langen Anfragen trotzdem ein Zeitlimit überschreiten und einen DEADLINE_EXCEEDED Fehler zurückgeben. Wenn dies ein Problem darstellt, ist es in der Regel am besten, die Abfrage aufzuteilen und die Teile parallel auszuführen. So wird vermieden, dass eine lange Anfrage fehlschlägt und die einzige Möglichkeit zur Wiederherstellung darin besteht, die Anfrage noch einmal von Anfang an auszulösen.

Wiederholungseinstellungen

Die Java-Bibliothek bietet auch eine Oberfläche zum Konfigurieren von Wiederholungseinstellungen auf Anrufebene. Wenn Sie diese Funktion verwenden möchten, rufen Sie das Callable-Objekt direkt auf. Wenn Sie beispielsweise GoogleAdsService.searchStream() aufrufen, konfigurieren Sie die Wiederholungseinstellungen so:

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

Leistungsoptimierung der Startzeit

Möglicherweise bemerken Sie eine kurze Verzögerung, wenn zum ersten Mal eine GoogleAdsClient-Instanz erstellt wird. Das liegt an der Fluent-Schnittstelle für Dienste (GoogleAdsClient.getLatestVersion()), die die API-Dienstklassen gleichzeitig lädt, um einen praktischen Mechanismus zum Erstellen von Dienstclients zu bieten.

Wenn die Leistung der ersten Anfrage für Ihre Anwendung entscheidend ist, gehen Sie so vor:

  1. Erstellen Sie GoogleAdsClient beim Start, bevor Sie Nutzeranfragen bearbeiten.

  2. Senden Sie einige Aufwärmanfragen an die Google Ads API, wenn der Prozess zum ersten Mal gestartet wird. Beispiel:

    // 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.
        }
      }
    }
    

Die Aufwärmanfragen müssen nur einmal pro Prozess ausgeführt werden. Bei jeder nachfolgenden Erstellung eines Dienstclients werden die vorab geladenen Klassen automatisch wiederverwendet.

Wiederverwendung von Dienstclients

Sie sollten Dienstclientinstanzen nach Möglichkeit wiederverwenden, da bei jedem Aufruf von GoogleAdsClient.getLatestVersion().createYYYServiceClient() (oder einem versionsspezifischen Accessor wie getVersion26()) eine neue zugrunde liegende Verbindung und zugehörige Ressourcen erstellt werden.

Schließen Sie den Dienstclient, wenn er nicht mehr benötigt wird. Sie können dies in einem Try-with-Resources-Block tun oder close() für den Dienstclient aufrufen.

Wenn Sie versuchen, mit einem geschlossenen Dienstclient API-Anfragen zu stellen, löst die Dienstclientmethode eine java.util.concurrent.RejectedExecutionException aus.

App Engine kann nicht bereitgestellt werden, wenn die JAR-Datei größer als 32 MB ist

App Engine hat ein Kontingent von 32 MB für jede hochgeladene Datei. Die JAR-Datei für google-ads ist deutlich größer, insbesondere bei der Bereitstellung von Shade- oder Shadow-JAR-Dateien. Wenn Sie JAR-Dateien manuell bereitstellen, können Fehler wie die folgenden auftreten:

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

Stellen Sie stattdessen das App Engine Gradle-Plug-in oder Maven-Plug-in bereit. Jedes Plug-in bietet die Option enableJarSplitting, mit der jede JAR-Datei in 10-MB-Blöcke aufgeteilt und stattdessen hochgeladen wird.

Shadow-Abhängigkeiten

Wenn Ihr Projekt Abhängigkeiten hat, die mit den Abhängigkeiten der Bibliothek in Konflikt stehen, prüfen Sie die Abhängigkeitshierarchie Ihres Projekts mit einem der folgenden Befehle und ändern Sie dann die Abhängigkeiten Ihres Projekts nach Bedarf (oder verwenden Sie die Materialliste):

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Wenn es nicht möglich ist, Abhängigkeitskonflikte zu beheben, können Sie stattdessen von der Shaded Version der Bibliothek abhängig sein:

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'