Fortgeschrittene Nutzung

In diesem Leitfaden wird beschrieben, wie Sie einige der erweiterten Funktionen der Java-Clientbibliothek anpassen. Häufig basieren viele dieser Funktionen auf der zugrunde liegenden Callable und nicht auf den Standardmethoden. Im aufrufbaren Objekt finden Sie in der Regel auch andere RPC-spezifische Funktionen, die hier nicht dokumentiert sind.

Zeitlimit

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

Wenn Sie diese Funktion verwenden möchten, sollten Sie das aufrufbare Objekt direkt verwenden. Wenn du beispielsweise GoogleAdsService.searchStream() aufrufst, wird die Zeitüberschreitung so festgelegt:

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

Sie können das Zeitlimit auf mindestens zwei Stunden festlegen. Bei extrem lang laufenden Anfragen kann es jedoch trotzdem zu einem Zeitlimit der API kommen, wodurch der Fehler DEADLINE_EXCEEDED zurückgegeben wird. Wenn dies ein Problem darstellt, ist es in der Regel am besten, die Abfrage aufzuteilen und die einzelnen Teile parallel auszuführen. So wird verhindert, dass eine langlaufende Anfrage fehlschlägt und die einzige Möglichkeit zur Wiederherstellung darin besteht, die Anfrage noch einmal von vorn auszulösen.

Einstellungen für Wiederholungen

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

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

Leistungsoptimierung beim Starten

Wenn Sie zum ersten Mal eine GoogleAdsClient-Instanz erstellen, kann es zu einer kurzen Verzögerung kommen. Das liegt an der Fluent-API für Dienste (GoogleAdsClient.getVersionXX()), über die alle API-Klassen gleichzeitig geladen werden, um einen praktischeren Mechanismus zum Erstellen von Dienstklassen bereitzustellen.

Wenn die Leistung der ersten Anfrage auf dem kritischen Pfad Ihrer Anwendung liegt, gehen Sie so vor:

  1. Erstelle die GoogleAdsClient beim Starten, bevor Nutzeranfragen verarbeitet werden.

  2. Senden Sie zu Beginn des Prozesses einige Aufwärmanfragen an die Google Ads API. 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 (GoogleAdsException 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 des Dienstclients

Sie sollten Dienstclientinstanzen nach Möglichkeit wiederverwenden, da bei jedem Aufruf von GoogleAdsClient.getVersionXXX().createYYYServiceClient() eine neue TCP-Verbindung erstellt wird.

Sie müssen den Client schließen, wenn er nicht mehr benötigt wird. Dies kann in einem try-with-resources-Block oder durch Aufrufen von close() auf dem Dienstclient erfolgen.

Wenn Sie versuchen, mit einem geschlossenen Dienstclient API-Anfragen zu stellen, wird von der Dienstclientmethode eine java.util.concurrent.RejectedExecutionException geworfen.

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

Für jede hochgeladene Datei gilt in der App Engine ein Kontingent von 32 MB. Die JAR-Datei für google-ads ist deutlich größer, insbesondere bei Shade-/Shadow-JAR-Bereitstellungen. 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-34.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])

Verwenden Sie stattdessen das Gradle-Plug-in oder das Maven-Plug-in der App Engine. Für jedes gibt es eine Option für enableJarSplitting, mit der jedes JAR in 10-MB-Chunks aufgeteilt und stattdessen hochgeladen wird.

Schattenabhängigkeiten

Wenn Ihr Projekt Abhängigkeiten hat, die mit denen der Bibliothek in Konflikt stehen, sollten Sie die Abhängigkeiten Ihres Projekts mit einem der folgenden Befehle prüfen und dann nach Bedarf ändern.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Wenn die Behebung von Abhängigkeitskonflikten nicht möglich ist, können Sie stattdessen die schattierte Version der Bibliothek verwenden.

Maven

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

Gradle

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