مراحل استفاده از پردازش دستهای به شرح زیر است:
ایجاد یک کار دستهای جدید
برای ایجاد یک منبع BatchJob ، تابع MutateBatchJob را فراخوانی کنید. هنگام ساخت شیء BatchJob ، میتوانید به صورت اختیاری metadata.execution_limit_seconds برای پیکربندی یک حد بالا (بر حسب ثانیه) در مورد مدت زمانی که یک job میتواند قبل از لغو خودکار اجرا شود، تنظیم کنید (به راهنمای استفاده بیشتر مراجعه کنید).
جاوا
private String createBatchJob(BatchJobServiceClient batchJobServiceClient, long customerId) { BatchJobOperation operation = BatchJobOperation.newBuilder().setCreate(BatchJob.newBuilder().build()).build(); String batchJobResourceName = batchJobServiceClient .mutateBatchJob(Long.toString(customerId), operation) .getResult() .getResourceName(); System.out.printf("Created a mutate job with resource name: '%s'.%n", batchJobResourceName); return batchJobResourceName; }
سی شارپ
private static string CreateBatchJob(BatchJobServiceClient batchJobService, long customerId) { BatchJobOperation operation = new BatchJobOperation() { Create = new BatchJob() { } }; string batchJobResourceName = batchJobService.MutateBatchJob(customerId.ToString(), operation) .Result.ResourceName; Console.WriteLine($"Created a batch job with resource name: " + $"'{batchJobResourceName}'."); return batchJobResourceName; }
پی اچ پی
private static function createBatchJob( BatchJobServiceClient $batchJobServiceClient, int $customerId ): string { // Creates a batch job operation to create a new batch job. $batchJobOperation = new BatchJobOperation(); $batchJobOperation->setCreate(new BatchJob()); // Issues a request to the API and get the batch job's resource name. $batchJobResourceName = $batchJobServiceClient->mutateBatchJob( MutateBatchJobRequest::build($customerId, $batchJobOperation) )->getResult()->getResourceName(); printf( "Created a batch job with resource name: '%s'.%s", $batchJobResourceName, PHP_EOL ); return $batchJobResourceName; }
پایتون
def create_batch_job( batch_job_service: BatchJobServiceClient, customer_id: str, batch_job_operation: BatchJobOperation, ) -> str: """Creates a batch job for the specified customer ID. Args: batch_job_service: an instance of the BatchJobService message class. customer_id: a str of a customer ID. batch_job_operation: a BatchJobOperation instance set to "create" Returns: a str of a resource name for a batch job. """ try: response: MutateBatchJobResponse = batch_job_service.mutate_batch_job( customer_id=customer_id, operation=batch_job_operation ) resource_name: str = response.result.resource_name print(f'Created a batch job with resource name "{resource_name}"') return resource_name except GoogleAdsException as exception: handle_googleads_exception(exception) # This line will likely not be reached due to sys.exit(1) in handle_googleads_exception # but to satisfy the type checker, we add a return statement. return "" # Or raise an exception
روبی
def create_batch_job(client, batch_job_service, customer_id) # Creates a batch job operation to create a new batch job. operation = client.operation.create_resource.batch_job # Issues a request to the API and get the batch job's resource name. response = batch_job_service.mutate_batch_job( customer_id: customer_id, operation: operation ) batch_job_resource_name = response.result.resource_name puts "Created a batch job with resource name: '#{batch_job_resource_name}'" batch_job_resource_name end
پرل
sub create_batch_job { my ($batch_job_service, $customer_id) = @_; # Create a batch job operation. my $batch_job_operation = Google::Ads::GoogleAds::V25::Services::BatchJobService::BatchJobOperation-> new({create => Google::Ads::GoogleAds::V25::Resources::BatchJob->new({})}); my $batch_job_resource_name = $batch_job_service->mutate({ customerId => $customer_id, operation => $batch_job_operation })->{result}{resourceName}; printf "Created a batch job with resource name: '%s'.\n", $batch_job_resource_name; return $batch_job_resource_name; }
حلقه زدن
# Creates a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. curl -f --request POST \ "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/batchJobs:mutate" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --data @- <<EOF { "operation": { "create": {} } } EOF
در این مرحله از فرآیند، status کار PENDING است.
اضافه کردن عملیات جهش به کار دستهای
با فراخوانی AddBatchJobOperations یک یا چند شیء MutateOperation را به کار دستهای ایجاد شده در مرحله قبل اضافه کنید. سپس پاسخ شامل موارد زیر است:
-
total_operations: تعداد کل عملیاتهای اضافه شده تاکنون برای این کار. -
next_sequence_token: توکن توالی که هنگام فراخوانی مجدد این متد برای افزودن عملیات بیشتر، در فیلدsequence_tokenارسال میشود.
اولین درخواست AddBatchJobOperations برای یک کار دستهای باید sequence_token حذف کند. وقتی دوباره AddBatchJobOperations برای افزودن عملیات بیشتر فراخوانی میکنید، نشانه توالی قبلاً بهدستآمده را در فیلد sequence_token درخواست مشخص کنید. فراخوانی این متد با یک لیست mutate_operations خالی، خطای BatchJobError.EMPTY_OPERATIONS را برمیگرداند، فراخوانی آن با هر نشانه توالی غیر از نشانه توالی بهدستآمده قبلی، خطای BatchJobError.INVALID_SEQUENCE_TOKEN را برمیگرداند، و تلاش برای افزودن عملیات پس از شروع اجرای کار، خطای BatchJobError.CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING را برمیگرداند.
در حالی که status کار دستهای در PENDING است، sequence_token به صورت next_add_sequence_token نیز در منبع BatchJob موجود است که میتوانید بعداً آن را بازیابی کنید .
اگر در حال ایجاد اشیاء وابسته مانند یک کمپین کامل متشکل از یک کمپین جدید و گروههای تبلیغاتی، تبلیغات و کلمات کلیدی مربوطه هستید، میتوانید از شناسههای موقت برای مشخص کردن نام منبع استفاده کنید.
جاوا
private void addAllBatchJobOperations( BatchJobServiceClient batchJobServiceClient, long customerId, String batchJobResourceName) { AddBatchJobOperationsResponse response = batchJobServiceClient.addBatchJobOperations( AddBatchJobOperationsRequest.newBuilder() .setResourceName(batchJobResourceName) .addAllMutateOperations(buildAllOperations(customerId)) .build()); System.out.printf( "%d mutate operations have been added so far.%n", response.getTotalOperations()); // You can use this next sequence token for calling addBatchJobOperations() next time. System.out.printf( "Next sequence token for adding next operations is '%s'.%n", response.getNextSequenceToken()); }
سی شارپ
private static void AddAllBatchJobOperations(BatchJobServiceClient batchJobService, long customerId, string batchJobResourceName) { AddBatchJobOperationsResponse response = batchJobService.AddBatchJobOperations( new AddBatchJobOperationsRequest() { ResourceName = batchJobResourceName, MutateOperations = { BuildAllOperations(customerId) } }); Console.WriteLine($"{response.TotalOperations} mutate operations have been added" + $" so far."); // You can use this next sequence token for calling AddBatchJobOperations() next time. Console.WriteLine($"Next sequence token for adding next operations is " + $"'{response.NextSequenceToken}'."); }
پی اچ پی
private static function addAllBatchJobOperations( BatchJobServiceClient $batchJobServiceClient, int $customerId, string $batchJobResourceName ): void { $response = $batchJobServiceClient->addBatchJobOperations( AddBatchJobOperationsRequest::build( $batchJobResourceName, '', self::buildAllOperations($customerId) ) ); printf( "%d mutate operations have been added so far.%s", $response->getTotalOperations(), PHP_EOL ); // You can use this next sequence token for calling addBatchJobOperations() next time. printf( "Next sequence token for adding next operations is '%s'.%s", $response->getNextSequenceToken(), PHP_EOL ); }
پایتون
def add_all_batch_job_operations( batch_job_service: BatchJobServiceClient, operations: List[MutateOperation], resource_name: str, ) -> None: """Adds all mutate operations to the batch job. As this is the first time for this batch job, we pass null as a sequence token. The response will contain the next sequence token that we can use to upload more operations in the future. Args: batch_job_service: an instance of the BatchJobService message class. operations: a list of a mutate operations. resource_name: a str of a resource name for a batch job. """ try: response: AddBatchJobOperationsResponse = ( batch_job_service.add_batch_job_operations( resource_name=resource_name, sequence_token=None, # type: ignore mutate_operations=operations, ) ) print( f"{response.total_operations} mutate operations have been " "added so far." ) # You can use this next sequence token for calling # add_batch_job_operations() next time. print( "Next sequence token for adding next operations is " f"{response.next_sequence_token}" ) except GoogleAdsException as exception: handle_googleads_exception(exception)
روبی
def add_all_batch_job_operations( client, batch_job_service, customer_id, batch_job_resource_name) response = batch_job_service.add_batch_job_operations( resource_name: batch_job_resource_name, mutate_operations: build_all_operations(client, customer_id), ) puts "#{response.total_operations} mutate operations have been added so far." # You can use this next sequence token for calling # add_all_batch_job_operations() next time puts "Next sequence token for adding next operations is " \ "'#{response.next_sequence_token}'" end
پرل
sub add_all_batch_job_operations { my ($batch_job_service, $customer_id, $batch_job_resource_name) = @_; my $add_batch_job_operations_response = $batch_job_service->add_operations({ resourceName => $batch_job_resource_name, sequenceToken => undef, mutateOperations => build_all_operations($customer_id)}); printf "%d batch operations have been added so far.\n", $add_batch_job_operations_response->{totalOperations}; # You can use this next sequence token for calling add_operations() next time. printf "Next sequence token for adding next operations is '%s'.\n", $add_batch_job_operations_response->{nextSequenceToken}; }
حلقه زدن
# Adds operations to a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # BATCH_JOB_RESOURCE_NAME: # The resource name of the batch job to which the operations should be added # as returned by the previous step. curl -f --request POST \ "https://googleads.googleapis.com/v${API_VERSION}/${BATCH_JOB_RESOURCE_NAME}:addOperations" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --data @- <<EOF { "mutateOperations": [ { "campaignBudgetOperation": { "create": { "resourceName": "customers/${CUSTOMER_ID}/campaignBudgets/-1", "name": "batch job budget #${RANDOM}", "deliveryMethod": "STANDARD", "amountMicros": 5000000 } } }, { "campaignOperation": { "create": { "advertisingChannelType": "SEARCH", "status": "PAUSED", "name": "batch job campaign #${RANDOM}", "campaignBudget": "customers/${CUSTOMER_ID}/campaignBudgets/-1", "resourceName": "customers/${CUSTOMER_ID}/campaigns/-2", "manualCpc": { } } }, } ] } EOF
برای مشاهده محتوای تابع عملیات ساخت در گیتهاب برای کتابخانه کلاینت خود، کلیک کنید:
جاوا
buildAllOperations() سی شارپ
BuildAllOperations()پی اچ پی
buildAllOperations() پایتون
build_all_operations() روبی
build_all_operations()پرل
build_all_operationsاجرای کار دستهای
پس از افزودن تمام عملیات خود، میتوانید با فراخوانی RunBatchJob روی عملیات آپلود شده، از API گوگل ادز بخواهید که کار دستهای را اجرا کند. فراخوانی RunBatchJob پس از شروع اجرای کار، خطای BatchJobError.CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING را برمیگرداند.
جاوا
private OperationFuture runBatchJob( BatchJobServiceClient batchJobServiceClient, String batchJobResourceName) { OperationFuture operationResponse = batchJobServiceClient.runBatchJobAsync(batchJobResourceName); // BEWARE! The above call returns an OperationFuture. The execution of that future depends on // the thread pool which is owned by batchJobServiceClient. If you use this future, you *must* // keep the service client in scope too. // See https://developers.google.com/google-ads/api/docs/client-libs/java/lro for more detail. System.out.printf( "Mutate job with resource name '%s' has been executed.%n", batchJobResourceName); return operationResponse; }
سی شارپ
private Operation<Empty, BatchJobMetadata> RunBatchJob( BatchJobServiceClient batchJobService, string batchJobResourceName) { Operation<Empty, BatchJobMetadata> operationResponse = batchJobService.RunBatchJob(batchJobResourceName); Console.WriteLine($"Batch job with resource name '{batchJobResourceName}' has been " + $"executed."); return operationResponse; }
پی اچ پی
private static function runBatchJob( BatchJobServiceClient $batchJobServiceClient, string $batchJobResourceName ): OperationResponse { $operationResponse = $batchJobServiceClient->runBatchJob(RunBatchJobRequest::build($batchJobResourceName)); printf( "Batch job with resource name '%s' has been executed.%s", $batchJobResourceName, PHP_EOL ); return $operationResponse; }
پایتون
def run_batch_job( batch_job_service: BatchJobServiceClient, resource_name: str ) -> Operation: """Runs the batch job for executing all uploaded mutate operations. Args: batch_job_service: an instance of the BatchJobService message class. resource_name: a str of a resource name for a batch job. Returns: a google.api_core.operation.Operation instance. """ try: response: Operation = batch_job_service.run_batch_job( resource_name=resource_name ) print( f'Batch job with resource name "{resource_name}" has been ' "executed." ) return response except GoogleAdsException as exception: handle_googleads_exception(exception) # This line will likely not be reached due to sys.exit(1) in handle_googleads_exception # but to satisfy the type checker, we add a return statement. # In a real application, you might want to return a dummy Operation or raise an error. return Operation( op_type_name="type.googleapis.com/google.protobuf.Empty", complete=True, done_callbacks=[], metadata_type=None, result_type=None, ) # type: ignore
روبی
def run_batch_job(batch_job_service, batch_job_resource_name) operation_response = batch_job_service.run_batch_job( resource_name: batch_job_resource_name, ) puts "Batch job with resource name '#{batch_job_resource_name}' " \ "has been executed." operation_response end
پرل
sub run_batch_job { my ($batch_job_service, $batch_job_resource_name) = @_; my $batch_job_lro = $batch_job_service->run({resourceName => $batch_job_resource_name}); printf "Batch job with resource name '%s' has been executed.\n", $batch_job_resource_name; return $batch_job_lro; }
حلقه زدن
# Runs a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # BATCH_JOB_RESOURCE_NAME: # The resource name of the batch job to run as returned by the previous step. curl -f --request POST \ "https://googleads.googleapis.com/v19/${BATCH_JOB_RESOURCE_NAME}:run" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --data @- <<EOF {} EOF
پاسخ برگشتی یک شیء Operation طولانیمدت (LRO) است. LRO شامل ابردادههای کار دستهای شما به همراه اطلاعات مربوط به وضعیت کار است.
وضعیت کار دستهای را تا زمان اتمام آن نظرسنجی کنید
مرحله بعدی، نظرسنجی از وضعیت کار دستهای با استفاده از GetOperation مربوط به LRO است تا زمانی که مقدار done مربوط به LRO برابر با true شود.
جاوا
private void pollBatchJob(OperationFuture operationResponse) { try { operationResponse.get(MAX_TOTAL_POLL_INTERVAL_SECONDS, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { System.err.printf("Failed polling the mutate job. Exception: %s%n", e); System.exit(1); } }
سی شارپ
private static void PollBatchJob(Operation<Empty, BatchJobMetadata> operationResponse) { PollSettings pollSettings = new PollSettings( Expiration.FromTimeout(TimeSpan.FromSeconds(MAX_TOTAL_POLL_INTERVAL_SECONDS)), TimeSpan.FromSeconds(1)); operationResponse.PollUntilCompleted(pollSettings); }
پی اچ پی
private static function pollBatchJob(OperationResponse $operationResponse): void { $operationResponse->pollUntilComplete( [ 'initialPollDelayMillis' => self::POLL_FREQUENCY_SECONDS * 1000, 'totalPollTimeoutMillis' => self::MAX_TOTAL_POLL_INTERVAL_SECONDS * 1000 ] ); }
پایتون
def poll_batch_job( operations_response: Operation, event: asyncio.Event ) -> None: """Polls the server until the batch job execution finishes. Sets the initial poll delay time and the total time to wait before time-out. Args: operations_response: a google.api_core.operation.Operation instance. event: an instance of asyncio.Event to invoke once the operations have completed, alerting the awaiting calling code that it can proceed. """ loop: asyncio.AbstractEventLoop = asyncio.get_event_loop() def done_callback(future: Coroutine[Any, Any, Any]) -> None: # The operations_response object will call callbacks from a daemon # thread so we must use a threadsafe method of setting the event here # otherwise it will not trigger the awaiting code. loop.call_soon_threadsafe(event.set) # operations_response represents a Long-Running Operation or LRO. The class # provides an interface for polling the API to check when the operation is # complete. Below we use the asynchronous interface, but there's also a # synchronous interface that uses the Operation.result method. # See: https://googleapis.dev/python/google-api-core/latest/operation.html operations_response.add_done_callback(done_callback) # type: ignore
روبی
def poll_batch_job(operation_response) operation_response.wait_until_done! end
پرل
sub poll_batch_job { my ($operation_service, $batch_job_lro) = @_; $operation_service->poll_until_done({ name => $batch_job_lro->{name}, pollFrequencySeconds => POLL_FREQUENCY_SECONDS, pollTimeoutSeconds => POLL_TIMEOUT_SECONDS }); }
حلقه زدن
# Gets the status of a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # BATCH_JOB_OPERATION_NAME: # The operation name of the running batch job as returned by the previous # step. curl -f --request GET \ "https://googleads.googleapis.com/v${API_VERSION}/${BATCH_JOB_OPERATION_NAME}" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
بازیابی یک عملیات طولانی مدت موجود
اگر برنامه شما کارهای دستهای را از یک فرآیند جداگانه نظرسنجی میکند یا نیاز دارد که پس از راهاندازی مجدد، نظرسنجی را از سر بگیرد، میتوانید نام عملیات طولانی مدت را با استفاده از GoogleAdsService.Search یا GoogleAdsService.SearchStream بازیابی کنید:
برای خواندن فیلد
long_running_operationاز منبعbatch_jobکوئری بگیرید:SELECT batch_job.id, batch_job.status, batch_job.long_running_operation FROM batch_job WHERE batch_job.id = BATCH_JOB_IDبررسی کنید که
batch_job.statusRUNNINGاست یاDONE(long_running_operationفقط پس از فراخوانیRunBatchJobمقداردهی میشود و در حالی که job در حالPENDING) است، مقدار آن تنظیم نشده (unset) است)، و رشتهlong_running_operationرا از شیءBatchJobبرگردانده شده بخوانید.رشته نام عملیات را به
GetOperationدرOperationsClientکتابخانه کلاینت خود ارسال کنید تاOperationبررسی یا از سرگیری کنید.
درک فرادادههای عملیاتی
وقتی عملیات طولانی مدت را بررسی میکنید، فیلد metadata در پاسخ Operation جزئیات بیشتری در مورد پیشرفت کار دستهای ارائه میدهد. این فیلد حاوی یک شیء BatchJobMetadata است. زیرفیلدهای کلیدی عبارتند از:
-
creation_date_time: مهر زمانی که کار دستهای ایجاد شده است. -
start_date_time: مهر زمانی که کار دستهای شروع به اجرا کرد. -
completion_date_time: مهر زمانی که کار دستهای تمام شد (فقط در صورتی که کار انجام شده باشد، نمایش داده میشود). -
estimated_completion_ratio: تخمینی از کسری از کار (از ۰.۰ تا ۱.۰) که تکمیل شده است. -
operation_count: تعداد کل عملیات در کار دستهای. -
executed_operation_count: تعداد عملیاتی که تاکنون اجرا شدهاند. -
execution_limit_seconds: حد بالای تقریبی، بر حسب ثانیه، برای مدت زمانی که یک کار دستهای میتواند قبل از لغو شدن اجرا شود.
این فیلدها، به خصوص estimated_completion_ratio و تعداد عملیات، میتوانند به شما در سنجش پیشرفت کار، تخمین زمان باقیمانده و تنظیم فرکانس نظرسنجی کمک کنند. به عنوان مثال، ممکن است وقتی estimated_completion_ratio پایین است، نظرسنجی کمتر و وقتی به ۱.۰ نزدیک میشود، بیشتر انجام شود.
فهرست کردن تمام نتایج کار دستهای
وقتی تمام کارهای دستهای شما تمام شد، ListBatchJobResults برای فهرست کردن نتایج آنها و چاپ وضعیتها و پاسخهایشان استفاده کنید:
جاوا
private void fetchAndPrintResults( BatchJobServiceClient batchJobServiceClient, String batchJobResourceName) { System.out.printf( "Mutate job with resource name '%s' has finished. Now, printing its results...%n", batchJobResourceName); // Gets all the results from running mutate job and prints their information. ListBatchJobResultsPagedResponse batchJobResults = batchJobServiceClient.listBatchJobResults( ListBatchJobResultsRequest.newBuilder() .setResourceName(batchJobResourceName) .setPageSize(PAGE_SIZE) .build()); for (BatchJobResult batchJobResult : batchJobResults.iterateAll()) { System.out.printf( "Mutate job #%d has a status '%s' and response of type '%s'.%n", batchJobResult.getOperationIndex(), batchJobResult.getStatus().getMessage().isEmpty() ? "N/A" : batchJobResult.getStatus().getMessage(), batchJobResult .getMutateOperationResponse() .getResponseCase() .equals(ResponseCase.RESPONSE_NOT_SET) ? "N/A" : batchJobResult.getMutateOperationResponse().getResponseCase()); } }
سی شارپ
private static void FetchAndPrintResults(BatchJobServiceClient batchJobService, string batchJobResourceName) { Console.WriteLine($"batch job with resource name '{batchJobResourceName}' has " + $"finished. Now, printing its results..."); ListBatchJobResultsRequest request = new ListBatchJobResultsRequest() { ResourceName = batchJobResourceName, PageSize = PAGE_SIZE, }; ListBatchJobResultsResponse resp = new ListBatchJobResultsResponse(); // Gets all the results from running batch job and prints their information. foreach (BatchJobResult batchJobResult in batchJobService.ListBatchJobResults(request)) { if (!batchJobResult.IsFailed) { Console.WriteLine($"batch job result #{batchJobResult.OperationIndex} is " + $"successful and response is of type " + $"'{batchJobResult.MutateOperationResponse.ResponseCase}'."); } else { Console.WriteLine($"batch job result #{batchJobResult.OperationIndex} " + $"failed with error message {batchJobResult.Status.Message}."); foreach (GoogleAdsError error in batchJobResult.Failure.Errors) { Console.WriteLine($"Error found: {error}."); } } } }
پی اچ پی
private static function fetchAndPrintResults( BatchJobServiceClient $batchJobServiceClient, string $batchJobResourceName ): void { printf( "Batch job with resource name '%s' has finished. Now, printing its results...%s", $batchJobResourceName, PHP_EOL ); // Gets all the results from running batch job and print their information. $batchJobResults = $batchJobServiceClient->listBatchJobResults( ListBatchJobResultsRequest::build($batchJobResourceName)->setPageSize(self::PAGE_SIZE) ); foreach ($batchJobResults->iterateAllElements() as $batchJobResult) { /** * @var BatchJobResult $batchJobResult */ printf( "Batch job #%d has a status '%s' and response of type '%s'.%s", $batchJobResult->getOperationIndex(), $batchJobResult->getStatus() ? $batchJobResult->getStatus()->getMessage() : 'N/A', $batchJobResult->getMutateOperationResponse() ? $batchJobResult->getMutateOperationResponse()->getResponse() : 'N/A', PHP_EOL ); } }
پایتون
def fetch_and_print_results( client: GoogleAdsClient, batch_job_service: BatchJobServiceClient, resource_name: str, ) -> None: """Prints all the results from running the batch job. Args: client: an initialized GoogleAdsClient instance. batch_job_service: an instance of the BatchJobService message class. resource_name: a str of a resource name for a batch job. """ print( f'Batch job with resource name "{resource_name}" has finished. ' "Now, printing its results..." ) list_results_request: ListBatchJobResultsRequest = client.get_type( "ListBatchJobResultsRequest" ) list_results_request.resource_name = resource_name list_results_request.page_size = 1000 # Gets all the results from running batch job and prints their information. batch_job_results: ListBatchJobResultsResponse = ( batch_job_service.list_batch_job_results(request=list_results_request) ) for batch_job_result in batch_job_results: status: str = batch_job_result.status.message status = status if status else "N/A" result: Any = batch_job_result.mutate_operation_response result = result or "N/A" print( f"Batch job #{batch_job_result.operation_index} " f'has a status "{status}" and response type "{result}"' )
روبی
def fetch_and_print_results(batch_job_service, batch_job_resource_name) puts "Batch job with resource name '#{batch_job_resource_name}' has " \ "finished. Now, printing its results..." \ # Gets all the results from running batch job and print their information. batch_job_results = batch_job_service.list_batch_job_results( resource_name: batch_job_resource_name, page_size: PAGE_SIZE, ) batch_job_results.each do |result| puts "Batch job ##{result.operation_index} has a status " \ "#{result.status ? result.status.message : 'N/A'} and response of type " \ "#{result.mutate_operation_response ? result.mutate_operation_response.response : 'N/A'}" end end
پرل
sub fetch_and_print_results { my ($batch_job_service, $batch_job_resource_name) = @_; printf "Batch job with resource name '%s' has finished. " . "Now, printing its results...\n", $batch_job_resource_name; # Get all the results from running batch job and print their information. my $list_batch_job_results_response = $batch_job_service->list_results({ resourceName => $batch_job_resource_name, pageSize => PAGE_SIZE }); foreach my $batch_job_result (@{$list_batch_job_results_response->{results}}) { printf "Batch job #%d has a status '%s' and response of type '%s'.\n", $batch_job_result->{operationIndex}, $batch_job_result->{status} ? $batch_job_result->{status}{message} : "N/A", $batch_job_result->{mutateOperationResponse} ? [keys %{$batch_job_result->{mutateOperationResponse}}]->[0] : "N/A"; } }
حلقه زدن
# Gets the results of a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # BATCH_JOB_RESOURCE_NAME: # The operation name of the running batch job as returned by the previous # step. curl -f --request GET \ "https://googleads.googleapis.com/v${API_VERSION}/${BATCH_JOB_RESOURCE_NAME}:listResults?pageSize=1000" \ --header "Content-Type: application/json" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}"
در ListBatchJobResultsRequest ، فیلد page_size در صورت حذف یا تنظیم روی 0 ، حداکثر مقدار پیشفرض 1000 را دارد. تنظیم page_size روی مقداری بزرگتر از 1000 یا کوچکتر از 0 خطای BatchJobError.INVALID_PAGE_SIZE را برمیگرداند.
هر BatchJobResult عملیات مربوطه را با استفاده operation_index ، اندیس مبتنی بر 0 از MutateOperation آپلود شده در کار دستهای، شناسایی میکند.
- عملیات موفقیتآمیز :
mutate_operation_responseمقداردهی میشود (responseآن شاملresource_nameمنبع تغییر یافته، به علاوه تمام فیلدهای تغییرپذیر در صورتی کهresponse_content_typeرویMUTABLE_RESOURCEتنظیم شده باشد) وstatusنیز تنظیم نشده است. - عملیات ناموفق (یا اجرا نشده) :
mutate_operation_responseتنظیم نشده است وstatusشامل جزئیات خطای مربوط به عملیات است.
لغو یا حذف یک کار دستهای
نحوهی متوقف کردن یا حذف یک کار دستهای بستگی به این دارد که آیا RunBatchJob فراخوانی شده است یا خیر:
- قبل از فراخوانی
RunBatchJob: در حالی کهstatusکارPENDINGاست، میتوانید با فراخوانیMutateBatchJobبه همراهBatchJobOperation.remove، کار دستهای را لغو کنید. فراخوانیremoveپس از شروع اجرای کار، خطایBatchJobError.CAN_ONLY_REMOVE_PENDING_JOBرا برمیگرداند. - پس از فراخوانی
RunBatchJob: هنگامی که یک عملیات طولانی مدت وجود دارد، میتوانید با فراخوانیCancelOperationروی عملیات طولانی مدت، عملیات دستهای در حال اجرا را لغو کنید. از آنجا که عملیات استاندارد در یک کار دستهای با فعال بودن خطای جزئی اجرا میشوند (عملیات در زیردستههای اتمی به هم برگردانده میشوند)، لغو یک کار دستهای، عملیاتی را که قبلاً قبل از اعمال لغو تکمیل شدهاند، به عقب برنمیگرداند. هنگامی کهstatusیک کار لغو شده (یا سقط شده) بهDONEتغییر میکند، فراخوانیListBatchJobResultsورودیهایBatchJobResultرا برای پیشوند اجرا شده (operation_index<executed_operation_count) به همراه نتایج اجرای فردی آنها، و به دنبال آن ورودیهایBatchJobResultرا برای تمام عملیات اجرا نشده باقی مانده (operation_indexازexecuted_operation_countتاoperation_count- 1) با unsetmutate_operation_responseوstatusپر شده با وضعیت خطای سطح کار (یاInternalError.INTERNAL_ERROR) برمیگرداند.
مدیریت خطا
BatchJobService عملیات استاندارد را با فعال بودن خطای جزئی اجرا میکند (عملیات موفق حتی اگر سایر عملیات در همان کار با شکست مواجه شوند، به جز در زیردستههای اتمی، اجرا میشوند) و به طور خودکار عملیاتی را که به دلیل خطاهای گذرا شکست میخورند، دوباره امتحان میکند. با این حال، نمیتوان از همه سناریوهای شکست اجتناب کرد. عملیاتی که به دلیل خطاهای اعتبارسنجی شکست خوردهاند را میتوان اصلاح کرد و در یک کار دستهای جدید دوباره ارسال کرد. به همین ترتیب، هنگامی که یک کار دستهای قبل از تکمیل تمام عملیات لغو یا متوقف میشود، میتوانید عملیات اجرا نشده ( operation_index >= executed_operation_count ) را به همراه هرگونه عملیات شکست خورده از پیشوند اجرا شده در یک کار دستهای جدید دوباره ارسال کنید.