Este guia descreve como personalizar vários aspectos mais avançados da
biblioteca de cliente Java. Um padrão comum é que muitos desses recursos dependem do Callable subjacente em vez dos métodos de conveniência padrão. O objeto
chamável geralmente é um bom lugar para procurar outros recursos por RPC que não estão
documentados aqui.
Tempo limite
A biblioteca Java oferece uma superfície para definir tempos limite em nível de chamada.
O valor padrão é definido com base na configuração method_config/timeout em
googleads_grpc_service_config.json. Defina um valor menor
se você precisar aplicar um limite menor no tempo máximo de uma chamada de API.
Para usar esse recurso, chame o objeto Callable diretamente. Por exemplo, ao
chamar GoogleAdsService.searchStream(), defina o tempo limite da seguinte maneira:
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.
}
}
É possível definir o tempo limite como duas horas ou mais, mas a API ainda pode atingir o tempo limite de solicitações de execução extremamente longa e retornar um erro DEADLINE_EXCEEDED.
Se isso se tornar um problema, geralmente é melhor dividir a consulta e executar os blocos em paralelo. Isso evita a situação em que uma solicitação de longa duração falha e a única maneira de recuperar é acionar a solicitação novamente desde o início.
Configurações de repetição
A biblioteca Java também oferece uma interface para configurar as configurações de nova tentativa em um
nível por chamada. Para usar esse recurso, chame o objeto Callable diretamente. Por
exemplo, ao chamar GoogleAdsService.searchStream(), configure as configurações de
nova tentativa da seguinte maneira:
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.
}
}
Otimização da performance do tempo de inicialização
Você pode notar um pequeno atraso na primeira vez que uma instância GoogleAdsClient é
criada. Isso ocorre devido à interface fluente para serviços (GoogleAdsClient.getLatestVersion()), que carrega as classes de serviço da API de uma só vez para fornecer um mecanismo conveniente de construção de clientes de serviço.
Se a performance da primeira solicitação estiver no caminho crítico do seu aplicativo, siga estas etapas:
Crie o
GoogleAdsClientna inicialização, antes de atender às solicitações do usuário.Envie algumas solicitações de aquecimento para a API Google Ads quando o processo for iniciado. Exemplo:
// 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. } } }
As solicitações de aquecimento só precisam ser executadas uma vez por processo. Cada criação subsequente de cliente de serviço reutiliza automaticamente as classes pré-carregadas.
Reutilização de clientes de serviço
É recomendável reutilizar instâncias de cliente de serviço sempre que possível, porque cada chamada para
GoogleAdsClient.getLatestVersion().createYYYServiceClient() (ou um
acessador específico da versão, como getVersion25())
cria uma nova conexão subjacente e recursos associados.
Feche o cliente de serviço quando ele não for mais necessário. É possível fazer isso em um bloco try-with-resources ou chamando
close() no cliente de serviço.
Se você tentar usar um cliente de serviço fechado para fazer solicitações de API, o método do cliente de serviço vai gerar um java.util.concurrent.RejectedExecutionException.
O App Engine não implanta se o JAR for maior que 32 MB
O App Engine tem uma cota de 32 MB para cada arquivo enviado. O JAR para google-ads
é consideravelmente maior do que isso, especialmente ao usar implantações
de JAR de sombra ou shade. Se você implantar JARs manualmente, poderá receber erros como:
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])
Em vez disso, faça a implantação usando o plug-in Gradle ou o plug-in Maven do App Engine. Cada plug-in oferece uma opção enableJarSplitting
que divide cada JAR em partes de 10 MB e faz upload delas.
Dependências ocultas
Se o projeto tiver dependências que entram em conflito com as da biblioteca, inspecione a hierarquia de dependências do projeto usando um dos seguintes comandos e modifique as dependências do projeto conforme necessário (ou use a lista de materiais):
Maven
mvn dependency:treeGradle
./gradlew dependenciesSe não for possível resolver conflitos de dependência, use a versão shaded da biblioteca:
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'