Długotrwałe operacje (LRO)

Kilka wywołań interfejsu Google Ads API zwraca długo trwające operacje (LRO). Śledzą one stan zadania, które jest wykonywane przez dłuższy czas bez konieczności używania pojedynczego blokującego wywołania RPC.

Klasa OperationFuture

W bibliotece klienta w języku Java wchodzisz w interakcję z operacjami LRO za pomocą klasy OperationFuture. Ponieważ funkcja OperationFuture polega na kliencie usługi bazowej, który sprawdza interfejs API pod kątem aktualizacji stanu, upewnij się, że klient usługi pozostaje otwarty i aktywny do czasu zakończenia operacji.

Niezalecane:

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);
  }
}

Rekomendacje:

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);
}

Zwróć uwagę, że element OperationFuture jest używany tylko wtedy, gdy element OfflineUserDataJobServiceClient pozostaje otwarty w bloku try-with-resources.