Replay dead letters
A replay puts messages from a dead-letter queue back into circulation. By default each one goes to the exchange and routing key it was originally published to, read from its x-death header, so it reaches the same consumers as before.

Choose the messages
On the queue page, group the dead letters by Exception, Reason, Died in, Routing key or Deaths and click a group to narrow the table. Then:
- Selected in the table: tick the rows (
xon the keyboard,Shift+Afor all) and press Replay orr. - First N: the oldest N from the head of the queue.
- Matching: every message that fits the search or the reason group, in the whole queue, not only the loaded rows.
"First N" and "Matching" are checked with a dry run first, so the replay takes exactly the messages you saw.

Choose the target
- Original route from
x-death, or from thex-original-*headers of Spring'sRepublishMessageRecoverer, or the endpoint exchange of a MassTransit_errorqueue. - Queue: straight into a named queue through the default exchange.
- Exchange with a routing key of your choice.
Select one message to edit its payload or headers before it goes out; the audit log keeps the original next to the edited version.
Go easy on the consumers
Limit to N messages per second spaces the publishes evenly, so a consumer that just recovered is not flooded again. A throttled replay runs in the background; its page shows the progress and can stop it. It may take at most 25 minutes, because RabbitMQ closes channels whose deliveries stay unacknowledged longer than its consumer_timeout.
What a replay promises
- Warren reads each message without acknowledging it.
- It publishes the message with
mandatoryand publisher confirms. Only after the broker confirms does it acknowledge the original. - Everything it did not take goes back with
nackandrequeue; a crash releases it the same way.
No message is lost. If Warren dies between the broker's confirm and its own acknowledgement, the messages of that moment are delivered twice, so consumers should be idempotent, as RabbitMQ itself recommends.
Death headers (x-death, x-first-death-*, x-last-death-*), MassTransit's MT-Fault-* and a quorum queue's x-delivery-count are removed, so the message starts with a fresh retry budget. Warren adds x-warren-replay-id, x-warren-source-queue and x-warren-replayed-at, so you can tell a replayed message from a new one.
Every replay is in the Audit log with who, when, which route, and the outcome per message.