État de la tâche d'interrogation

Les fichiers de données structurées ne sont pas générés instantanément. La génération de vos fichiers SDF peut prendre de quelques secondes à plusieurs heures dans Display & Video 360.

Pour déterminer si votre tâche est terminée, récupérez régulièrement l'opération à l'aide de sdfdownloadtasks.operations.get et vérifiez si le champ done est défini sur True et si la tâche est terminée. Ce processus est appelé "interrogation".

Si la tâche est terminée, le champ response ou error est défini. Si le champ error est renseigné, la tâche a échoué. Des informations sur l'échec sont disponibles dans l'objet Status résultant. Si le champ response est renseigné, cela signifie que Display & Video 360 a bien généré les fichiers de données structurées. Téléchargez les fichiers obtenus à l'emplacement indiqué dans response.resourceName.

Une implémentation d'interrogation inefficace qui vérifie un rapport de longue durée consomme une grande partie de votre quota de requêtes d'API. Pour limiter les nouvelles tentatives et préserver le quota, utilisez un intervalle exponentiel entre les tentatives.

Voici comment interroger une opération de téléchargement de fichier de données structurées à l'aide d'un intervalle exponentiel entre les tentatives :

# Provide the name of the sdfdownloadtask operation.
operation_name = operation-name

# Set the following values that control retry behavior while the operation
# is running.
# Minimum amount of time between polling requests. Defaults to 5 seconds.
min_retry_interval = 5
# Maximum amount of time between polling requests. Defaults to 5 minutes.
max_retry_interval = 5 * 60
# Maximum amount of time to spend polling. Defaults to 5 hours.
max_retry_elapsed_time = 5 * 60 * 60

# Configure the sdfdownloadtasks.operations.get request.
get_request = service.sdfdownloadtasks().operations().get(operation_name)

sleep = 0

start_time = time.time()
while True:
  # Get current status of the report.
  operation = get_request.execute()

  if "done" in operation:
    if "error" in operation:
      print(
        f'The operation finished in error with code '
        f'{operation["error"]["code"]}: {operation["error"]["message"]}')
    else:
      print(
        f'The operation completed successfully. The resulting files can be '
        f'downloaded at {operation["response"]["resourceName"]}.')
    break
  elif time.time() - start_time > max_retry_elapsed_time:
    print("SDF generation deadline exceeded.")
    break

  sleep = next_sleep_interval(sleep)
  print(
    f'Operation {operation_name} is still running, sleeping for '
    f'{sleep} seconds.')
  time.sleep(sleep)

def next_sleep_interval(previous_sleep_interval):
  """Calculates the next sleep interval based on the previous."""
  min_interval = previous_sleep_interval or min_retry_interval
  max_interval = previous_sleep_interval * 3 or min_retry_interval
  return min(max_retry_interval, random.randint(min_interval, max_interval))