Several calls to the Google Ads API return long-running operations (LROs). These track
the status of a job that executes over an extended period of time without
requiring a single blocking RPC.

## OperationFuture class

You interact with LROs in the Java client library using the
[`OperationFuture`](https://cloud.google.com/java/docs/reference/gax/latest/overview.html) class. Because `OperationFuture` relies on the
underlying service client to poll the API for status updates, make sure that the
service client remains open and active until the operation completes.

Not recommended:

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

Recommended:

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

Notice how the `OperationFuture` is only used while the
`OfflineUserDataJobServiceClient` remains open within the `try-with-resources`
block.