jeffersongoncalves/filament-queue-management
A Filament plugin for managing Laravel queues right from your admin panel. Monitor pending and failed jobs, retry or delete failures, and keep your background processing healthy without leaving the dashboard.
composer require for the package, then publish its assets and config: php artisan vendor:publish --tag=<package>-config (and --tag=<package>-migrations if it ships its own). Run php artisan migrate — the package reads from Laravel's core job_batches table, so if you already use Bus::batch() you will have data immediately.config/<package>.php. The two keys that matter on day one are the dashboard route/prefix and the authorization gate. Wire the gate into AuthServiceProvider (or the package's viewX callback) before you deploy anything — a batch view leaks job payloads, exception messages, and queue names.finished_at-set batch with pending_jobs > 0, and drill into it. You want the failed job UUIDs and the options blob (the serialized batch then/catch/name/allowFailures payload) to answer "why did this chain stop?" without shelling into the DB.Bus::batch([...])->name('nightly-export')->dispatch() is the single highest-leverage habit: an unnamed batch is id-only in the UI and unusable for support triage. Names are stored in the options blob, which this view now decodes, so names are visible where they matter.allowFailures() deliberately. On a batch that tolerates failures, the view showing non-empty failed_job_ids is expected noise, not an incident. On a strict batch, any entry there means the catch callback fired and the remaining jobs were discarded — check the cancelled_at column to distinguish "cancelled by failure" from "cancelled by code".failed_job_ids holds UUIDs pointing at failed_jobs.uuid, not integer ids. Pattern: copy the JSON array from the batch view, then php artisan queue:retry <uuid> <uuid> — batches have no batch-level retry, so recovery is always per-job.options is now readable, it's worth putting structured payloads in there — e.g. ->name(json_encode(['tenant' => $id, 'kind' => 'export'])) — and the UI will render it as inspectable JSON rather than an opaque string. Keep it small; it's a text column.options encoding. Laravel's database batch repository stores options in a driver-dependent form; on Postgres the value can come back base64-encoded. Version 1.1.2 of this package detects and decodes that, so the UI is correct — but any ad-hoc SQL you write (select options from job_batches where id = ...) still gets the raw encoded string. Always decode before unserialize/json_decode in your own scripts.failed_job_ids display changed in 1.1.2 — from comma-joined to a JSON list. Anything that scraped or copy-pasted the old format (runbooks, Slack templates, screenshots in your incident docs) needs updating to expect ["uuid","uuid"].job_batches grows unbounded. php artisan queue:prune-batches --hours=168 keeps it sane, but note the default retention also drops successful batches — if you use this view for audit/compliance, prune only finished-and-uninteresting batches or set a longer window.finished_at null is not "stuck". A batch stays open while any job is pending; jobs lost to a crashed worker leave the batch permanently un-finished with pending_jobs > 0 and empty failed_job_ids. That signature (no failures, never finishes) is your cue to look at worker timeouts, not at the batch.Route::fallback.How can I help you explore Laravel packages today?