死信
称为死信的信息,需要如下几个条件:
- 消息被消费者拒绝(通过basic.reject 或者 back.nack),并且设置 requeue=false。
- 消息过期,队列设置了TTL(Time To Live)时间并且消息过期。
- 超过了队列的长度限制消息被丢弃。
- 为队列配置死信交换机,并在申明队列时指定“x-dead-letter-exchange”和“x-dead-letter-routing-key”参数。队列根据“x-dead-letter-exchange”将死信消息发送到死信交换机中,并根据“x-dead-letter-routing-key”为死信消息设置死信路由Key。
以下示例演示在Java客户端配置死信交换机和路由
channel.exchangeDeclare("some.exchange.name", "direct");
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-dead-letter-exchange", "some.exchange.name");
args.put("x-dead-letter-routing-key", "some-routing-key");
channel.queueDeclare("myqueue", false, false, false, args);
TTL
RabbitMQ可以对消息和队列设置TTL. 目前有两种方法可以设置。第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。第二种方法是对消息进行单独设置,每条消息TTL可以不同。如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message, 消费者将无法再收到该消息。
设置队列TTL
通过队列属性设置消息TTL的方法是在queue.declare方法中加入x-message-ttl参数,单位为ms.
以下示例演示在Java客户端设置队列TTL。
Map<String, Object> argss = new HashMap<String, Object>();
argss.put("x-message-ttl",6000);
channel.queueDeclare(queueName, durable, exclusive, autoDelete, argss);
设置消息TTL
针对每条消息设置TTL的方法是在basic.publish方法中加入expiration的属性参数,单位为ms.
以下示例演示在Java客户端通过队列属性设置消息TTL。
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.deliveryMode(2);
builder.expiration("6000");
AMQP.BasicProperties properties = builder.build();
channel.basicPublish(exchangeName,routingKey,mandatory,properties,"ttlTestMessage".getBytes());