🌟架构图
- 死信队列架构图
- 本地消息表
🌟application.yml文件
mqconfig:
#延迟队列,不能被监听消费
stock_release_delay_queue: stock.release.delay.queue
#延迟队列的消息过期后转发的队列
stock_release_queue: stock.release.queue
#交换机
stock_event_exchange: stock.event.exchange
#进入延迟队列的路由key
stock_release_delay_routing_key: stock.release.delay.routing.key
#消息过期,进入释放队列的key
stock_release_routing_key: stock.release.routing.key
#消息过期时间,毫秒,测试改为15秒
ttl: 360000
🌟RabbitMQ配置
@Configuration
@Data
public class RabbitMQConfig {
/**
* 交换机
*/
@Value("${mqconfig.stock_event_exchange}")
private String eventExchange;
/**
* 第一个队列延迟队列,
*/
@Value("${mqconfig.stock_release_delay_queue}")
private String stockReleaseDelayQueue;
/**
* 第一个队列的路由key
* 进入队列的路由key
*/
@Value("${mqconfig.stock_release_delay_routing_key}")
private String stockReleaseDelayRoutingKey;
/**
* 第二个队列,被监听恢复库存的队列
*/
@Value("${mqconfig.stock_release_queue}")
private String stockReleaseQueue;
/**
* 第二个队列的路由key
*
* 即进入死信队列的路由key
*/
@Value("${mqconfig.stock_release_routing_key}")
private String stockReleaseRoutingKey;
/**
* 过期时间
*/
@Value("${mqconfig.ttl}")
private Integer ttl;
/**
* 消息转换器
* @return
*/
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
/**
* 创建topic交换机
* 一个微服务一个交换机
* @return
*/
@Bean
public Exchange stockEventExchange(){
return new TopicExchange(eventExchange,true,false);
}
/**
* 延迟队列
* @return
*/
@Bean
public Queue stockReleaseDelayQueue(){
Map<String,Object> args=new HashMap<>();
args.put("x-message-ttl",ttl);
args.put("x-dead-letter-routing-key",stockReleaseRoutingKey);
args.put("x-dead-letter-exchange",eventExchange);
return new Queue(stockReleaseDelayQueue,true,false,false,args);
}
/**
* 死信队列,用于被监听
*/
@Bean
public Queue stockReleaseQueue(){
return new Queue(stockReleaseQueue,true,false,false);
}
/**
* 死信队列绑定关系
* @return
*/
@Bean
public Binding stockReleaseBinding(){
return new Binding(stockReleaseQueue,Binding.DestinationType.QUEUE,eventExchange,stockReleaseRoutingKey,null);
}
/**
* 延迟队列绑定关系
* @return
*/
@Bean
public Binding stockReleaseDelayBinding(){
return new Binding(stockReleaseDelayQueue,Binding.DestinationType.QUEUE,eventExchange,stockReleaseDelayRoutingKey,null);
}
}
🌟消息发送、消费
- 接受到订单服务大哥锁定库存请求时,进行锁定库存消息的发送。
- 发送消息的同时,在本地消息表插入记录。
- 消息消费时,找订单服务大哥查询订单状态即可。
- 根据订单状态,进行后续处理。
🌟写在最后
RabbitMQ项目实战之死信队列应用到此就结束啦!感谢大家的阅读,欢迎大家在评论区进行交流。