Les événements métier (emails d'invitation, reset password, activation) bloquaient la réponse API en étant traités de manière synchrone. Ce commit route ces événements vers un transport AMQP asynchrone avec un worker dédié, garantissant des réponses API rapides et une gestion robuste des échecs. Le retry utilise une stratégie Fibonacci (1s, 1s, 2s, 3s, 5s, 8s, 13s) qui offre un bon compromis entre réactivité et protection des services externes. Les messages qui épuisent leurs tentatives arrivent dans une dead-letter queue Doctrine avec alerte email à l'admin. La commande console CreateTestActivationTokenCommand détecte désormais les comptes déjà actifs et génère un token de réinitialisation de mot de passe au lieu d'un token d'activation, évitant une erreur bloquante lors de la ré-invitation par un admin.
105 lines
2.8 KiB
Twig
105 lines
2.8 KiB
Twig
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Alerte Dead-Letter - Classeo</title>
|
|
<style>
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
line-height: 1.6;
|
|
color: #333;
|
|
max-width: 600px;
|
|
margin: 0 auto;
|
|
padding: 20px;
|
|
}
|
|
.header {
|
|
text-align: center;
|
|
padding: 20px 0;
|
|
border-bottom: 2px solid #dc2626;
|
|
}
|
|
.header h1 {
|
|
color: #dc2626;
|
|
margin: 0;
|
|
font-size: 24px;
|
|
}
|
|
.content {
|
|
padding: 30px 0;
|
|
}
|
|
.alert-box {
|
|
background-color: #fef2f2;
|
|
border: 1px solid #fecaca;
|
|
border-radius: 8px;
|
|
padding: 20px;
|
|
margin: 20px 0;
|
|
}
|
|
.detail-row {
|
|
display: flex;
|
|
padding: 8px 0;
|
|
border-bottom: 1px solid #e5e7eb;
|
|
}
|
|
.detail-label {
|
|
font-weight: bold;
|
|
min-width: 160px;
|
|
color: #6b7280;
|
|
}
|
|
.error-box {
|
|
background-color: #f9fafb;
|
|
border: 1px solid #e5e7eb;
|
|
border-radius: 4px;
|
|
padding: 12px;
|
|
margin-top: 16px;
|
|
font-family: monospace;
|
|
font-size: 13px;
|
|
word-break: break-word;
|
|
}
|
|
.footer {
|
|
text-align: center;
|
|
padding: 20px 0;
|
|
border-top: 1px solid #e5e7eb;
|
|
color: #9ca3af;
|
|
font-size: 12px;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="header">
|
|
<h1>Message en Dead-Letter</h1>
|
|
</div>
|
|
|
|
<div class="content">
|
|
<div class="alert-box">
|
|
<p>Un message a atteint la dead-letter queue après avoir épuisé toutes ses tentatives de retry.</p>
|
|
</div>
|
|
|
|
<div class="detail-row">
|
|
<span class="detail-label">Type d'événement</span>
|
|
<span>{{ eventType }}</span>
|
|
</div>
|
|
|
|
<div class="detail-row">
|
|
<span class="detail-label">Nombre de tentatives</span>
|
|
<span>{{ retryCount }}</span>
|
|
</div>
|
|
|
|
<div class="detail-row">
|
|
<span class="detail-label">Transport</span>
|
|
<span>{{ transportName }}</span>
|
|
</div>
|
|
|
|
<div class="error-box">
|
|
<strong>Dernière erreur :</strong><br>
|
|
{{ lastError }}
|
|
</div>
|
|
|
|
<p style="margin-top: 24px;">
|
|
Utilisez la commande <code>app:messenger:review-failed</code> pour inspecter et rejouer les messages échoués.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="footer">
|
|
<p>Classeo - Alerte Système Automatique</p>
|
|
</div>
|
|
</body>
|
|
</html>
|