黑马商城的MQ业务改造

  1. 首先再pay.service和trade微服务中引入依赖
spring boot starter amqp
  1. 配置rabbitMQ的地址
host
port
virtualhost
username
password
  1. 配置jackson消息转换器替代原生JDK转换器
public MessageConverter(){
return new jsckson2JsonMessageConverter()}
  1. 在spring.facuty中添加新增配置文件
  2. 在trade.service微服务中添加消费者listener
@Rabbitlistener(bindings = 
value = @queue(name = trade.pay.success.queue)
exchange = @Exchange(name = pay.direct)
key = "pay.success"
public void listenPaySuccess(Long orederId){
orderService.markAsSuccess(orderId);
}
  1. pay.service微服务中配置发送者
rabbitTemplet.convertandsend(pay.direct, pay.success, getid())
<think>好的,用户想了解黑马商城中与MQ相关的实现或配置,包括配置和使用教程。我需要根据提供的引用内容来构建回答。首先,引用中提到临时消息的投递和ACK确认,还有RabbitMQ的延迟队列实现方案,包括消息过期TTL+死信交换机和插件。另外,用户提到了Docker拉取RabbitMQ镜像的命令,这可能和部署有关。 首先,我应该介绍黑马商城可能使用的MQ类型,可能是RabbitMQ,因为引用里提到了它。然后,配置部分需要包括如何安装和部署RabbitMQ,比如使用Docker命令,引用中的docker pull rabbitmq:management,所以需要提到这点,并说明如何运行容器,可能还要提到管理界面。 接下来,消息队列的配置可能涉及交换机、队列的声明,以及绑定。需要举一个例子,比如订单超时的场景,使用死信交换机。引用里提到消息过期TTL和死信交换机,所以需要详细说明如何设置消息的TTL,以及如何配置死信交换机和路由键。可能需要代码示例,比如使用Spring Boot的配置类来声明队列和交换机。 然后,延迟队列的另一种方法是使用插件,这里需要提到安装插件的方法,比如使用RabbitMQ的官方插件,但用户提供的引用中没有具体命令,可能需要假设步骤,或者参考常见的做法,比如使用docker安装插件。 在消息发送部分,可以引用临时消息的投递,比如发送到延迟队列,设置过期时间,并确认ACK。需要给出代码示例,比如使用RabbitTemplate发送消息,设置过期时间和头部信息。 最后,消息监听部分,需要说明如何监听死信队列,处理超时订单,同样给出代码示例,使用@RabbitListener注解。 使用教程的步骤需要分点,包括环境准备、配置、发送和监听。同时,注意事项部分要提到持久化、异常处理和监控,确保用户知道实际应用中的关键点。 相关问题部分,需要生成与MQ配置相关的问题,比如延迟队列的其他实现、如何保证消息可靠性、Spring Boot整合步骤等。要确保问题覆盖用户可能感兴趣的扩展话题。 需要检查是否所有引用的内容都被合理使用,比如引用1的临时消息ACK,引用2的延迟队列方案,引用3的Docker命令。确保回答中的每个引用都有对应的标识,并且自然融入内容中。同时,避免使用Markdown格式,用中文清晰解释每个步骤,结构分明,代码示例正确。</think>### 黑马商城 MQ 实现与配置解析 #### 1. **MQ 环境搭建** 黑马商城采用 **RabbitMQ** 作为消息队列中间件,部署方式通常通过 Docker 快速启动: ```bash # 拉取带管理界面的镜像 docker pull rabbitmq:management # 运行容器(开放5672端口供应用连接,15672为管理界面端口) docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management ``` 管理界面访问 `http://localhost:15672`,默认账号密码为 `guest/guest`[^3]。 --- #### 2. **消息队列核心配置** **场景示例:订单超时自动关闭** **步骤1:声明队列与交换机** ```java @Configuration public class RabbitMQConfig { // 定义普通队列(绑定死信交换机) @Bean public Queue orderQueue() { Map<String, Object> args = new HashMap<>(); args.put("x-dead-letter-exchange", "order_dlx_exchange"); // 死信交换机 args.put("x-dead-letter-routing-key", "order.dlx"); // 死信路由键 return new Queue("order.queue", true, false, false, args); } // 定义死信交换机(用于处理超时订单) @Bean public DirectExchange dlxExchange() { return new DirectExchange("order_dlx_exchange"); } // 绑定死信队列与交换机 @Bean public Binding dlxBinding() { return BindingBuilder.bind(new Queue("order.dlx.queue")) .to(dlxExchange()).with("order.dlx"); } } ``` **关键配置说明:** - `x-dead-letter-exchange` 指定消息过期后的转发交换机 - `x-dead-letter-routing-key` 定义死信消息的路由规则[^2] --- #### 3. **消息生产与消费** **发送延迟消息(订单创建时)** ```java @Autowired private RabbitTemplate rabbitTemplate; public void sendOrderMessage(String orderId) { // 设置消息属性(30分钟过期) MessagePostProcessor processor = message -> { message.getMessageProperties().setExpiration("1800000"); // TTL单位为毫秒 return message; }; // 发送到普通队列 rabbitTemplate.convertAndSend("order.queue", orderId, processor); } ``` *说明:消息在 `order.queue` 中滞留30分钟后,若未被消费,会转入死信队列*。 --- **消费死信消息(处理超时订单)** ```java @Component public class OrderTimeoutListener { @RabbitListener(queues = "order.dlx.queue") public void handleTimeoutOrder(String orderId) { // 执行关单逻辑(如释放库存、更新订单状态) orderService.closeExpiredOrder(orderId); } } ``` --- #### 4. **延迟队列优化方案** 对于更精确的延迟控制,可通过 **RabbitMQ 延迟插件** 实现: 1. 下载插件 `rabbitmq_delayed_message_exchange` 2. 启用插件: ```bash rabbitmq-plugins enable rabbitmq_delayed_message_exchange ``` 3. 声明延迟类型交换机: ```java @Bean public CustomExchange delayedExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); return new CustomExchange("delayed_exchange", "x-delayed-message", true, false, args); } ``` --- #### 5. **消息可靠性保障** - **临时消息**:通过 ACK 确认机制保证投递成功,无需持久化[^1] - **持久消息**:设置 `delivery_mode=2` 并配合生产者确认模式 - **消费者重试**:通过 `@Retryable` 注解实现异常自动重试 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值