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 dependen del Callable subyacente, en lugar de los métodos de conveniencia estándar. Por lo general, el elemento que admite llamadas
es un buen lugar para buscar otras funciones por RPC que no se documentan
aquí.
Tiempo de espera
La biblioteca de Java proporciona una superficie para establecer tiempos de espera por 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 de una llamada a la API.
Para usar esta función, llama directamente al objeto Callable. 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 la API puede agotar el tiempo de espera de las solicitudes de ejecución muy prolongada y devolver un error DEADLINE_EXCEEDED.
Si esto se convierte en un problema, lo mejor suele ser dividir la consulta y
ejecutar los fragmentos en paralelo. Esto evita que una solicitud de larga duración
falle y que la única forma de recuperarse sea volver a activar la solicitud desde
el principio.
Configuración de reintentos
La biblioteca de Java también proporciona una superficie para configurar los parámetros de reintento a nivel de cada llamada. Para usar esta función, llama directamente al objeto Callable. Por
ejemplo, cuando llames a GoogleAdsService.searchStream(), configura los parámetros de reintento
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 se encuentra en la ruta de acceso crítica de tu aplicación, sigue estos pasos:
Crea el
GoogleAdsClientdurante el inicio, antes de entregar las solicitudes de los usuarios.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 se deben ejecutar una vez por proceso. Cada creación posterior del cliente de servicio reutiliza automáticamente las clases precargadas.
Reutilización del cliente de servicio
Debes reutilizar las instancias de 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 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 a
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 un java.util.concurrent.RejectedExecutionException.
App Engine no se implementa si el archivo JAR supera los 32 MB
App Engine tiene una cuota de 32 MB para cada archivo subido. El JAR para google-ads
es considerablemente más grande que este, en especial cuando se usan implementaciones de JAR
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.1.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])
En su lugar, implementa con el complemento de Gradle o el
complemento de Maven de App Engine. Cada complemento proporciona una opción enableJarSplitting
que divide cada JAR en fragmentos de 10 MB y, en su lugar, sube esos fragmentos.
Dependencias no administradas
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:treeGradle
./gradlew dependenciesSi no es posible resolver los conflictos de dependencias, puedes depender de la versión shaded de la biblioteca:
Maven
<dependency> <groupId>com.google.api-ads</groupId> <artifactId>google-ads-shadowjar</artifactId> <version>48.1.0</version> </dependency>
Gradle
implementation 'com.google.api-ads:google-ads-shadowjar:48.1.0'