Updated on 2025-12-30 GMT+08:00

Configuring RabbitMQ Delayed Messages

Delayed messages enter queues for consumers to consume after a specified delay, instead of being received by consumers immediately after being sent.

You can implement delayed messages in any of the following ways:

  • Setting a delay exchange: Messages sent to a delay exchange carry the same delay time by default.
  • Setting the message delay time: Each message can be set with different delay time.
  • Setting the time to live and dead letter queue: Expired messages are automatically routed to the dead letter queue.

Notes and Constraints

The delay exchange function is available only in RabbitMQ AMQP-0-9-1.

Configuring a Delay Exchange

Messages sent to a delay exchange carry the same delay time by default.

The following example shows how to configure a delay exchange on a Java client:

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-delayed-type", "direct");
channel.exchangeDeclare("exchange", "x-delayed-message", true, false, args);

Setting the Message Delay Time

Each message can be set with different delay time.

The following example shows how to set the message delay time on a Java client.

final HashMap<String, Object> headers = new HashMap<>();
            headers.put("x-delay", 10000);
            final AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties().builder().headers(headers);
            // publish a batch of messages to the main exchange
            for (int i = 0; i < messageCount; i++) {
                channel.basicPublish(exchangeName, routingKey, properties.build(),
                    ("x-delayed-message-" + i).getBytes());
            }

Setting the Time to Live and Dead Letter Queue

Expired messages are automatically routed to the dead letter queue.

The following example shows how to set the time to live and dead letter queue on a Java client:

channel.queueDeclare("dlq", false, false, false, null);
channel.exchangeDeclare("dlx", BuiltinExchangeType.DIRECT);
channel.queueBind("dlq", "dlx", "rt");

HashMap<String, Object> arguments = new HashMap<>();
arguments.put("x-dead-letter-exchange", "dlx");
arguments.put("x-dead-letter-routing-key", "rt");
arguments.put("x-message-ttl", 5000);
channel.exchangeDeclare("normal", BuiltinExchangeType.DIRECT);       
channel.queueDeclare("normal", true, false, false, arguments);
channel.queueBind("normal", "normal", "key");
channel.basicPublish("normal", "key", null, "ttl".getBytes());