Hướng dẫn này trình bày cách tuỳ chỉnh một số khía cạnh nâng cao hơn của thư viện ứng dụng Java. Một mẫu phổ biến là nhiều tính năng trong số này dựa vào Callable cơ bản thay vì các phương thức tiện lợi tiêu chuẩn. Thông thường, lệnh gọi là nơi phù hợp để tìm các tính năng khác trên mỗi RPC không được ghi lại ở đây.
Hết giờ
Thư viện Java cung cấp một nền tảng để đặt thời gian chờ ở cấp độ mỗi lệnh gọi.
Giá trị mặc định được đặt dựa trên chế độ cài đặt method_config/timeout trong googleads_grpc_service_config.json. Đặt giá trị thấp hơn nếu bạn cần thực thi giới hạn ngắn hơn về thời gian tối đa cho một lệnh gọi API.
Để sử dụng tính năng này, hãy gọi trực tiếp đối tượng Callable. Ví dụ: khi gọi GoogleAdsService.searchStream(), hãy đặt thời gian chờ như sau:
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.
}
}
Bạn có thể đặt thời gian chờ thành 2 giờ trở lên, nhưng API vẫn có thể hết thời gian chờ đối với các yêu cầu chạy cực kỳ lâu và trả về lỗi DEADLINE_EXCEEDED.
Nếu vấn đề này xảy ra, tốt nhất là bạn nên chia truy vấn thành nhiều phần và thực thi các phần đó song song; điều này giúp tránh trường hợp yêu cầu chạy trong thời gian dài bị lỗi và cách duy nhất để khôi phục là kích hoạt lại yêu cầu từ đầu.
Chế độ cài đặt thử lại
Thư viện Java cũng cung cấp một nền tảng để định cấu hình chế độ cài đặt thử lại ở cấp độ mỗi lệnh gọi. Để sử dụng tính năng này, hãy gọi trực tiếp đối tượng Callable. Ví dụ: khi gọi GoogleAdsService.searchStream(), hãy định cấu hình chế độ cài đặt thử lại như sau:
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.
}
}
Tối ưu hoá hiệu suất thời gian khởi động
Bạn có thể nhận thấy một độ trễ nhỏ vào lần đầu tiên một thực thể GoogleAdsClient được tạo. Điều này là do giao diện trôi chảy cho các dịch vụ (GoogleAdsClient.getLatestVersion()), giao diện này tải các lớp dịch vụ API cùng một lúc để cung cấp một cơ chế thuận tiện cho việc tạo các ứng dụng dịch vụ.
Nếu hiệu suất của yêu cầu đầu tiên nằm trên đường dẫn quan trọng cho ứng dụng của bạn, hãy làm theo các bước sau:
Tạo
GoogleAdsClientkhi khởi động, trước khi xử lý các yêu cầu của người dùng.Gửi một vài yêu cầu khởi động đến Google Ads API khi quy trình bắt đầu. Ví dụ:
// 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. } } }
Bạn chỉ cần chạy các yêu cầu khởi động một lần cho mỗi quy trình. Mỗi lần tạo ứng dụng dịch vụ tiếp theo sẽ tự động sử dụng lại các lớp được tải sẵn.
Sử dụng lại ứng dụng khách dịch vụ
Bạn nên sử dụng lại các phiên bản ứng dụng khách dịch vụ khi có thể vì mỗi lệnh gọi đến GoogleAdsClient.getLatestVersion().createYYYServiceClient() (hoặc một trình truy cập dành riêng cho phiên bản như getVersion25()) sẽ tạo một kết nối cơ bản mới và các tài nguyên liên kết.
Đảm bảo rằng bạn đóng ứng dụng khách dịch vụ khi không còn cần thiết nữa. Bạn có thể thực hiện việc này trong khối try-with-resources hoặc bằng cách gọi close() trên ứng dụng khách dịch vụ.
Nếu bạn cố gắng dùng một ứng dụng dịch vụ đã đóng để thực hiện các yêu cầu API, phương thức ứng dụng dịch vụ sẽ gửi một java.util.concurrent.RejectedExecutionException.
App Engine không triển khai được nếu JAR > 32 MB
App Engine có hạn mức 32 MB cho mỗi tệp được tải lên. JAR cho google-ads lớn hơn đáng kể so với JAR này, đặc biệt là khi sử dụng các triển khai JAR bóng hoặc đổ bóng. Nếu triển khai JAR theo cách thủ công, bạn có thể gặp phải các lỗi như:
ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-47.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])
Thay vào đó, hãy triển khai bằng trình bổ trợ Gradle hoặc trình bổ trợ Maven của App Engine. Mỗi trình bổ trợ đều cung cấp một lựa chọn enableJarSplitting giúp chia mỗi JAR thành các đoạn 10 MB và tải các đoạn đó lên.
Phần phụ thuộc bóng
Nếu dự án của bạn có các phần phụ thuộc xung đột với phần phụ thuộc của thư viện, hãy kiểm tra hệ phân cấp phần phụ thuộc của dự án bằng một trong các lệnh sau, sau đó sửa đổi các phần phụ thuộc của dự án nếu cần (hoặc sử dụng Bảng kê khai thành phần):
Maven
mvn dependency:treeGradle
./gradlew dependenciesNếu không thể giải quyết xung đột phần phụ thuộc, bạn có thể phụ thuộc vào phiên bản được che của thư viện:
Maven
<dependency> <groupId>com.google.api-ads</groupId> <artifactId>google-ads-shadowjar</artifactId> <version>47.0.0</version> </dependency>
Gradle
implementation 'com.google.api-ads:google-ads-shadowjar:47.0.0'