Strukturierte Datendateien werden nicht sofort generiert. Es kann einige Sekunden bis Stunden dauern, bis Ihre strukturierten Datendateien in Display & Video 360 generiert werden.
Wenn Sie feststellen möchten, ob Ihre Aufgabe abgeschlossen ist, rufen Sie den Vorgang regelmäßig mit sdfdownloadtasks.operations.get ab und prüfen Sie, ob das Feld done den Wert True hat. Dieser Vorgang wird als „Polling“ bezeichnet.
Wenn die Aufgabe abgeschlossen ist, wird entweder das Feld response oder error festgelegt. Wenn das Feld error ausgefüllt ist, ist der Task fehlgeschlagen. Details zum Fehler sind im resultierenden Status-Objekt verfügbar. Wenn das Feld response ausgefüllt ist, wurden die strukturierten Datendateien erfolgreich in Display & Video 360 generiert. Laden Sie die resultierenden Dateien vom Speicherort herunter, der in response.resourceName angegeben ist.
Eine ineffiziente Polling-Implementierung, bei der ein lang andauernder Bericht geprüft wird, verbraucht einen Großteil Ihres API-Anfragekontingents. Um Wiederholungsversuche zu begrenzen und Kontingent zu sparen, verwenden Sie exponentiellen Backoff.
So fragen Sie den Downloadvorgang einer strukturierten Datendatei mit exponentiellem Backoff ab:
# 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))