Como criar Crons personalizadas no Magento 2

Lucas Teixeira dos Santos Santana - Nov 12 '21 - - Dev Community

Contextualizando

O que é um Cron job?

Um cron job (trabalho agendado) é uma ferramenta de agendamento que permite controlar tarefas repetitivas a serem executadas em tempos pré-configurados. Através de um trabalho agendado é possível executar determinadas tarefas em horários, datas ou intervalos fixos.


Código

crontab.xml

Os trabalhos agendados são configurados no arquivo crontab.xml. É um arquivo que contém instruções para executar uma determinada tarefa automaticamente por determinados ciclos de um período. Esses arquivos devem seguir a estruturas de pastas \{Vendor}/{Module}/etc/{area}\crontab.xml.

O Magento depende da configuração adequada para muitas tarefas importantes, incluindo indexação. Falhando na configuração pode resultar que o Magento não funcione como esperado.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
    <group id="{group_name}">
        <job name="{job_name}" instance="{Vendor}\{Module}\Cron\{CronName}" method="{methodName}">
            <schedule>{time}</schedule>
        </job>
    </group>
</config>
Enter fullscreen mode Exit fullscreen mode
  • Group id: é um atributo obrigatório que contém o nome do grupo dos trabalhos agendados;
  • Job name: é um atributo obrigatório que contém o ID único do trabalho agendado;
  • Job instance: é um atributo obrigatório que contém o caminho da classe que será instanciada;
  • Job method: é um atributo obrigatório que contém o método que será executado ao instanciar a classe;
  • schedule: é uma tag terá um valor no formato dos agendamentos das crons.

Cron

Já os arquivos com a lógica que serão executados devem seguir a estrutura de pastas \{Vendor}\{Module}\Cron\{CronName} e não devem estender nenhuma classe, apenas conter o nome do método que será definido no atributo method do arquivo crontab.xml.

<?php

namespace {Vendor}\{Module}\Cron;

class {CronName}
{
    public function {methodName}(): {type}
    {
        // Code here
    }
}
Enter fullscreen mode Exit fullscreen mode

cron_groups.xml

Um grupo de trabalhos agendados é um grupo que permite a execução fácil de mais de um processo ao mesmo tempo. A maioria dos módulos do Magento utiliza o grupo default, caso a cron que esteja criando não pertença a este grupo ou um grupo já criado, este arquivo deve ser criado informando o nome do novo grupo . É possível declarar um novo grupo e especificar as opções de configurações (todas as configurações de acordo com o escopo) através do arquivo \{Vendor}\{Module}\etc\cron_groups.xml.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/cron_groups.xsd">
    <group id="{group_name}">
        <schedule_generate_every>{time}</schedule_generate_every>
        <schedule_ahead_for>{time}</schedule_ahead_for>
        <schedule_lifetime>{time}</schedule_lifetime>
        <history_cleanup_every>{time}</history_cleanup_every>
        <history_success_lifetime>{time}</history_success_lifetime>
        <history_failure_lifetime>{time}</history_failure_lifetime>
        <use_separate_process>{binary}</use_separate_process>
    </group>
</config>
Enter fullscreen mode Exit fullscreen mode
  • schedule_generate_every: frequência (em minutos) com que os planejamento são gravados na tabela cron_schedule;
  • schedule_ahead_for: tempo (em minutos) de antecedência com que os planejamento são gravados na tabela cron_schedule;
  • schedule_lifetime: janela de tempo (em minutos) que a tarefa agendada deverá ser iniciada ou será considerada como perdido;
  • history_cleanup_every: tempo (em minutos) que o histórico dos trabalhos agendados é mantido no banco de dados;
  • history_success_lifetime: tempo (em minutos) que o registro dos trabalhos agendados concluídos são mantidos no banco de dados;
  • history_failure_lifetime: tempo (em minutos) que o registro de trabalhos agendados fracassados são mantidos no banco de dados;
  • use_eparate_proccess: executa esse grupo de trabalho em um processo PHP separado.

Finalizando

Habilitando as alterações

Apague os arquivos que são gerados na compilação do Magento e execute o comando PHP para gerar a configuração das injeções de dependência e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc) e para limpar todos os caches de armazenamento em cache do processos.

rm -rf var/generation/
rm -rf generated/
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento flush
Enter fullscreen mode Exit fullscreen mode

Rodando as Crons

# Para executar todas as crons
php bin/magento cron:run

# Para executar as crons de um tereminado grupo
php bin/magento cron:run --group="{group_name}"
Enter fullscreen mode Exit fullscreen mode

Magerun

Magerun é uma ferramenta CLI (Command Line Interface) que pornece algumas ferramentas para trabalhar com Magento, é possível saber mais acessando o site da documentação do n98-magerun.

Um dos comandos possíveis de executar com o magerun é executar apenas uma cron específica.

./n98-magerun.phar sys:cron:run {job_name}
Enter fullscreen mode Exit fullscreen mode

Diretórios e Arquivos

Segue a a lista de diretórios e arquivos que devem ser criados.

- app/
  - code/
    - {Vendor}/
        - {Module}/
          - Cron/
            - {CronName}.php
          - etc/
            - crontab.xml
            - module.xml
          - registration.php
          - composer.json
Enter fullscreen mode Exit fullscreen mode
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .