Bu kılavuzda, Java istemci kitaplığının daha gelişmiş özelliklerinden bazılarının nasıl özelleştirileceği açıklanmaktadır. Bu özelliklerin çoğu, standart kolaylık yöntemleri yerine temel Callable'yi kullanır. Callable, burada belgelenmemiş diğer RPC başına özellikler için genellikle iyi bir yerdir.
Zaman aşımı
Java kitaplığı, her çağrı düzeyinde zaman aşımı ayarlamak için bir yüzey sağlar.
Varsayılan değer, googleads_grpc_service_config.json'deki method_config/timeout ayarına göre belirlenir. Bir API çağrısının maksimum süresi için daha kısa bir sınır uygulamanız gerekiyorsa daha düşük bir değer ayarlayın.
Bu özelliği kullanmak için Callable nesnesini doğrudan çağırın. Örneğin, GoogleAdsService.searchStream() işlevini çağırırken zaman aşımını aşağıdaki gibi ayarlayın:
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.
}
}
Zaman aşımını 2 saat veya daha uzun bir süreye ayarlayabilirsiniz ancak API, son derece uzun süren isteklerde zaman aşımına uğrayabilir ve DEADLINE_EXCEEDED hatası döndürebilir.
Bu durum sorun haline gelirse genellikle sorguyu bölmek ve parçaları paralel olarak yürütmek en iyisidir. Bu sayede, uzun süren bir isteğin başarısız olduğu ve kurtarmanın tek yolunun isteği baştan tekrar tetiklemek olduğu durum önlenir.
Yeniden deneme ayarları
Java kitaplığı, yeniden deneme ayarlarını çağrı düzeyinde yapılandırmak için de bir yüzey sağlar. Bu özelliği kullanmak için Callable nesnesini doğrudan çağırın. Örneğin, GoogleAdsService.searchStream() çağrılırken yeniden deneme ayarlarını aşağıdaki gibi yapılandırın:
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.
}
}
Başlatma süresi performans optimizasyonu
Bir GoogleAdsClient örneği ilk kez oluşturulduğunda kısa bir gecikme yaşanabilir. Bunun nedeni, hizmetler için akıcı arayüzdür
(GoogleAdsClient.getLatestVersion()). Bu arayüz, hizmet istemcileri oluşturmak için uygun bir mekanizma sağlamak üzere API hizmeti sınıflarını aynı anda yükler.
İlk istek performansı uygulamanızın kritik yolundaysa şu adımları uygulayın:
GoogleAdsClient, başlangıçta kullanıcı istekleri sunulmadan önce oluşturulur.İşlem ilk başladığında Google Ads API'ye birkaç hazırlık isteği gönderin. Örneğin:
// 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. } } }
Isınma isteklerinin her işlem için yalnızca bir kez çalıştırılması gerekir. Sonraki her hizmet istemcisi oluşturma işleminde önceden yüklenmiş sınıflar otomatik olarak yeniden kullanılır.
Hizmet istemcisini yeniden kullanma
GoogleAdsClient.getLatestVersion().createYYYServiceClient() (veya getVersion26() gibi sürüme özel bir erişimci) her çağrıldığında yeni bir temel bağlantı ve ilişkili kaynaklar oluşturulduğundan, hizmet istemcisi örneklerini mümkün olduğunca yeniden kullanmanız gerekir.
Artık gerekli olmadığında hizmet istemcisini kapattığınızdan emin olun. Bunu try-with-resources bloğunda veya hizmet istemcisinde close() işlevini çağırarak yapabilirsiniz.
API istekleri göndermek için kapalı bir hizmet istemcisi kullanmaya çalışırsanız hizmet istemcisi yöntemi java.util.concurrent.RejectedExecutionException hatası verir.
JAR > 32 MB ise App Engine dağıtılamaz
App Engine'de yüklenen her dosya için 32 MB kota vardır. google-ads için JAR, özellikle gölge veya shadow JAR dağıtımları kullanılırken bundan çok daha büyüktür. JAR'ları manuel olarak dağıtırsanız aşağıdaki gibi hatalar alabilirsiniz:
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])
Bunun yerine, App Engine Gradle eklentisini veya Maven eklentisini kullanarak dağıtım yapın. Her eklenti, her JAR'ı 10 MB'lık parçalara bölen ve bunları yükleyen bir enableJarSplitting seçeneği sunar.
Gölge bağımlılıkları
Projenizde kitaplığın bağımlılıklarıyla çakışan bağımlılıklar varsa aşağıdaki komutlardan birini kullanarak projenizin bağımlılık hiyerarşisini inceleyin ve ardından projenizin bağımlılıklarını gerektiği gibi değiştirin (veya BoM'yi kullanın):
Maven
mvn dependency:treeGradle
./gradlew dependenciesBağımlılık çakışmalarını çözmek mümkün değilse kitaplığın gölgeli sürümüne bağlı kalabilirsiniz:
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'