Zaawansowane użycie

Z tego przewodnika dowiesz się, jak dostosować kilka bardziej zaawansowanych aspektów biblioteki klienta Java. Często te funkcje korzystają z Callable zamiast ze standardowych metod. 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 poszczególnych wywołań. Wartość domyślna jest ustawiana na podstawie ustawienia method_config/timeout w pliku googleads_grpc_service_config.json. Jeśli chcesz wymusić krótszy limit maksymalnego czasu wywołania interfejsu API, ustaw niższą wartość.

Aby korzystać z tej funkcji, użyj bezpośrednio obiektu wywoływalnego. Jeśli na przykład wywołasz funkcję GoogleAdsService.searchStream(), limit czasu zostanie ustawiony w ten sposób:

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

Możesz ustawić limit czasu na 2 godziny lub więcej, ale interfejs API może nadal przekraczać limit czasu w przypadku bardzo długotrwałych żądań i zwracać błąd DEADLINE_EXCEEDED. Jeśli to się stanie, zwykle najlepiej jest podzielić zapytanie i wykonać części równolegle. Pozwoli to uniknąć sytuacji, w której długotrwałe żądanie zakończy się niepowodzeniem, a jedynym sposobem na odzyskanie danych będzie ponowne uruchomienie żądania od początku.

Ustawienia ponawiania

Biblioteka Java udostępnia też interfejs do konfigurowania ustawień ponawiania na poziomie poszczególnych wywołań. Aby korzystać z tej funkcji, użyj bezpośrednio obiektu wywoływalnego. Jeśli na przykład wywołujesz GoogleAdsService.searchStream(), ustawienia ponawiania będą skonfigurowane w ten sposób:

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

Optymalizacja czasu uruchamiania

Przy pierwszym tworzeniu instancji GoogleAdsClient możesz zauważyć niewielkie opóźnienie. Wynika to z interfejsu usług (GoogleAdsClient.getVersionXX()), który wczytuje wszystkie klasy interfejsu API jednocześnie, aby zapewnić wygodniejszy mechanizm tworzenia klas usług.

Jeśli wydajność pierwszego żądania ma kluczowe znaczenie dla Twojej aplikacji, wykonaj te czynności:

  1. Utwórz GoogleAdsClient podczas uruchamiania, zanim zaczniesz obsługiwać żądania użytkowników.

  2. Na początku procesu wyślij kilka żądań rozgrzewających do interfejsu Google Ads API. 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 (GoogleAdsException ex) {
          // Do nothing, we're expecting this to fail.
        }
      }
    }
    

Żądania rozgrzewające należy uruchomić tylko raz na proces. Każde kolejne utworzenie klienta usługi będzie automatycznie ponownie wykorzystywać wstępnie załadowane klasy.

Ponowne użycie klienta usługi

W miarę możliwości używaj ponownie instancji klienta usługi, ponieważ każde wywołanie funkcji GoogleAdsClient.getVersionXXX().createYYYServiceClient() tworzy nowe połączenie TCP.

Musisz zamknąć klienta, gdy nie jest już potrzebny. Można to zrobić w bloku try-with-resources lub wywołując close() w 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 zgłosi wyjątek java.util.concurrent.RejectedExecutionException.

Nie udało się wdrożyć App Engine, jeśli plik JAR ma więcej niż 32 MB

App Engine ma limit 32 MB na każdy przesłany plik. Plik JAR dla google-ads będzie znacznie większy, zwłaszcza w przypadku wdrożeń z użyciem pliku JAR z zacienieniem lub cieniem. Jeśli wdrażasz pliki JAR ręcznie, mogą pojawić się takie błędy:

ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-38.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])

Zamiast tego wdróż aplikację za pomocą wtyczki Gradle lub wtyczki Maven App Engine. Każda z nich ma opcję enableJarSplitting, która dzieli każdy plik JAR na części o rozmiarze 10 MB i przesyła je zamiast całego pliku.

Zależności cienia

Jeśli Twój projekt ma zależności, które są sprzeczne z zależnościami biblioteki, sprawdź zależności projektu za pomocą jednego z tych poleceń, a następnie zmodyfikuj je w razie potrzeby.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Jeś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>38.0.0</version>
</dependency>

Gradle

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