目录
一.Dead?Letter?Exchange?(死信交换机)
交换机的属性:
二.代码演示
1.provider
①.DeadConfig
②.ProviderController
?2.consumer
①.DeadReceiver?
一.Dead?Letter?Exchange?(死信交换机)
?RabbitMQ?作为一个高级消息中间件,提出了死信交换器的概念. 这种交换器专门处理死了的信息(被拒绝可以重新投递的信息不能算死的)。消息变成死信一般是以下三种情况: 1.消息被拒绝,并且设置?requeue?参数为?false? 2.消息过期(默认情况下?Rabbit?中的消息不过期,但是可以设置队列的过期时间和消息的过期时间以达到消息过期的效果)
3.队列达到最大长度(一般当设置了最大队列长度或大小并达到最大值时) 当满足上面三种情况时,消息会变成死信消息,并通过死死信交换机投递到相应的队列中。 我们只需要监听相应队列,就可以对死信消息进行最后的处理。
订单的超时处理
?
生产者生产一条1分钟后超时的订单消息到正常交换机?exchange?-?a?中消息匹配到队列?queue?-?a?,但一分钟后仍未消费。消息会被投递到死死信交换机?dlx?-?exchange?中,并发送到私信队列中 死信队列?dlx?-?queue?的消费者拿到消息后根据消息去查询订单的状态如果仍然是未支付状态将订单状态更新为超时状本
交换机的属性:
Name?:交换机名称
Type:交换机类型,direct、?topic、?fanout、?headers
Durabi?lity:是否需要持久化,如果持久性,则RabbitMQ重启后,交换机还存在Auto?Delete:?当最后-?-个绑定到Exchange.?上的队列删除后,自动删除该ExchangeInternal?:当前Exchange是否用于RabbitMQ内部使用,默认为False?;
Arguments:扩展参数,用于扩展AMQP协议定制化使用 ?
二.代码演示
1.provider
①.DeadConfig
package com.example.provider.mq;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
@SuppressWarnings("all")
public class DeadConfig {
//1.需要正常的交换机
//2.正常队列发出消息(具备配置)
//3.具备死信交换机,队列
@Bean
public Queue normalQueue(){
Map<String,Object> config=new HashMap<>();
//过期时间
config.put("x-message-ttl", 10000);
//死信交换机
config.put("x-dead-letter-exchange", "deadExchange");
//死信routing key
config.put("x-dead-letter-routing-key", "DD");
return new Queue("normalQueue",true,false,false,config);
}
@Bean
public Queue deadQueue(){
return new Queue("deadQueue",true);
}
@Bean
public DirectExchange normalExchange() {
return new DirectExchange("normalExchange");
}
@Bean
public DirectExchange deadExchange() {
return new DirectExchange("deadExchange");
}
@Bean
public Binding normalBinding() {
return BindingBuilder.bind(normalQueue()).to(normalExchange()).with("CC");
}
@Bean
public Binding deadBinding() {
return BindingBuilder.bind(deadQueue()).to(deadExchange()).with("DD");
}
}
②.ProviderController
@RequestMapping("/deadSend")
public String deadSend(){
log.warn("订单已经保存");
//保存了一个订单
template.convertAndSend("normalExchange","CC","order11888");
return "yes";
}
?2.consumer
①.DeadReceiver?
package com.example.consumer.mq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@SuppressWarnings("all")
@RabbitListener(queues = "deadQueue")
@Slf4j
public class DeadReceiver {
@RabbitHandler
public void process(String message){
log.warn(message+":该订单已经过期");
}
}
|