Locate where the message stopped
Separate the request that dispatches a job, storage on the intended queue, worker execution and mail-provider acceptance. A web success response is not proof that the job ran. Nor is a completed job proof that a recipient received the message. Record one synthetic test case and follow its identifiers through those boundaries.
- Check the named queue connection and queue, not just a global pending count.
- Inspect existing worker and application errors.
- Check whether the issue followed a code or environment change.
Inspect before replay
Laravel's queue:failed command lists recorded failures, including job IDs and failure times. An authorised maintainer should inspect the exception and whether any prior attempt performed an external action. Do not paste the payload into an enquiry: it can contain customer addresses, order information or private application state.
- Use a redacted failure category and job identifier for scoping.
- Do not run queue:retry all to diagnose one stopped notification.
- Resolve an expired provider credential with its account holder; never request its value by email.
A graceful restart needs replacement workers
Long-lived workers do not reload deployed code. queue:restart requests exit after the current job, so process supervision must be healthy and capable of starting replacements. Verify the cache used for restart signals. Before any live restart, agree the execution window, current job handling and who can reverse the deployment.
- Do not create a competing unmanaged worker.
- Check timeout versus reservation settings if jobs overlap.
- Test with a safe message sink rather than a real customer recipient.
Acceptance evidence
The agreed synthetic job should enter the intended queue, execute once, produce its expected message in the test sink and retain a traceable completion result. A negative test should show a controlled failure instead of silent loss. Restoring production delivery is a separate authorised switch; no mass resend is implied by a passing test.
Sources and limits
- Laravel official queue documentation source Checked 2026-10-10.
- queue:failed lists failed jobs with IDs, connections and failure times.
- Workers do not notice changed code until restarted.
- queue:restart gracefully exits workers; process supervision and cache configuration matter.