1. Definição: O código é executado em segundo plano, sem bloquear a execução do código principal.
2. Quando usar APEX Assíncrono?
2.1. Tarefas longas e demoradas
2.1.1. Processamento de grandes volumes de dados, geração de relatórios complexos, integrações com sistemas externos.
2.2. Processamento em lote
2.2.1. Importação de dados, envio de emails em massa, atualização de registros em lote.
2.3. Tarefas que não exigem resposta imediata
2.3.1. Cálculos complexos, análise de dados, tarefas agendadas.
3. Implementação do APEX Assíncrono
3.1. Future Methods
3.1.1. São métodos que são executados em segundo plano, liberando o thread principal para outras tarefas.
3.1.1.1. @future public static void sendEmailAsync(List<String> emails) { for(String email : emails) { Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{mail}); } }
3.2. Queueable Apex
3.2.1. Permite executar um processo em lotes, dividindo o trabalho em partes menores.
3.2.1.1. global class AccountUpdateBatch implements Database.Queueable<sObject> { global void execute(Database.QueueableContext ctx, List<sObject> scope) { for(sObject record : scope) { record.Name = 'Updated'; update record; } } }
3.3. Batch Apex
3.3.1. Semelhante ao Queueable Apex, mas com funcionalidades adicionais para processamento em massa.
3.3.1.1. global class AccountUpdateBatch implements Database.Batchable<sObject> { global Integer start(Database.BatchableContext BC) { // Query para obter os registros a serem processados return Database.getQueryLocator([SELECT Id FROM Account]).getSize(); } global void execute(Database.BatchableContext BC, List<Account> scope) { // Lógica para atualizar os registros update scope; } global void finish(Database.BatchableContext BC) { // Lógica a ser executada após o término do processo } }
3.4. Scheduled Apex
3.4.1. Permite agendar a execução de um método em um horário específico ou em intervalos regulares.
3.4.1.1. global class DailyJob implements Schedulable { global void execute(SchedulableContext SC) { List<Account> accounts = [SELECT Id FROM Account]; // ... processar os dados ... } }
4. Vantagens
4.1. Melhora na escalabilidade
4.1.1. Permite lidar com um maior volume de solicitações, pois as tarefas são distribuídas em diferentes threads ou processos.
4.2. Aumento da responsividade da aplicação
4.2.1. Melhora a experiência do usuário, pois a aplicação não fica bloqueada durante a execução de tarefas longas.
4.3. Desacoplamento de componentes
4.3.1. Permite que diferentes partes da aplicação sejam executadas de forma independente, facilitando a manutenção e o desenvolvimento.
4.4. Maior tolerância a falhas
4.4.1. Se uma tarefa assíncrona falhar, não compromete toda a aplicação.