Utilizzo avanzato

Questa guida illustra come personalizzare molti degli aspetti più avanzati della libreria client di Java. Un pattern comune è che molte di queste funzionalità si basano sul valore Callable sottostante anziché sui metodi standard. In genere, il callback è un buon posto per cercare altre funzionalità per RPC non documentate qui.

Timeout

La libreria Java fornisce una piattaforma per l'impostazione dei 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 più basso se devi applicare un limite più breve per il tempo massimo per una chiamata API.

Per usare questa funzionalità, devi usare direttamente l'oggetto richiamabile. Ad esempio, se chiami GoogleAdsService.searchStream(), il timeout verrà impostato come segue:

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

Puoi impostare il timeout su un valore pari o superiore a 2 ore, ma l'API potrebbe comunque scadere in tempo per le richieste a lunga esecuzione e restituire un errore DEADLINE_EXCEEDED. Se questo diventa un problema, di solito è meglio suddividere la query ed eseguire i blocchi in parallelo. In questo modo si evita che una richiesta a lunga esecuzione non vada a buon fine e l'unico modo per recuperarla è attivare nuovamente la richiesta dall'inizio.

Riprova impostazioni

La libreria Java fornisce anche una piattaforma per configurare le impostazioni per i nuovi tentativi a livello di chiamata. Per usare questa funzionalità, devi usare direttamente l'oggetto richiamabile. Ad esempio, se chiami GoogleAdsService.searchStream(), le impostazioni per i nuovi tentativi saranno configurate come segue:

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

Ottimizzazione delle prestazioni in fase di avvio

Potresti notare un piccolo ritardo la prima volta che viene creata un'istanza GoogleAdsClient. Ciò è dovuto all'interfaccia fluente per i servizi (GoogleAdsClient.getVersionXX()), che carica tutte le classi API contemporaneamente per fornire un meccanismo più pratico per la creazione delle classi di servizio.

Se le prestazioni della prima richiesta si trovano nel percorso critico della tua applicazione, devi seguire questi passaggi:

  1. Crea il GoogleAdsClient all'avvio prima di pubblicare le richieste degli utenti.

  2. Invia alcune richieste di preparazione all'API Google Ads al primo avvio del processo. 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 (GoogleAdsException ex) {
          // Do nothing, we're expecting this to fail.
        }
      }
    }
    

Le richieste di riscaldamento devono essere eseguite solo una volta per processo. Ogni successiva creazione del client di servizio riutilizzerà automaticamente le classi precaricate.

Riutilizzo del client di servizio

Se possibile, ti consigliamo di riutilizzare le istanze del client di servizio, poiché ogni chiamata a GoogleAdsClient.getVersionXXX().createYYYServiceClient() creerà una nuova connessione TCP.

Devi assicurarti di chiudere il client quando non è più necessario. Questa operazione può essere eseguita 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 client di servizio genererà un valore java.util.concurrent.RejectedExecutionException.

Impossibile eseguire il deployment di App Engine se JAR > 32 MB

App Engine ha una quota di 32 MB per ogni file caricato. Il JAR per google-ads sarà notevolmente più grande di questo, ancor di più utilizzando i deployment di jar/shadow. Se distribuisci jar manualmente, potresti ricevere errori come:

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

Esegui invece il deployment utilizzando il plug-in Gradle o il plug-in Maven di AppEngine. Ognuno ha un'opzione per enableJarSplitting, che suddividerà ciascun jar in blocchi da 10 MB e li caricherà.

Dipendenze shadow

Se il tuo progetto ha dipendenze in conflitto con quelle della libreria, devi controllarle utilizzando uno dei comandi seguenti, quindi modificare le dipendenze del progetto in base alle esigenze.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Se non è possibile risolvere i conflitti di dipendenze, puoi dipendere dalla versione shaded della libreria.

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'