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ô hình phổ biến là nhiều tính năng trong số này dựa vào
Callable
thay vì các phương thức chuẩn. Có thể gọi là
thường là nơi phù hợp để tìm các tính năng khác cho mỗi bên bị hạn chế nhưng chưa được ghi nhận
vào đây.
Hết giờ
Thư viện Java cung cấp 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.
Hãy đặt mộ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
lệnh gọi API.
Để dùng tính năng này, bạn nên trực tiếp dùng đối tượng có thể gọi. Ví dụ: nếu
đang gọi GoogleAdsService.searchStream()
, thì thời gian chờ sẽ được đặt là:
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)));
}
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ờ
các yêu cầu cực kỳ chạy trong thời gian dài và trả về một
Lỗi DEADLINE_EXCEEDED
.
Nếu đây là vấn đề, thông thường tốt nhất bạn nên chia nhỏ truy vấn và
thực thi các đoạn song song; Điều này giúp tránh trường hợp khi
yêu cầu đang chạy không thành công và cách duy nhất để khôi phục là kích hoạt yêu cầu
lại từ đầu.
Thử cài đặt lại
Thư viện Java cũng cung cấp nền tảng để định cấu hình các chế độ cài đặt thử lại trên
cho mỗi cuộc gọi. Để dùng tính năng này, bạn nên trực tiếp dùng đối tượng có thể gọi.
Ví dụ: nếu gọi GoogleAdsService.searchStream()
, chế độ cài đặt thử lại
sẽ được định cấu hình như sau:
// 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);
Tối ưu hoá hiệu suất thời gian khởi động
Bạn có thể nhận thấy độ trễ nhỏ trong lần đầu tiên thực thể GoogleAdsClient
đã tạo. Điều này là do giao diện thông suốt của các dịch vụ
(GoogleAdsClient.getVersionXX()
), sẽ tải tất cả lớp API tại
một lần để cung cấp cơ chế thuận tiện hơn cho việc xây dựng
các lớp dịch vụ.
Nếu hiệu suất của yêu cầu đầu tiên nằm trên lộ trình quan trọng đối với ứng dụng, bạn nên làm theo các bước sau:
Tạo
GoogleAdsClient
khi khởi động, trước khi phân phát yêu cầu của người dùng.Gửi một vài yêu cầu khởi động đến API Google Ads khi quá trình này diễn ra trước 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 (GoogleAdsException ex) { // Do nothing, we're expecting this to fail. } } }
Bạn chỉ cần chạy yêu cầu khởi động một lần cho mỗi quy trình. Mỗi việc tạo ứng dụng dịch vụ sẽ tự động sử dụng lại các lớp được tải trước.
Sử dụng lại ứng dụng dịch vụ
Bạn nên sử dụng lại các phiên bản ứng dụng khách của dịch vụ nếu có thể vì mỗi lệnh gọi đến
GoogleAdsClient.getVersionXXX().createYYYServiceClient()
sẽ tạo một giao diện người dùng mới
kết nối TCP.
Bạn phải đảm bảo đóng ứng dụng khi không còn cần thiết. Chiến dịch này
có thể được thực hiện trong một
thử-có-tài-nguyên
chặn hoặc bằng cách gọi close()
trên ứng dụng dịch vụ.
Nếu bạn cố gắng sử dụng một ứng dụng dịch vụ khép kín để đưa ra yêu cầu API, thì dịch vụ đó
sẽ gửi một java.util.concurrent.RejectedExecutionException
.
Công cụ ứng dụng không triển khai được nếu tệp JAR > 32 MB
App Engine có hạn mức là 32 MB cho mỗi tệp được tải lên. Tệp JAR cho google-ads
sẽ lớn hơn thế này, thậm chí còn hơn cả việc sử dụng lọ bóng/đèn
triển khai. Nếu triển khai các tệp jar theo cách thủ công, bạn có thể gặp các lỗi như:
ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-14.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])
Thay vào đó, hãy triển khai bằng AppEngine
Trình bổ trợ Gradle
hoặc
Trình bổ trợ Maven.
Mỗi tệp có tuỳ chọn cho enableJarSplitting
, sẽ chia mỗi tệp jar thành các phần 10 MB và
hãy tải các video đó 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 các phần phụ thuộc của thư viện, bạn nên kiểm tra các 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.
Maven
mvn dependency:tree
Gradle
./gradlew dependencies
Nếu việc giải quyết xung đột phần phụ thuộc không khả thi, bạn có thể dựa vào được tô bóng phiên bản của thư viện.
Maven
<dependency> <groupId>com.google.api-ads</groupId> <artifactId>google-ads-shadowjar</artifactId> <version>33.0.0</version> </dependency>
Gradle
implementation 'com.google.api-ads:google-ads-shadowjar:33.0.0'