Uso avanzado

En esta guía, se 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 objeto Callable subyacente en lugar de los métodos de conveniencia estándar. Por lo general, el objeto invocable es un buen lugar para buscar otras funciones por RPC que no se documentan aquí.

Tiempo de espera

La biblioteca de Java proporciona una interfaz para establecer tiempos de espera a nivel de llamada. El valor predeterminado se establece según el parámetro de configuración 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 para una llamada a la API.

Para usar esta función, llama al objeto Callable directamente. Por ejemplo, cuando llames a GoogleAdsService.searchStream(), establece el tiempo de espera de la siguiente manera:

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

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

Configuración de reintentos

La biblioteca de Java también proporciona una interfaz para configurar los parámetros de configuración de reintentos a nivel de llamada. Para usar esta función, llama al objeto Callable directamente. Por ejemplo, cuando llames a GoogleAdsService.searchStream(), configura los parámetros de configuración de reintentos de la siguiente manera:

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

Optimización del rendimiento del tiempo de inicio

Es posible que notes una pequeña demora la primera vez que se crea una instancia de GoogleAdsClient. Esto se debe a la interfaz fluida para los servicios (GoogleAdsClient.getLatestVersion()), que carga las clases de servicio de la API a la vez para proporcionar un mecanismo conveniente para construir clientes de servicio.

Si el rendimiento de la primera solicitud está en la ruta crítica de tu aplicación, sigue estos pasos:

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

  2. Envía algunas solicitudes de preparación a la API de Google Ads cuando se inicie el proceso. 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 (ApiException ex) {
          // Do nothing, we're expecting this to fail.
        }
      }
    }
    

Las solicitudes de preparación solo deben ejecutarse una vez por proceso. Cada creación posterior de cliente de servicio vuelve a usar automáticamente las clases precargadas.

Reutilización del cliente de servicio

Debes reutilizar las instancias del cliente de servicio cuando sea práctico, ya que cada llamada a GoogleAdsClient.getLatestVersion().createYYYServiceClient() (o un descriptor de acceso específico de la versión, como getVersion26()) crea una nueva conexión subyacente y los recursos asociados.

Asegúrate de cerrar el cliente de servicio cuando ya no sea necesario. Puedes hacerlo en un bloque try-with-resources o llamando close() en el cliente de servicio.

Si intentas usar un cliente de servicio cerrado para realizar solicitudes a la API, el método del cliente de servicio arroja una excepción java.util.concurrent.RejectedExecutionException.

App Engine no se puede implementar si el archivo JAR es superior a 32 MB

App Engine tiene una cuota de 32 MB para cada archivo subido. El archivo JAR para google-ads es mucho más grande que este, en especial cuando se usan implementaciones de JAR de sombra o de sombra. Si implementas archivos JAR 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-48.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])

En su lugar, realiza la implementación con el complemento de App Engine para Gradle o Maven. Cada complemento proporciona una opción enableJarSplitting que divide cada archivo JAR en fragmentos de 10 MB y, luego, los sube.

Dependencias de sombra

Si tu proyecto tiene dependencias que entran en conflicto con las de la biblioteca, inspecciona la jerarquía de dependencias de tu proyecto con uno de los siguientes comandos, y, luego, modifica las dependencias de tu proyecto según sea necesario (o usa la lista de materiales):

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Si no es posible resolver los conflictos de dependencias, puedes depender de la versión sombreada de la biblioteca:

Maven

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

Gradle

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