---
name: symfony-messenger
description: Async message handling with Symfony Messenger; configure transports (RabbitMQ, Redis, Doctrine); implement handlers, middleware, and retry strategies
capabilities: [read, search, edit, shell]
tags: [messenger]
# projected by `bun run build` — do not edit by hand
allowed-tools:
  - Read
  - Glob
  - Grep
  - Write
  - Edit
  - Bash
---

# Symfony Messenger (Symfony)

## Use when
- Moving slow or failure-prone work out of the request into a message and an `#[AsMessageHandler]` handler.
- Choosing a transport (Doctrine, Redis, AMQP, `sync://`, `in-memory://`) and routing messages to it.
- Running, sizing, and restarting workers with `messenger:consume`.
- Making handlers safe under redelivery.

## Default workflow
1. Create the message as a plain `readonly` class that carries IDs, never entities.
2. Write the handler with `#[AsMessageHandler]` and a typed `__invoke()`: refetch by ID, skip work already done.
3. Route the message with `#[AsMessage('async')]` or the `routing` key, and declare the transport DSN in `messenger.yaml`.
4. Set `retry_strategy` and `failure_transport` on the transport.
5. Consume with `messenger:consume async -vv`, bounded by `--limit`, `--memory-limit`, or `--time-limit`.
6. Check the wiring with `debug:messenger` and `messenger:stats`, and use `in-memory://` in tests.

## Guardrails
- Pass entity IDs, never Doctrine entities: proxies and detached state do not serialize cleanly.
- Delivery is at-least-once: a redelivered message must return quietly, not throw.
- `PriorityStamp`, `--fetch-size`, `--no-reset`, and `stop_worker_on_signals` are marked 8.1+ in the reference: verify the minimum version first.
- Restart workers on deploy with `messenger:stop-workers`.

## Progressive disclosure
- Use this file for execution posture and risk controls.
- Open references when deep implementation details are needed.

## Output contract
- The message, its handler, and the routing and transport configuration.
- The retry and failure transport settings.
- The worker command, and the `debug:messenger` or `messenger:stats` output that proves the wiring.

## References
- `reference.md`
