Plusieurs appels à l'API Google Ads renvoient des opérations de longue durée (LRO). Elles suivent l'état d'un job qui s'exécute sur une période prolongée sans nécessiter de RPC de blocage unique.
Classe OperationFuture
Vous interagissez avec les LRO dans la bibliothèque cliente Java à l'aide de la
OperationFuture classe. Étant donné que OperationFuture s'appuie sur le client de service sous-jacent pour interroger l'API afin d'obtenir des mises à jour de l'état, assurez-vous que le client de service reste ouvert et actif jusqu'à la fin de l'opération.
Option déconseillée :
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);
}
}
Recommandations :
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);
}
Notez que OperationFuture n'est utilisé que lorsque OfflineUserDataJobServiceClient reste ouvert dans le bloc try-with-resources.