113 — Failed-Messages

Aktualisiert am 1. Juni 2026

113 — Failed-Messages

PartnerDesk nutzt Symfony Messenger für asynchrone Aufgaben (Notifications, Buchhaltungs-Sync, Outgoing-Webhooks, Email-Versand). Wenn ein Job auch nach mehrfacher Wiederholung scheitert, landet er im Failed-Transport — und ist im Superadmin sichtbar.

Wann landet eine Message im Failed-Transport?

Pro Job-Typ gibt es eine eigene Retry-Strategie:

Transport Retries Backoff
notifications 3 30 s → 5 min
accounting (lexoffice/easybill-Sync) 6 10 s → 1 h
webhooks (Outgoing) 5 5 s → 2 min (exponentiell)
async (allgemein) 3 60 s → 10 min

Erst nach Erschöpfen aller Retries: Message wandert in failed.

Wer kann zugreifen?

Nur Plattform-Admins (ROLE_PLATFORM_OWNER und ROLE_PLATFORM_ADMIN). Tenant-Admins haben keinen Zugriff — Failed-Messages sind oft tenantübergreifend zu lösen.

Superadmin-Sicht

Superadmin → „Failed-Messages" in der Sidebar.

Liste

Pro Eintrag:

Spalte Inhalt
Klasse Message-Class-Name (z. B. SyncAccountingCreditNoteMessage)
Anzahl Versuche Wie oft wurde retried
Letzter Error Exception-Class + Kurz-Message
Original-Transport Aus welchem Transport (z. B. accounting)
Zeit Wann der finale Fail passierte

Detail-View

Klick auf Eintrag → Modal mit:

  • Body der Message (Argumente, IDs).
  • Voller Stack-Trace des letzten Fehlers.
  • Stamps (Symfony Messenger Meta-Daten):
    • ErrorDetails.
    • Redelivery (Retry-Counter).
    • SentToFailureTransport (Original-Receiver-Name).

Aktionen

Retry

„Erneut versuchen"-Button verschiebt die Message zurück in den Original-Transport. Sie wird vom Worker abgeholt und nochmals ausgeführt.

Sinnvoll wenn:

  • Externe API war kurz offline.
  • DB-Lock gelöst sich gelöst.
  • Konfigurations-Fix passiert (z. B. fehlender API-Key nachgereicht).

Verwerfen

„Endgültig verwerfen"-Button löscht die Message aus dem Failed-Transport.

Sinnvoll wenn:

  • Message ist veraltet (z. B. Payout wurde inzwischen anders verarbeitet).
  • Fehler ist tatsächlich permanent (z. B. Partner wurde gelöscht).

Typische Failures

SyncAccountingCreditNoteMessage

  • Ursache: lexoffice/easybill-API kurzzeitig down.
  • Aktion: nach Provider-Recovery → Retry.

SendNotificationBatchMessage

  • Ursache: SendGrid-API-Key abgelaufen.
  • Aktion: API-Key in Email-Settings erneuern → Retry.

DispatchWebhookMessage

  • Ursache: Tenant-Custom-Webhook-URL antwortet nicht (404, Timeout).
  • Aktion: URL beim Tenant prüfen → Tenant fixt → Retry.
  • Auto-Deactivate: nach 10 finalen Failures wird der Webhook-Endpoint automatisch deaktiviert (Schutz vor Endlos-Schleifen).

Verwandte Kapitel


Technische Tiefen-Doku: ../024-phpstan-failed-messages.md, ../138-cursor-write-backoff.md