В этой главе мы разберем пакетную обработку в Apex. Рассмотрим сценарий, в котором мы будем ежедневно обрабатывать большое количество записей, возможно, для очистки данных или удаления некоторых неиспользуемых данных.
Что такое пакетный апекс?
Пакетный Apex — это асинхронное выполнение кода Apex, специально разработанное для обработки большого количества записей и обладающее большей гибкостью в ограничениях регулятора, чем синхронный код.
Когда использовать Batch Apex?
-
Если вы хотите обрабатывать большое количество записей ежедневно или даже в течение определенного промежутка времени, тогда вы можете перейти к пакетной апекс.
-
Кроме того, если вы хотите, чтобы операция была асинхронной, вы можете реализовать пакетную вершинку. Пакетный Apex представлен как интерфейс, который должен быть реализован разработчиком. Пакетные задания могут программно вызываться во время выполнения с помощью Apex. Пакетная обработка Apex работает с небольшими партиями записей, охватывая весь набор записей и разбивая обработку на управляемые порции данных.
Если вы хотите обрабатывать большое количество записей ежедневно или даже в течение определенного промежутка времени, тогда вы можете перейти к пакетной апекс.
Кроме того, если вы хотите, чтобы операция была асинхронной, вы можете реализовать пакетную вершинку. Пакетный Apex представлен как интерфейс, который должен быть реализован разработчиком. Пакетные задания могут программно вызываться во время выполнения с помощью Apex. Пакетная обработка Apex работает с небольшими партиями записей, охватывая весь набор записей и разбивая обработку на управляемые порции данных.
Использование Batch Apex
Когда мы используем Batch Apex, мы должны реализовать предоставляемый Salesforce интерфейс Database.Batchable, а затем программно вызвать класс.
Вы можете контролировать класс, выполнив следующие действия —
Чтобы отслеживать или останавливать выполнение пакетного задания Apex, перейдите в «Настройка» → «Мониторинг» → «Задания Apex» или «Задания» → «Задания Apex».
Интерфейс Database.Batchable имеет следующие три метода, которые необходимо реализовать:
- Начните
- казнить
- Конец
Давайте теперь разберемся с каждым методом в деталях.
Начните
Метод Start является одним из трех методов интерфейса Database.Batchable.
Синтаксис
global void execute(Database.BatchableContext BC, list<sobject<) {}
Этот метод вызывается при запуске пакетного задания и собирает данные, с которыми будет работать пакетное задание.
Рассмотрим следующие моменты, чтобы понять метод —
-
Используйте объект Database.QueryLocator, когда вы используете простой запрос, чтобы сгенерировать область объектов, используемых в пакетном задании. В этом случае предел строки данных SOQL будет обойден.
-
Используйте повторяемый объект, когда у вас есть сложные критерии для обработки записей. Database.QueryLocator определяет область записей, которые должны быть обработаны.
Используйте объект Database.QueryLocator, когда вы используете простой запрос, чтобы сгенерировать область объектов, используемых в пакетном задании. В этом случае предел строки данных SOQL будет обойден.
Используйте повторяемый объект, когда у вас есть сложные критерии для обработки записей. Database.QueryLocator определяет область записей, которые должны быть обработаны.
казнить
Давайте теперь разберемся с методом Execute интерфейса Database.Batchable.
Синтаксис
global void execute(Database.BatchableContext BC, list<sobject<) {}
где список <sObject <возвращается методом Database.QueryLocator.
Этот метод вызывается после метода Start и выполняет всю обработку, необходимую для пакетного задания.
Конец
Теперь мы обсудим метод Finish интерфейса Database.Batchable.
Синтаксис
global void finish(Database.BatchableContext BC) {}
Этот метод вызывается в конце, и вы можете выполнить некоторые завершающие действия, такие как отправка электронного письма с информацией об обработанных записях пакетного задания и состоянии.
Пакетный пример Apex
Давайте рассмотрим пример нашей существующей химической компании и предположим, что у нас есть требование обновить поле «Статус клиента» и «Описание клиента» в записях клиентов, которые были помечены как активные и которые создали дату как сегодня. Это должно быть сделано ежедневно, и пользователю должно быть отправлено электронное письмо о состоянии пакетной обработки. Обновите статус клиента как «Обработано», а описание клиента — как «Обновлено через пакетное задание».
// Batch Job for Processing the Records global class CustomerProessingBatch implements Database.Batchable<sobject> { global String [] email = new String[] {'[email protected]'}; // Add here your email address here // Start Method global Database.Querylocator start (Database.BatchableContext BC) { return Database.getQueryLocator('Select id, Name, APEX_Customer_Status__c, APEX_Customer_Decscription__c From APEX_Customer__c WHERE createdDate = today AND APEX_Active__c = true'); // Query which will be determine the scope of Records fetching the same } // Execute method global void execute (Database.BatchableContext BC, List<sobject> scope) { List<apex_customer__c> customerList = new List<apex_customer__c>(); List<apex_customer__c> updtaedCustomerList = new List<apex_customer__c>(); // List to hold updated customer for (sObject objScope: scope) { APEX_Customer__c newObjScope = (APEX_Customer__c)objScope ; // type casting from generic sOject to APEX_Customer__c newObjScope.APEX_Customer_Decscription__c = 'Updated Via Batch Job'; newObjScope.APEX_Customer_Status__c = 'Processed'; updtaedCustomerList.add(newObjScope); // Add records to the List System.debug('Value of UpdatedCustomerList '+updtaedCustomerList); } if (updtaedCustomerList != null && updtaedCustomerList.size()>0) { // Check if List is empty or not Database.update(updtaedCustomerList); System.debug('List Size ' + updtaedCustomerList.size()); // Update the Records } } // Finish Method global void finish(Database.BatchableContext BC) { Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); // Below code will fetch the job Id AsyncApexJob a = [Select a.TotalJobItems, a.Status, a.NumberOfErrors, a.JobType, a.JobItemsProcessed, a.ExtendedStatus, a.CreatedById, a.CompletedDate From AsyncApexJob a WHERE id = :BC.getJobId()]; // get the job Id System.debug('$$$ Jobid is'+BC.getJobId()); // below code will send an email to User about the status mail.setToAddresses(email); mail.setReplyTo('[email protected]'); // Add here your email address mail.setSenderDisplayName('Apex Batch Processing Module'); mail.setSubject('Batch Processing '+a.Status); mail.setPlainTextBody('The Batch Apex job processed' + a.TotalJobItems+'batches with '+a.NumberOfErrors+'failures'+'Job Item processed are'+a.JobItemsProcessed); Messaging.sendEmail(new Messaging.Singleemailmessage [] {mail}); } }
Чтобы выполнить этот код, сначала сохраните его, а затем вставьте следующий код в «Выполнить анонимно». Это создаст объект класса, а метод Database.execute выполнит пакетное задание. Как только работа будет завершена, на указанный электронный адрес будет отправлено электронное письмо. Убедитесь, что у вас есть запись клиента, которая имеет Актив как проверено.
// Paste in Developer Console CustomerProessingBatch objClass = new CustomerProessingBatch(); Database.executeBatch (objClass);
Как только этот класс будет выполнен, проверьте указанный вами адрес электронной почты, на который вы получите письмо с информацией. Кроме того, вы можете проверить состояние пакетного задания через страницу мониторинга и действия, описанные выше.
Если вы проверите журналы отладки, то вы можете найти размер списка, который указывает, сколько записей было обработано.
Ограничения
Мы можем обрабатывать только 5 пакетных заданий одновременно. Это одно из ограничений Batch Apex.
Планирование пакетного задания Apex с использованием страницы сведений о Apex
Вы можете запланировать класс Apex через страницу сведений об Apex, как указано ниже —
Шаг 1 — Перейдите к настройке ⇒ Apex Classes, нажмите на Apex Classes.
Шаг 2 — Нажмите на кнопку Schedule Apex.
Шаг 3 — Предоставьте детали.
Планирование пакетного задания Apex с использованием интерфейса Schedulable
Вы можете запланировать пакетное задание Apex с помощью интерфейса Schedulable, как указано ниже —