Como criar Crons personalizadas no Magento 2
Tags: php, magento2, tutorial, braziliandevs
Published: 2021-11-12 11:53:42

## 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
<?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>
```

- **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
<?php

namespace {Vendor}\{Module}\Cron;

class {CronName}
{
    public function {methodName}(): {type}
    {
        // Code here
    }
}
```

### 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
<?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>
```

- **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.

```bash
rm -rf var/generation/
rm -rf generated/
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento flush
```

### Rodando as Crons

```bash
# 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}"
```

### 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](https://n98-magerun.readthedocs.io/en/latest/ref/overview.html).

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

```bash
./n98-magerun.phar sys:cron:run {job_name}
```

## 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
```