Uso avanzado

Esta guía describe cómo personalizar varios de los aspectos más avanzados de la biblioteca cliente de Java. Un patrón común es que muchas de estas funciones se basan en el Callable subyacentes en lugar de los métodos estándar. La función que admite llamadas es por lo general, es un buen lugar para buscar otras funciones por RPC que no están documentadas aquí.

Tiempo de espera

La biblioteca de Java proporciona una plataforma para configurar los tiempos de espera a nivel de cada llamada. El valor predeterminado se establece según la configuración de method_config/timeout en googleads_grpc_service_config.json. Establece un valor más bajo si necesitas aplicar un límite más corto en el tiempo máximo de una llamada a la API.

Para usar esta función, debes usar directamente el objeto que admite llamadas. Por ejemplo, Si llamas a GoogleAdsService.searchStream(), el tiempo de espera se establecerá de la siguiente manera:

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

Puedes establecer el tiempo de espera en 2 horas o más, pero es posible que se agote el tiempo de espera de la API solicitudes de larga duración y muestran Error DEADLINE_EXCEEDED. Si esto se convierte en un problema, suele ser mejor dividir la consulta ejecutar los fragmentos en paralelo; esto evita la situación en la que un largo la solicitud en ejecución falla y la única forma de recuperarla es activar la solicitud de nuevo desde el principio.

Configuración de reintentos

La biblioteca de Java también proporciona una plataforma para definir la configuración de reintentos en una nivel por llamada. Para usar esta función, debes usar directamente el objeto que admite llamadas. Por ejemplo, si llamas a GoogleAdsService.searchStream(), la configuración de reintento se configuraría de la siguiente manera:

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

Optimización del rendimiento del tiempo de inicio

Es posible que notes una pequeña demora la primera vez que se ejecute una instancia de GoogleAdsClient crear. Esto se debe a la fluidez de la interfaz para los servicios (GoogleAdsClient.getVersionXX()), que carga todas las clases de API en una vez para brindar un mecanismo más conveniente para construir las clases de servicio.

Si el rendimiento de la primera solicitud se encuentra en la ruta crítica de tu aplicación debes seguir estos pasos:

  1. Crea el GoogleAdsClient en el inicio, antes de entregar las solicitudes de los usuarios.

  2. Enviar algunas solicitudes de preparación a la API de Google Ads cuando el proceso se complete por primera vez comienza el ciclo de vida. Por ejemplo:

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

Las solicitudes de preparación solo se deben ejecutar una vez por proceso. Cada uno la creación de clientes de servicio reutilizará automáticamente las clases precargadas.

Reutilización del cliente de servicios

Debes reutilizar las instancias de cliente de servicio cuando sea práctico, ya que cada llamada a GoogleAdsClient.getVersionXXX().createYYYServiceClient() creará un nuevo conexión TCP.

Debes asegurarte de cerrar el cliente cuando ya no sea necesario. Esta se puede hacer en una prueba-con-recursos o llamando a close() en el cliente de servicio.

Si intentas usar un cliente de servicio cerrado para hacer solicitudes a la API, el servicio del cliente arrojará una java.util.concurrent.RejectedExecutionException.

App Engine no se puede implementar si JAR > 32 MB

App Engine tiene una cuota de 32 MB para cada archivo subido. El archivo JAR para google-ads serán considerablemente más grandes que este, incluso más usando sombra/shadow jar de Google Cloud. Si implementas los jars de forma manual, es posible que recibas errores como los siguientes:

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

En su lugar, implementa con el comando Complemento de Gradle o complemento de Maven. Cada uno tiene una opción para enableJarSplitting, que dividirá cada jar en fragmentos de 10 MB y subirlos en su lugar.

Dependencias paralelas

Si tu proyecto tiene dependencias que entran en conflicto con las de la biblioteca, deberías inspeccionar las dependencias de tu proyecto con uno de los siguientes comandos, luego, y modificar las dependencias de tu proyecto según sea necesario.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Si la resolución de conflictos de dependencias es inviable, puedes depender del sombreado de la biblioteca.

Maven

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

Gradle

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