Учебники

Апекс — Пакетная обработка

В этой главе мы разберем пакетную обработку в Apex. Рассмотрим сценарий, в котором мы будем ежедневно обрабатывать большое количество записей, возможно, для очистки данных или удаления некоторых неиспользуемых данных.

Что такое пакетный апекс?

Пакетный Apex — это асинхронное выполнение кода Apex, специально разработанное для обработки большого количества записей и обладающее большей гибкостью в ограничениях регулятора, чем синхронный код.

Когда использовать Batch Apex?

  • Если вы хотите обрабатывать большое количество записей ежедневно или даже в течение определенного промежутка времени, тогда вы можете перейти к пакетной апекс.

  • Кроме того, если вы хотите, чтобы операция была асинхронной, вы можете реализовать пакетную вершинку. Пакетный Apex представлен как интерфейс, который должен быть реализован разработчиком. Пакетные задания могут программно вызываться во время выполнения с помощью Apex. Пакетная обработка Apex работает с небольшими партиями записей, охватывая весь набор записей и разбивая обработку на управляемые порции данных.

Если вы хотите обрабатывать большое количество записей ежедневно или даже в течение определенного промежутка времени, тогда вы можете перейти к пакетной апекс.

Кроме того, если вы хотите, чтобы операция была асинхронной, вы можете реализовать пакетную вершинку. Пакетный Apex представлен как интерфейс, который должен быть реализован разработчиком. Пакетные задания могут программно вызываться во время выполнения с помощью Apex. Пакетная обработка Apex работает с небольшими партиями записей, охватывая весь набор записей и разбивая обработку на управляемые порции данных.

Использование Batch Apex

Когда мы используем Batch Apex, мы должны реализовать предоставляемый Salesforce интерфейс Database.Batchable, а затем программно вызвать класс.

Вы можете контролировать класс, выполнив следующие действия —

Чтобы отслеживать или останавливать выполнение пакетного задания Apex, перейдите в «Настройка» → «Мониторинг» → «Задания Apex» или «Задания» → «Задания Apex».

Мониторинг Apex Batch Step1

Мониторинг Apex Batch Step2

Интерфейс 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.

Планирование вершины со страницы сведений Step1

Шаг 2 — Нажмите на кнопку Schedule Apex.

Планирование вершины со страницы сведений Step2

Шаг 3 — Предоставьте детали.

Планирование вершины со страницы сведений Step3

Планирование пакетного задания Apex с использованием интерфейса Schedulable

Вы можете запланировать пакетное задание Apex с помощью интерфейса Schedulable, как указано ниже —