Utilizzo avanzato

Questa guida descrive come personalizzare alcuni degli aspetti più avanzati della libreria client Java. Un pattern comune è che molte di queste funzionalità si basano sull'Callable sottostante anziché sui metodi di convenienza standard. Il callable è in genere un buon punto di partenza per cercare altre funzionalità per RPC non documentate qui.

Timeout

La libreria Java fornisce una superficie per impostare i timeout a livello di singola chiamata. Il valore predefinito è impostato in base all'impostazione method_config/timeout in googleads_grpc_service_config.json. Imposta un valore inferiore se devi applicare un limite più breve al tempo massimo per una chiamata API.

Per utilizzare questa funzionalità, chiama direttamente l'oggetto Callable. Ad esempio, quando chiami GoogleAdsService.searchStream(), imposta il timeout come segue:

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

Puoi impostare il timeout su 2 ore o più, ma l'API potrebbe comunque scadere richieste di esecuzione molto lunga e restituire un errore DEADLINE_EXCEEDED. Se questo diventa un problema, in genere è meglio dividere la query ed eseguire i blocchi in parallelo. In questo modo si evita la situazione in cui una richiesta di lunga durata non va a buon fine e l'unico modo per recuperare è riavviarla dall'inizio.

Impostazioni dei tentativi

La libreria Java fornisce anche una superficie per configurare le impostazioni di nuovi tentativi a livello di chiamata. Per utilizzare questa funzionalità, chiama direttamente l'oggetto Callable. Ad esempio, quando chiami GoogleAdsService.searchStream(), configura le impostazioni di riprova come segue:

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

Ottimizzazione del rendimento del tempo di avvio

Potresti notare un piccolo ritardo la prima volta che viene creata un'istanza GoogleAdsClient. Ciò è dovuto all'interfaccia fluida per i servizi (GoogleAdsClient.getLatestVersion()), che carica le classi di servizio API contemporaneamente per fornire un meccanismo conveniente per la creazione di client di servizio.

Se il rendimento della prima richiesta è nel percorso critico della tua applicazione, segui questi passaggi:

  1. Crea GoogleAdsClient all'avvio, prima di gestire le richieste degli utenti.

  2. Invia alcune richieste di riscaldamento all'API Google Ads all'inizio della procedura. Ad esempio:

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

Le richieste di pre-riscaldamento devono essere eseguite una sola volta per processo. Ogni successiva creazione di un client di servizio riutilizza automaticamente le classi precaricate.

Riutilizzo del client di servizio

È consigliabile riutilizzare le istanze del client di servizio quando possibile, perché ogni chiamata a GoogleAdsClient.getLatestVersion().createYYYServiceClient() (o a un accessor specifico della versione, ad esempio getVersion25()) crea una nuova connessione sottostante e risorse associate.

Assicurati di chiudere il client di servizio quando non è più necessario. Puoi eseguire questa operazione in un blocco try-with-resources o chiamando close() sul client di servizio.

Se tenti di utilizzare un client di servizio chiuso per effettuare richieste API, il metodo del client di servizio genera un errore java.util.concurrent.RejectedExecutionException.

Il deployment di App Engine non riesce se il file JAR è superiore a 32 MB

App Engine ha una quota di 32 MB per ogni file caricato. Il file JAR per google-ads è notevolmente più grande, soprattutto quando si utilizzano deployment JAR ombreggiati. Se esegui il deployment dei file JAR manualmente, potresti ricevere errori come:

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

Esegui invece il deployment utilizzando il plug-in Gradle o il plug-in Maven di App Engine. Ogni plug-in fornisce un'opzione enableJarSplitting che suddivide ogni file JAR in blocchi da 10 MB e carica questi ultimi.

Dipendenze shadow

Se il tuo progetto ha dipendenze in conflitto con quelle della libreria, ispeziona la gerarchia delle dipendenze del progetto utilizzando uno dei seguenti comandi, quindi modifica le dipendenze del progetto in base alle esigenze (o utilizza la distinta base):

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Se la risoluzione dei conflitti di dipendenza non è fattibile, puoi utilizzare la versione ombreggiata della libreria:

Maven

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

Gradle

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