tailrdigital/sulu-messenger-failed-queue-bundle
A Sulu bundle for managing Symfony Messenger failed queues from the CMS admin. Inspect failed messages, review errors, and retry or remove jobs to keep background processing healthy in Sulu projects.
Know what you're installing first. This is a Symfony bundle for Sulu CMS 2.x, not a Laravel package — there is no service provider, no config/failed-queue.php, no artisan command. It puts a Sulu Admin screen on top of Symfony Messenger's failure transport, so operators can inspect, retry, and delete failed async messages without touching the database. If you're in a pure Laravel app, the equivalent ground you already stand on is failed_jobs + queue:failed + Horizon; read this assessment as "the pattern to copy," not "the package to install."
Minimal path if you do have a Sulu app:
composer require tailrdigital/sulu-messenger-failed-queue-bundle (PHP 8.x, Sulu 2.x, symfony/messenger).
Register the bundle in config/bundles.php (...::class => ['all' => true]), then bin/console cache:clear. Check the README for the exact FQCN — 0.x naming has moved.
In config/packages/messenger.yaml, declare a durable failed transport and point Messenger at it:
framework:
messenger:
failure_transport: failed
transports:
async: 'doctrine://default'
failed: 'doctrine://default?queue_name=failed'
Create the tables: bin/console messenger:setup-transports.
Verify from the CLI before the UI: dispatch a message that throws, watch retries exhaust, then bin/console messenger:failed:show.
First use case: an async job (index rebuild, mail send, webhook fan-out) blows past max_retries. Instead of someone SQL-ing the messenger_messages table at 2am, an editor opens Sulu Admin → failed queue, reads the exception, and either retries after your fix ships or deletes a poison message.
retry_strategy: { max_retries: 3, delay: 1000, multiplier: 2 } decides when something becomes a "failed" item. Everything downstream — UI, alerting, triage — assumes that boundary is sane.sync:// for the default transport but retain a real failure transport, otherwise you'll never see the failure path until prod.failed_jobs, actions mapped to queue:retry {id} and queue:forget {id}, plus a queue.failed count in your health check. The bundle's value is entirely in that UX, and you can rebuild it in an afternoon.jackalope-doctrine-dbal, the PHPCR/Jackalope stack used to boot a test Sulu kernel. No runtime code, no API surface, no config schema change. Drop-in safe from 0.4.0.~0.4.0 and read changelogs before minor bumps; the admin route/controller layer is the most likely thing to shift.sync. Failed messages need durable storage; a sync failure transport silently loses them.messenger:setup-transports in every environment, including prod. The failure transport may need its own queue/table provisioned separately from the default one, and it's easy to set up async and forget failed.messenger:failed:show <id> -vvv gives the full stack trace; the admin view truncates. When an editor reports "it just says failed," you want the CLI output.How can I help you explore Laravel packages today?