구조화된 데이터 파일 (SDF) 생성은 몇 초에서 몇 시간까지 걸릴 수 있습니다. Operation의 done 필드가 True이면 작업이 완료된 것입니다.
Operation은 /sdfdownloadtasks/operations/{id} 형식의 이름으로 식별됩니다. sdfdownloadtasks.operations.get를 사용하여 이 이름으로 Operation를 정기적으로 검색하여 작업이 완료되었는지 확인합니다. 이 프로세스를 '폴링'이라고 합니다.
done이 True이면 response 또는 error 필드가 설정됩니다. 실패한 작업은 error 필드를 설정합니다. 할당된 Status 객체는 실패에 관한 세부정보를 제공합니다. 작업이 성공하면 response 필드가 설정됩니다. 결과 SDF를 response.resourceName에서 다운로드합니다.
비효율적인 폴링은 많은 API 요청 할당량을 사용할 수 있습니다. 지수 백오프를 사용하여 재시도를 제한하고 할당량을 보존합니다.
지수 백오프를 사용하여 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()); } }
Python
# 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)
PHP
// 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);