Usar o Apex assÃncrono
Objetivos de aprendizagem
Após concluir esta unidade, você estará apto a:
- Saber quando usar o Apex assÃncrono
- Usar métodos futuros para lidar com um callout da web
- Trabalhar com a interface que permite a execução em lote para processar um grande número de registros
- Compreender as vantagens de usar a interface que permite a execução em fila quando é preciso encontrar um meio-termo
Acompanhar com o Trail Together
Deseja acompanhar um especialista enquanto trabalha nesta etapa? Veja este vÃdeo que faz parte da série Trail Together.
(Este clipe começa na marca dos 32:07 minutos, caso você queira retroceder e ver o inÃcio da etapa novamente.)
Quando ser assÃncrono
Como desenvolvedor .NET, você provavelmente já foi exposto ao mundo da programação assÃncrona. Vamos assumir que você já sabe o que ela é e entende os benefÃcios de usar esse tipo de modelo de programação. O que você talvez não saiba é quando usar a programação assÃncrona na plataforma do Lightning.
A escolha da programação assÃncrona costuma ser embasada pelos três motivos a seguir.
- Processar uma quantidade muito grande de registros. Esse motivo é exclusivo do mundo multilocatário da plataforma do Lightning, comandado pelos limites. Os limites associados aos processos assÃncronos são mais altos do que os associados aos processos sÃncronos. Por isso, quando você precisa processar milhares ou até milhões de registros, o processamento assÃncrono é a melhor opção.
- Fazer callouts para serviços da web externos. O processamento dos callouts pode ser bem demorado, mas na plataforma do Lightning, os acionadores não podem fazer callouts diretamente.
- Criar uma experiência de usuário melhor e mais rápida descarregando parte do processamento nas chamadas assÃncronas. Por que fazer tudo de uma vez? Se dá para esperar, deixe esperar.
Métodos futuros
Quando você precisa fazer um callout a um serviço da web ou quer descarregar um processamento simples numa tarefa assÃncrona, criar um método futuro pode ser a melhor saÃda.
Transformar um método de processamento sÃncrono em processamento assÃncrono é incrivelmente fácil. Basta acrescentar a anotação @future
ao método. Além disso, você só precisa garantir que o método é estático e retorna apenas um tipo nulo. Por exemplo, para criar um método que realize um callout a um serviço da web, podemos fazer assim:
Depois, podemos chamá-lo como farÃamos com qualquer outro método estático. É moleza!
Limitações dos métodos futuros
Métodos futuros oferecem uma ótima opção para os desenvolvedores do Salesforce, no entanto, eles não deixam de ter desvantagens. Aqui estão algumas das limitações a considerar antes de usar um método futuro.
- Não é possÃvel rastrear a execução porque não é retornada uma ID de trabalho do Apex.
- Os parâmetros precisam de dados primitivos ou coleções de tipos de dados primitivos. Os métodos futuros não podem receber sObjects como argumentos, pois eles podem mudar no perÃodo anterior à execução do método @future.
- Não é possÃvel encadear métodos futuros e fazer com que um chame o outro. Use o Apex que permite a execução em fila se precisar de execução em uma determinada ordem.
Embora as chamadas assÃncronas sejam à s vezes feitas para evitar limites, ainda é necessário considerar os limites. Confira o link Execution Governors and Limits em Resources.
Apex de lote ou agendado
Outra ferramenta assÃncrona muito usada é a interface que permite a execução em lote. O motivo nº 1 para alguém usá-la é a necessidade de processar um grande número de registros. Por exemplo, caso você queira limpar ou arquivar até 150 milhões de registros, a interface que permite a execução em lote é o ideal, ou utilize a API em massa 2.0 em seu código Apex. É possÃvel até agendar os lotes para execução em determinado momento.
Para usá-la, sua classe implementa a interface Database.Batchable. Você também define os métodos start(), execute() e finish(). Depois, é possÃvel invocar uma classe de lote usando o método Database.executeBatch. Por exemplo, o código a seguir cria uma classe que permite a execução em lote, que processa todas as contas de uma organização e envia um email quando termina de fazer isso.
Nesse caso, você poderia invocar a classe de lote usando um código anônimo como esse:
Limitações da interface que permite a execução em lote
A interface que permite a execução em lote é excelente. No entanto, como tudo, ela também tem suas limitações.
- A solução de problemas pode ser problemática.
- Os trabalhos ficam em fila e estão sujeitos à disponibilidade de servidor, que às vezes pode demorar mais do que o esperado.
- Já falamos dos limites?
E então surgiu o Apex que permite a execução em fila
Durante muito tempo, os métodos futuros e a interface que permite a execução em lote foram os métodos principais de os desenvolvedores fazerem o processamento assÃncrono. Mas você se lembra de todas as limitações que apresentamos? Bem, elas estavam causando problemas para alguns desenvolvedores, que clamaram por uma solução melhor.
No inverno de 2015, o Salesforce atendeu ao pedido com o Apex que permite a execução em fila. Ele representa o melhor dos métodos futuros e da interface que permite a execução em lote, tudo reunido numa única superferramenta assÃncrona. Os desenvolvedores que eram forçados a usar a interface, que permite a execução em lote, mais lenta para contornar as limitações dos métodos futuros podiam retornar a uma ferramenta que fazia mais sentido. O Apex que permite a execução em fila oferece os benefÃcios a seguir para os métodos futuros.
- Tipos não primitivos – As classes podem aceitar variáveis de parâmetro de tipos de dados não primitivos, como sObjects ou tipos personalizados do Apex.
- Monitoramento – Quando você envia o trabalho, é retornada uma jobId que pode ser usada para identificar o trabalho e monitorar seu progresso.
- Encadeamento de trabalhos – É possÃvel encadear um trabalho a outro iniciando o segundo trabalho a partir do trabalho em execução. O encadeamento de trabalhos é útil para o processamento sequencial.
Então como isso funciona? Ainda bem que você perguntou.
Como o Apex que permite a execução em fila contém o melhor dos métodos futuros, ele é muito mais fácil de implementar do que o Apex de lote. Ele não tem essas limitações incômodas que apresentamos aqui. Para demonstrar como ele funciona, vamos aproveitar o código de exemplo que usa um método futuro para fazer um callout da web e implementá-lo usando o Apex que permite a execução em fila.
Para invocar o Apex que permite a execução em fila, você precisa de algo mais ou menos assim:
Quero saber mais
Além das interfaces que permitem a execução em fila, o Salesforce também introduziu a Apex Flex Queue na primavera de 2015, que eliminou a limitação de cinco lotes concomitantes. Ela também permite que os desenvolvedores monitorem e administrem a ordem dos trabalhos em fila. Confira os links em Resources para saber mais.
Este módulo apresentou aos desenvolvedores .NET as opções assÃncronas disponÃveis na plataforma do Lightning. Para mergulhar fundo nesse tópico, aprendendo sobre testes, monitoramento de trabalhos e melhores práticas, confira o módulo Apex assÃncrono.
Recursos
- O módulo Apex assÃncrono do Trailhead cobre os detalhes do Apex futuro, que permite a execução em fila, de lote e agendado
- Administradores e limites de execução no Guia do desenvolvedor do código do Apex