TTL说明
TTL是Time To Live的缩写,也就是生存时间
RabbitMQ支持消息的过期时间,在消息发送时可以进行指定
RabbitMQ支持为每个队列设置消息的超时时间,从消息入队列开始计算,只要超过了队列的超时时间配置,那么消息会自动的清除
死信队列可以做订单超时关闭等.
死信队列 是 当消息在一个队列 因为下列原因:
1.消息被拒绝(basic.reject或basic.nack)并且requeue=false.
2.消息TTL过期
3.队列达到最大长度(队列满了,无法再添加数据到mq中)
没有被消费者1消费的消息,就会进入死信交换机,被消费者2消费
队列的属性可以在这里找,别写错了,请复制.
消息超时死信队列有两种方式一种是队列设置 x-message-ttl,还有一种是在发送端设置超时时间
设置交换机端
//在队列设置超时时间
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = "liveQueue", arguments =
{@Argument(name = "x-dead-letter-exchange", value = "deadExchange"),
@Argument(name = "x-dead-letter-routing-key", value = "deadKey")
, @Argument(name = "x-message-ttl",value = "10000",type = "java.lang.Integer")
// ,@Argument(name = "x-max-length",value = "5",type = "java.lang.Integer")队列最大长度
}),//可以指定多种属性
exchange = @Exchange(value = "liveExchange"),
key = {"info", "error", "warning"}
)
})
@RabbitHandler
public void onMessage(Message message, Channel channel) throws Exception {
long consumerTag = message.getMessageProperties().getDeliveryTag();
System.out.println("收到消息");
System.out.println(new String(message.getBody()));
channel.basicNack(consumerTag, false, false);//消息确认
}
注意 :为了模拟死信,接收完要把消息确认设置为basicNack,否则会重回队列,且状态为未确认,进不去死信交换机
死信接收端
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue(value = "deadQueue"),
exchange = @Exchange(value = "deadExchange"),
key = "deadKey"
)
})
public void receive2(Message message, Channel channel) throws IOException {
System.out.println("我是一条死信:"+message);
long consumerTag = message.getMessageProperties().getDeliveryTag();
// channel.basicAck(consumerTag,true);
}
发送端
@Test
public void dummy6(){
MessagePostProcessor postProcessor = new MessagePostProcessor() {
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("4000");//在这里也可以设置超时时间,也可以设置x-message-ttl
return message;
}
};
this.rabbitTemplate.convertAndSend("liveExchange","info","我是一条消息",postProcessor);
}
yml
spring:
rabbitmq:
addresses: localhost
port: 5672
username: guest
password: guest
virtual-host: /
# 回调
publisher-confirms: true
listener:
simple:
concurrency: 10
prefetch: 5
acknowledge-mode: manual #请设置为手动确认
经过超时时间后会自动从liveQueue进入deadQueue