Agendar trabalhos com o Agendador do Apex

0
971

Apex agendado

O Agendador do Apex permite atrasar a execução para que você possa executar as classes do Apex em uma hora especificada. Isto é ideal para tarefas de manutenção diária ou semanal com o Apex de lote. Para aproveitar o agendador, escreva uma classe do Apex que implemente a interface Passível de agendamento e agende-a para execução em uma agenda específica.

Esta classe consulta oportunidades abertas que deveriam ter sido fechadas até a data atual e cria uma tarefa em cada uma para lembrar o proprietário de atualizar a oportunidade.

global class RemindOpptyOwners implements Schedulable {
    global void execute(SchedulableContext ctx) {
        List<Opportunity> opptys = [SELECT Id, Name, OwnerId, CloseDate 
            FROM Opportunity 
            WHERE IsClosed = False AND 
            CloseDate < TODAY];
        // Create a task for each opportunity in the list
        TaskUtils.remindOwners(opptys);
    }
    
}

É possível programar sua classe para ser executada por programação ou a partir da IU do Agendador do Apex.

O Salesforce oferece muitas maneiras de automatizar o processo de negócios para atender aos nossos requisitos. Possui muitas ferramentas de automação padrão, como fluxos de trabalho, Construtores de processo, processo de aprovação, etc. As organizações podem ter funcionalidades de negócios muito complexas que não podem ser atendidas pelas ferramentas de automação padrão. Para obter funcionalidades complexas, o Salesforce fornece uma linguagem de programação chamada APEX para que os desenvolvedores criem aplicativos. Você pode criar serviços da web, serviços de e-mail e realizar validações complexas em vários objetos etc. usando a linguagem Apex.

Neste artigo, veremos o procedimento passo a passo para criar o “Apex Scheduler”. Se você deseja executar um trecho do código apex em um determinado momento ou em determinados intervalos de tempo, usamos o Apex Scheduler. O agendador Apex é uma classe que é executada em intervalos regulares de tempo.

Considere um cenário de negócios, uma organização com o nome ABC PVT LTD tem um objeto personalizado chamado SAPOrders. Quando um pedido é convertido em fatura, o status do pedido será marcado como fechado. A Organização deseja excluir os pedidos fechados todos os dias às 22h, pois há vários registros que são convertidos em faturas todos os dias. Para conseguir isso, vamos criar uma classe programável que funciona todos os dias às 22h.

Se você deseja que a classe apex seja executada como um apex de programação, ela precisa implementar a Interface Schedulable.

classe global SchedulableMerge implementa Schedulable {
}

Qualquer classe apex que implemente uma interface programável deve definir o método de execução. Qualquer lógica ou operação que você deseja agendar deve ser definida dentro do método execute.

global void execute (SchedulableContext SC)

Depois de criar a classe apex, precisamos programá-la para especificar o tempo em um padrão específico que é chamado de expressão CRON. Abaixo está a expressão CRON

Segundos Minutos Horas Dia_de_mês Mês Dia_de_semana Opcional_ano

Usamos alguns caracteres especiais para definir a Expressão CRON da seguinte maneira:
• (,) Delimita valores. Por exemplo, use JAN, MAR, APR para especificar mais de um mês.
• (-) Especifica um intervalo. Por exemplo, use JAN-MAR para especificar mais de um mês.
• (*) Especifica todos os valores.
• (?) Não especifica nenhum valor específico.
• (/) Especifica incrementos.
• (L) Especifica o fim de um intervalo (último).
• (W) Especifica o dia da semana mais próximo (segunda a sexta) de um determinado dia.
• (#) Especifica o enésimo dia do mês, no formato dia da semana # day_of_month.

Criando uma classe programável para atender ao nosso requisito:

1. Vá para o console do desenvolvedor.
2. Clique em Arquivo-> Novo -> Classe Apex.
3. Insira o Nome da classe. Eu dei SAPOrdersDeleteScheduler
4. Uma classe simples com o nome da classe é gerada. Implemente a classe com programável.
5. A seguir está o código para atender ao requisito acima.

classe global SAPOrdersDeleteScheduler implementa Schedulable {
global void execute (SchedulableContext sc) {
List cldOrders = [selecione Id de SAPOrder__c onde Status__c = 'Fechado'];
List cldOrderItems = [selecione Id de SAP_Order_Item__c onde SAPOrder__c em: cldOrders];
if (! cldOrderItems.isEmpty ())
{
delete cldOrderItems;
}
if (! cldOrders.isEmpty ())
{
delete cldOrders;
}
}
}

6. No código acima, a operação é escrita no método execute (SchedulableContext sc). Antes de excluirmos os Pedidos (Pai), os Itens do Pedido (Filho) relacionados ao Pedido devem ser excluídos. Ele contém duas listas cldOrders (lista de pedidos de Conatins) e cldOrderItems (contém lista de itens de pedido relacionados a cldOrders).

7. A seguir está a classe de teste para SAPOrdersDeleteScheduler.

@isTest
public class TestSAPOrdersDeleteScheduler {
método de teste estático void testSAPOrdersDeleteScheduler () {
Lista cldOrders = new List ();
SAPOrder__c so = new SAPOrder__c (Name = 'TestOrder', Status__c = 'Open');
cldOrders.add (so);
inserir cldOrders;
system.assertEquals ('Open', so.Status__c);
Lista cldOrderitms = new List ();
SAP_Order_Item__c oItms = novo SAP_Order_Item__c (Name = 'Test OrderItem', SAPOrder__c = so.Id);
cldOrderitms.add (oItms);
inserir cldOrderitms;
so.Status__c = 'Fechado';
atualizar cldOrders;
SAPOrdersDeleteScheduler sch = new SAPOrdersDeleteScheduler ();
sch.execute (nulo);
}
}

8. Agora vamos agendar a classe SAPOrdersDeleteScheduler para ser executada todos os dias às 22h. Ela pode ser agendada de duas maneiras.

uma. Usando Apex System.schedule (Name, CRONExpression, classObject)
b. Usando UI

9. Criaremos usando o primeiro método, ou seja, usando o Apex.

10. No console do desenvolvedor, navegue até “Abrir a janela Executar Anônimos”. Abaixo está o código para agendar SAPOrdersDeleteScheduler.

SAPOrdersDeleteScheduler sc = new SAPOrdersDeleteScheduler ();
string cronExp = '0 0 22 * ​​*? * ';
string JobId = system.schedule ('Excluir SAPOrders', cronExp, sc);

 

11. No código acima, criamos um objeto da classe SAPOrdersDeleteScheduler e cronExp para agendar a aula todos os dias às 22h.

12. Quando System.schedule (‘Delete SAPOrders’, cronExp, sc) é executado, um trabalho é criado e o id é armazenado em JobId.

13. Podemos monitorar os trabalhos agendados navegando para Configurar-> Monitorar-> Trabalhos-> Agendar trabalhos. A seguir está o trabalho que criamos na etapa acima.all-Scheduler-jobs-apex-scheduler-in-salesforce

Limites do Agendador Apex:

1. Você só pode ter 100 trabalhos do Apex agendados de uma vez.
2. O número máximo de execuções agendadas do Apex por um período de 24 horas é 250.000 ou o número de licenças de usuário em sua organização multiplicado por 200, o que for maior.

Desta forma, você pode agendar classes apex para serem executadas em intervalos específicos de tempo, implementando a classe agendável. Às vezes, a execução pode ser atrasada com base na disponibilidade do serviço.

 

 

Fonte: Trailhead – https://trailhead.salesforce.com/pt-BR/content/learn/modules/asynchronous_apex/async_apex_scheduled

APEX Scheduler in Salesforce: Step-by-Step Guide