对 Google Ads API 的多次调用都会返回长时间运行的操作 (LRO)。这些对象会跟踪长时间执行的作业的状态,而无需单个阻塞 RPC。
OperationFuture 类
在 Java 客户端库中,您可以使用 OperationFuture 类与 LRO 进行交互。由于 OperationFuture 依赖于底层服务客户端来轮询 API 以获取状态更新,因此请确保服务客户端在操作完成之前保持打开和活跃状态。
不推荐:
private void executeOperation(String jobName) throws Exception {
OperationFuture<Empty, OfflineUserDataJobMetadata> future =
startLongRunningOperation(jobName);
// FAILS: The service client was already closed when
// startLongRunningOperation() exited its try-with-resources block, so
// future.get() fails when polling.
future.get();
}
private OperationFuture<Empty, OfflineUserDataJobMetadata>
startLongRunningOperation(String jobToStart) {
try (OfflineUserDataJobServiceClient offlineUserDataJobServiceClient =
googleAdsClient
.getLatestVersion()
.createOfflineUserDataJobServiceClient()) {
// Issues an asynchronous request to run the offline user data job.
return offlineUserDataJobServiceClient.runOfflineUserDataJobAsync(
jobToStart);
}
}
推荐:
private void executeOperation(String jobName) throws Exception {
try (OfflineUserDataJobServiceClient offlineUserDataJobServiceClient =
googleAdsClient
.getLatestVersion()
.createOfflineUserDataJobServiceClient()) {
OperationFuture<Empty, OfflineUserDataJobMetadata> future =
startLongRunningOperation(offlineUserDataJobServiceClient, jobName);
// Waits for the operation to complete (with a timeout) while the client is
// still open.
future.get(5, TimeUnit.MINUTES);
}
}
private OperationFuture<Empty, OfflineUserDataJobMetadata>
startLongRunningOperation(
OfflineUserDataJobServiceClient offlineUserDataJobServiceClient,
String jobToStart) {
return offlineUserDataJobServiceClient.runOfflineUserDataJobAsync(jobToStart);
}
请注意,OperationFuture 仅在 OfflineUserDataJobServiceClient 在 try-with-resources 块中保持打开状态时使用。