Z tego przewodnika dowiesz się, jak dostosować kilka bardziej zaawansowanych aspektów biblioteki klienta Java. Wiele z tych funkcji opiera się na podstawowym obiekcie Callable, a nie na standardowych metodach ułatwiających pracę. Obiekt wywoływalny jest zwykle dobrym miejscem do szukania innych funkcji RPC, które nie są tu udokumentowane.
Czas oczekiwania
Biblioteka Java udostępnia interfejs do ustawiania limitów czasu na poziomie wywołania.
Wartość domyślna jest ustawiana na podstawie ustawienia method_config/timeout w googleads_grpc_service_config.json. Jeśli chcesz wymusić krótszy limit maksymalnego czasu wywołania interfejsu API, ustaw mniejszą wartość.
Aby korzystać z tej funkcji, wywołaj bezpośrednio obiekt Callable. Na przykład podczas wywoływania GoogleAdsService.searchStream() ustaw limit czasu w ten sposób:
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.
}
}
Możesz ustawić limit czasu na 2 godziny lub więcej, ale interfejs API może nadal przekraczać limit czasu w przypadku bardzo długich żądań i zwracać błąd DEADLINE_EXCEEDED.
Jeśli stanie się to problemem, zwykle najlepiej jest podzielić zapytanie i wykonać fragmenty równolegle. Pozwala to uniknąć sytuacji, w której długotrwałe żądanie kończy się niepowodzeniem, a jedynym sposobem na odzyskanie danych jest ponowne uruchomienie żądania od początku.
Ustawienia ponawiania prób
Biblioteka Java udostępnia też interfejs do konfigurowania ustawień ponownych prób na poziomie poszczególnych wywołań. Aby korzystać z tej funkcji, wywołaj bezpośrednio obiekt Callable. Na przykład podczas wywoływania GoogleAdsService.searchStream() skonfiguruj ustawienia ponawiania w ten sposób:
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.
}
}
Optymalizacja czasu uruchamiania
Przy pierwszym tworzeniu instancji GoogleAdsClient możesz zauważyć niewielkie opóźnienie. Wynika to z płynnego interfejsu usług (GoogleAdsClient.getLatestVersion()), który wczytuje klasy usług interfejsu API jednocześnie, aby zapewnić wygodny mechanizm tworzenia klientów usługi.
Jeśli wydajność pierwszego żądania jest na ścieżce krytycznej aplikacji, wykonaj te czynności:
Utwórz
GoogleAdsClientpodczas uruchamiania, przed obsługą żądań użytkowników.Po uruchomieniu procesu wyślij do interfejsu Google Ads API kilka żądań rozgrzewających. Na przykład:
// 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. } } }
Żądania rozgrzewające muszą zostać uruchomione tylko raz na proces. Każde kolejne utworzenie klienta usługi automatycznie wykorzystuje wstępnie załadowane klasy.
Ponowne użycie klienta usługi
W miarę możliwości należy ponownie używać instancji klienta usługi, ponieważ każde wywołanie metody GoogleAdsClient.getLatestVersion().createYYYServiceClient() (lub metody dostępu do konkretnej wersji, np. getVersion26()) tworzy nowe połączenie i powiązane z nim zasoby.
Pamiętaj, aby zamknąć klienta usługi, gdy nie będzie już potrzebny. Możesz to zrobić w bloku try-with-resources lub wywołując close() na kliencie usługi.
Jeśli spróbujesz użyć zamkniętego klienta usługi do wysyłania żądań do interfejsu API, metoda klienta usługi zwróci błąd java.util.concurrent.RejectedExecutionException.
Nie można wdrożyć App Engine, jeśli plik JAR jest większy niż 32 MB
App Engine ma limit 32 MB na każdy przesłany plik. Plik JAR dla google-ads jest znacznie większy, zwłaszcza w przypadku wdrożeń JAR typu shade lub shadow. Jeśli wdrażasz pliki JAR ręcznie, mogą pojawić się błędy, takie jak:
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])
Zamiast tego przeprowadź wdrożenie za pomocą wtyczki Gradle lub wtyczki Maven App Engine. Każda wtyczka udostępnia opcję enableJarSplitting, która dzieli każdy plik JAR na fragmenty o rozmiarze 10 MB i przesyła je zamiast całego pliku.
Zależności shadow
Jeśli Twój projekt ma zależności, które są sprzeczne z zależnościami biblioteki, sprawdź hierarchię zależności projektu za pomocą jednego z tych poleceń, a następnie zmodyfikuj zależności projektu zgodnie z potrzebami (lub użyj zestawienia komponentów):
Maven
mvn dependency:treeGradle
./gradlew dependenciesJeśli rozwiązanie konfliktów zależności jest niemożliwe, możesz zamiast tego użyć zacienionej wersji biblioteki:
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'