Erweiterte Nutzung

In diesem Leitfaden wird beschrieben, wie Sie einige der komplexeren Aspekte der Java-Clientbibliothek anpassen. Ein gängiges Muster ist, dass viele dieser Funktionen auf der zugrunde liegenden Callable statt auf den Standardmethoden basieren. Das Callable ist im Allgemeinen ein guter Ort, um nach anderen Pro-RPC-Features zu suchen, 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 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üssen.

Für diese Funktion muss direkt das Callable-Objekt verwendet werden. Wenn Sie beispielsweise GoogleAdsService.searchStream() aufrufen, wird das Zeitlimit 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 2 Stunden oder mehr festlegen. Bei extrem lang andauernden Anfragen kann die API aber trotzdem den Fehler DEADLINE_EXCEEDED zurückgeben. Wenn dies zu einem Problem wird, ist es in der Regel am besten, die Abfrage aufzuteilen und die Blöcke parallel auszuführen. Dadurch wird die Situation vermieden, dass eine lang andauernde Anfrage fehlschlägt und die einzige Möglichkeit zur Wiederherstellung darin besteht, die Anfrage von Anfang an auszulösen.

Wiederholungseinstellungen

Die Java-Bibliothek bietet auch eine Oberfläche zum Konfigurieren von Wiederholungseinstellungen auf Aufrufebene. Für diese Funktion muss direkt das Callable-Objekt verwendet werden. 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 bei der Startzeit

Bei der ersten Erstellung einer GoogleAdsClient-Instanz kann es zu einer leichten Verzögerung kommen. Dies liegt an der fluent-Schnittstelle für Dienste (GoogleAdsClient.getVersionXX()), die alle API-Klassen gleichzeitig lädt, um einen bequemeren Mechanismus zum Erstellen von Dienstklassen bereitzustellen.

Wenn sich die Leistung der ersten Anfrage im kritischen Pfad für Ihre Anwendung befindet, gehen Sie so vor:

  1. Erstellen Sie die GoogleAdsClient beim Start, bevor Sie Nutzeranfragen verarbeiten.

  2. Zu Beginn des Prozesses müssen einige Aufwärmanfragen an die Google Ads API gesendet werden. 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 von Dienstclients

Sie sollten Dienstclientinstanzen nach Möglichkeit wiederverwenden, da mit jedem Aufruf von GoogleAdsClient.getVersionXXX().createYYYServiceClient() eine neue TCP-Verbindung hergestellt 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, einen geschlossenen Dienstclient zu verwenden, um API-Anfragen zu senden, löst die Dienstclient-Methode eine java.util.concurrent.RejectedExecutionException aus.

App Engine kann nicht bereitgestellt werden, wenn JAR-Dateien > 32 MB sind

App Engine hat für jede hochgeladene Datei ein Kontingent von 32 MB. Die JAR-Datei für google-ads ist deutlich größer, insbesondere bei Verwendung von Shader-/Shadow-JAR-Bereitstellungen. Wenn Sie JAR-Dateien manuell bereitstellen, können folgende Fehler auftreten:

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

Verwenden Sie für die Bereitstellung stattdessen das Gradle-Plug-in oder das Maven-Plug-in von AppEngine. Jede hat eine Option für enableJarSplitting, mit der jede JAR-Datei in 10-MB-Blöcke aufgeteilt wird und diese stattdessen hochgeladen werden.

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 überprüfen und dann die Abhängigkeiten Ihres Projekts nach Bedarf ändern.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Wenn Abhängigkeitskonflikte nicht gelöst werden können, können Sie stattdessen auf die shaded der Bibliothek zurückgreifen.

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'