业务场景
订单支付后有修改库存,使用优惠券,获得积分等操作。同步顺序操作比较慢,使用消息队列可以异步操作,主要操作完成后返回接口。其他操作加到消息队列,可以削峰和解耦。
RabbitMQ用到的几个概念
其中包含几个概念:
publisher:生产者,也就是发送消息的一方
consumer:消费者,也就是消费消息的一方
queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理
exchange:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。
routingKey:预先设定的Binding Key(绑定键)来决定消息应该被路由到哪个队列
SpringBoot代码
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- AMQP 依赖, RabbitMq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.yml
spring:
#配置rabbitMq服务器地址和账号密码
rabbitmq:
host: xxx.xxx.xxx.xxx
port: 5672
username: admin
password: 123456
virtual-host: /
消费者端监听器(订单优惠券队列相关)
路由模型的绑定
exchange交换机名:order
key路由键名:coupons
queue队列名:queue.order.coupons
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class ZjqpOrderQueueListener {
public static final String QUEUE_NAME = "queue.order.coupons";
/**
* @Author
* @Date 15:51 2024/12/12
* @Description 新建订单后优惠券变化
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = QUEUE_NAME, durable = "true"),
exchange = @Exchange(value = "order", type = ExchangeTypes.TOPIC),
key = "coupons")
) public void createOrderAndChangeCoupon(String dataString) {
//MQ处理优惠券状态,json字符串转回订单对象
JSONObject jsonObject = JSON.parseObject(dataString);
ZjqpOrder zjqpOrder = JSONObject.toJavaObject(jsonObject, ZjqpOrder.class);
//业务代码省略
}}
生产者端(创建订单时调用的service实现层代码)
@Resource
private RabbitTemplate rabbitTemplate;
private final String EXCHANGE_NAME = "order";
@Override
public boolean createOrderMQs(ZjqpOrder zjqpOrder) {
//MQ处理优惠券状态,订单对象转成json字符串
rabbitTemplate.convertAndSend(EXCHANGE_NAME, "coupons", com.alibaba.fastjson.JSONObject.toJSONString(zjqpOrder));
return true;
}