Site

Failed Jobs

Quando um Job falha após exceder todas as tentativas definidas, o MUCRM automaticamente move ele para a lista de Failed Jobs. Isso permite monitorar falhas sem perder informações importantes da execução.


Como Funciona

Sempre que uma exceção acontece dentro do método handle(), o Worker:

  1. Incrementa as tentativas
  2. Aplica retry/backoff
  3. Tenta novamente
  4. Move o Job para Failed Jobs caso exceda o limite

Exemplo

<?php

namespace MUCRM\shared\jobs;

use MUCRM\engine\queue\job;

class send_discord_webhook extends job
{
    public int $tries = 3;

    public function handle(): void
    {
        throw new \Exception('Discord offline');
    }
}

Após todas as tentativas falharem, o Job será marcado como Failed.


Método failed()

Você pode tratar falhas manualmente utilizando failed(). Esse método é executado automaticamente quando o Job falha definitivamente.

<?php

namespace MUCRM\shared\jobs;

use MUCRM\engine\queue\job;
use MUCRM\engine\support\log;
use Throwable;

class send_item_reward extends job
{
    public function handle(): void
    {
        throw new \Exception('Banco offline');
    }

    public function failed(Throwable $e): void
    {
        log::error(
            'Falha ao entregar recompensa: ' .
            $e->getMessage()
        );
    }
}

O que Pode ser Feito no failed()

  • Registrar logs
  • Enviar alertas
  • Notificar Discord
  • Notificar Telegram
  • Enviar email
  • Criar auditoria
  • Salvar métricas
  • Disparar webhooks

Retry Manual

Você pode reenfileirar Jobs falhos manualmente:

$payload = json_decode($failed->payload, true);

$jobClass = $payload['job'];

$jobClass::dispatch($payload['data']);

Fluxo de Execução

dispatch()
    ↓
fila de jobs
    ↓
worker executa
    ↓
sucesso?
 ├── SIM → job removido
 └── NÃO
        ↓
 retry/backoff
        ↓
 excedeu tentativas?
 ├── NÃO → volta para fila
 └── SIM → failed jobs

Boas Práticas

  • Nunca silencie exceções
  • Utilize logs no método failed()
  • Monitore jobs falhos
  • Use retries limitados
  • Utilize backoff progressivo
  • Valide dados antes de executar
  • Evite Jobs gigantes

Exemplo Real

<?php

namespace MUCRM\shared\jobs;

use MUCRM\engine\queue\job;
use MUCRM\engine\support\log;
use Throwable;

class WeeklyRankingReset extends Job
{
    public int $tries = 5;

    public function handle(): void
    {
        Ranking::truncate();
    }

    public function failed(Throwable $e): void
    {
        log::error(
            'Falha ao resetar ranking semanal: ' .
            $e->getMessage()
        );
    }
}