Operações de longa duração (LROs, na sigla em inglês)

Várias chamadas para a API retornam operações de longa duração. Eles rastreiam o status de um job que é executado por um longo período, de modo que não é desejável ter uma RPC de bloqueio.

Classe OperationFuture

A maneira mais óbvia de interagir com LROs é com a classe OperationFuture. Se você usar esse método, verifique se o cliente de serviço não foi destruído.

Não recomendado:

private void doSomething() {
  OperationFuture<Empty, Empty> future = startLongRunningOperation(jobName);
  future.get();
}

private OperationFuture<Empty, Empty> startLongRunningOperation(String jobToStart)
    throws UnsupportedEncodingException {
  try (OfflineUserDataJobServiceClient offlineUserDataJobServiceClient =
      googleAdsClient.getLatestVersion().createOfflineUserDataJobServiceClient()) {
    // Issues an asynchronous request to run the offline user data job for executing
    // all added operations.
    return offlineUserDataJobServiceClient.runOfflineUserDataJobAsync(jobToStart);
  }
}

Recomendação:

private void doSomethingElse() {
  try (OfflineUserDataJobServiceClient offlineUserDataJobServiceClient =
      googleAdsClient.getLatestVersion().createOfflineUserDataJobServiceClient()) {
    OperationFuture<Empty, Empty> future = startLongRunningOperation(offlineUserDataJobServiceClient, jobName);
    future.get();
  }
}

private OperationFuture<Empty, Empty> startLongRunningOperation(String jobToStart)
    throws UnsupportedEncodingException {
    offlineUserDataJobServiceClient.runOfflineUserDataJobAsync(jobToStart);
}

Observe como a classe OperationFuture é usada apenas enquanto o OfflineUserDataJobServiceClient está no escopo.