סטטוס המשימה של הסקר

קובצי נתונים מובְנים לא נוצרים באופן מיידי. יכולות לחלוף כמה שניות או כמה שעות עד ש-Display & Video 360 ייצור את קובצי ה-SDF.

כדי לדעת אם המשימה הסתיימה, צריך לאחזר את הפעולה באופן קבוע באמצעות sdfdownloadtasks.operations.get ולבדוק אם השדה done הוא True והמשימה הסתיימה. התהליך הזה נקרא 'תשאול'.

אם המשימה הסתיימה, השדה response או השדה error מוגדרים. אם השדה error מלא, המשימה נכשלה ופרטים על הכישלון זמינים באובייקט Status שנוצר. אם השדה response מאוכלס, מערכת Display & Video 360 יצרה בהצלחה את קובצי ה-SDF. מורידים את הקבצים המתקבלים מהמיקום שצוין ב-response.resourceName.

הטמעה לא יעילה של סקר שבודק דוח שפועל במשך זמן רב צורכת חלק גדול ממכסת הבקשות ל-API. כדי להגביל את מספר הניסיונות החוזרים ולחסוך במכסה, צריך להשתמש בהשהיה מעריכית לפני ניסיון חוזר.

כך מבצעים שאילתת סטטוס של פעולת הורדה של SDF באמצעות השהיה מעריכית לפני ניסיון חוזר:

# 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))