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:
- Incrementa as tentativas
- Aplica retry/backoff
- Tenta novamente
- 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 jobsBoas 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()
);
}
}