পোল টাস্ক স্ট্যাটাস

স্ট্রাকচার্ড ডেটা ফাইল (SDF) তৈরি হতে কয়েক সেকেন্ড থেকে কয়েক ঘন্টা পর্যন্ত সময় লাগতে পারে। Operation -এর done ' ফিল্ডটির মান True হলে কাজটি সম্পন্ন হয়।

একটি Operation /sdfdownloadtasks/operations/{id} ফরম্যাটের একটি নাম দ্বারা চিহ্নিত করা হয়। টাস্কটি শেষ হয়েছে কিনা তা দেখার জন্য sdfdownloadtasks.operations.get ব্যবহার করে নিয়মিতভাবে এই নামের Operation পুনরুদ্ধার করুন। এই প্রক্রিয়াটি 'পোলিং' নামে পরিচিত।

যদি done True হয়, তাহলে response অথবা error ফিল্ড সেট করা হবে। একটি ব্যর্থ টাস্ক error ফিল্ডটি সেট করে। নির্ধারিত Status অবজেক্টটি ব্যর্থতা সম্পর্কে বিস্তারিত তথ্য প্রদান করে। একটি সফল টাস্ক response ফিল্ডটি সেট করে। response.resourceName থেকে ফলাফলস্বরূপ প্রাপ্ত SDF-গুলো ডাউনলোড করুন।

অদক্ষ পোলিং প্রচুর পরিমাণে এপিআই রিকোয়েস্ট কোটা খরচ করতে পারে। এক্সপোনেনশিয়াল ব্যাকঅফ ব্যবহার করে রিট্রাই সীমিত করুন এবং কোটা সংরক্ষণ করুন।

এক্সপোনেনশিয়াল ব্যাকঅফ ব্যবহার করে কীভাবে একটি SDF ডাউনলোড টাস্ক পোল করতে হয়, তা এখানে দেওয়া হলো:

জাভা

// Provide the name of the sdfdownloadtask operation.
String operationName = operation-name;

// Configure the Operations.get request.
Sdfdownloadtasks.Operations.Get operationRequest =
    service.sdfdownloadtasks().operations().get(operationName);

// Configure exponential backoff for checking the status of our operation.
ExponentialBackOff backOff =
    new ExponentialBackOff.Builder()
        .setInitialIntervalMillis(5000) // setting initial interval to five seconds
        .setMaxIntervalMillis(5000 * 60) // setting max interval to five minutes
        .setMaxElapsedTimeMillis(5000 * 60 * 60) // setting max elapsed time to five hours
        .build();
long backoffMillis = 0;

// Create default operation variable.
Operation operation = new Operation();

do {
  // Sleep before retrieving operation again.
  Thread.sleep(backoffMillis);

  // Retrieve operation.
  operation = operationRequest.execute();

  // If operation is not done, calculate next sleep period.
  if (operation.getDone() == null) {
    backoffMillis = backOff.nextBackOffMillis();
    if (backoffMillis == ExponentialBackOff.STOP) {
      System.out.printf("The operation has taken more than five hours to complete.%n");
      break;
    }
    System.out.printf(
        "Operation %s is still running, sleeping for %s milliseconds.%n",
        operationName, backoffMillis);
  }
} while (operation.getDone() == null);

// Check whether operation finished with an error, or is completed and ready to download.
if (operation.getDone() != null) {
  if (operation.getError() != null) {
    System.out.printf(
        "The operation finished in error with code %s: %s%n",
        operation.getError().getCode(), operation.getError().getMessage());
  } else {
    System.out.printf(
        "The operation completed successfully. Resource %s was created.%n",
        operation.getResponse().get("resourceName").toString());
  }
}

পাইথন

# 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

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

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

sleep = 0
start_time = time.time()

while True:
  # Retrieve the operation.
  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)

পিএইচপি

// The following values control retry behavior while the task is processing.
// Minimum amount of time between polling requests. Defaults to 5 seconds.
$minRetryInterval = 5;
// Maximum amount of time between polling requests. Defaults to 5 minutes.
$maxRetryInterval = 300;
// Maximum amount of time to spend polling. Defaults to 5 hours.
$maxRetryElapsedTime = 18000;

// Provide the name of the sdfdownloadtask operation.
$operationName = operation-name;

// Poll operation.
$sleep = 0;
$startTime = time();
do {
    try {
        // Call the API, retrieving the SDF Download Task.
        $operation = $this->service->sdfdownloadtasks_operations->get(
            $operationName
        );
    } catch (\Exception $e) {
        $this->renderError($e);
        return;
    }

    // Check if retrieved operation is finished.
    if ($operation->getDone() === true) {
        if($operation->getError() !== null) {
            $error = $operation->getError();
            printf(
                'The operation finished in error with code %s: %s<br>',
                $error->setCode(),
                $error->setMessage()
            );
            break;
        } else {
            $response = $operation->getResponse();
            printf(
                'The operation completed successfully. Resource %s '
                    . 'was created.<br>',
                $response['resourceName']
            );
            break;
        }
    } elseif (time() - $startTime > self::MAX_RETRY_ELAPSED_TIME) {
        print '<p>SDF download task processing deadline exceeded</p>';
        break;
    }

    // Generate next sleep interval.
    $minInterval = max($minRetryInterval, $sleep);
    $maxInterval = max(
        $minRetryInterval,
        $sleep * 3
    );
    $sleep = min($maxRetryInterval, rand($minInterval, $maxInterval));

    // Sleep a determined amount of time before retrieving the operation
    // again.
    printf(
        'Operation %s is still running, sleeping for %d seconds<br>',
        $operationName,
        $sleep
    );
    sleep($sleep);
} while (true);