RabbitMQ 业务举例
2025年4月16日大约 1 分钟
RabbitMQ 业务举例
场景:用户订单支付完成后,还要给用户添加积分,通知下单信息等
使用mq前
- 支付完成
- 给用户添加积分(操作数据库,同步执行耗费大量时间)
- 给用户推送下单成功消息
- 页面提示下单完成
@PostMapping("/add")
public String add(Long id) {
LambdaQueryWrapper<Picture> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Picture::getId, id);
Picture picture = pictureService.getOne(queryWrapper);
if (picture != null) {
log.info("成功查询到图片开始执行后续操作:{}", picture.getId());
}
Long pd = picture.getId();
订单通知,增加积分同步执行==>操作数据库,耗费大量时间
pictureService.addScore(id);
pictureService.payInfo(id);
return Result.success("订单完成")
}
使用mq后
用户支付成功--mq发送订单已支付消息(订单号,积分值)到队列--队列监听消息并异步执行积分添加
- 支付完成
- mq发送支付完成消息,其它流程异步执行
- 页面提示下单完成
@PostMapping("/add")
public String add(Long id) {
LambdaQueryWrapper<Picture> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Picture::getId, id);
Picture picture = pictureService.getOne(queryWrapper);
if (picture != null) {
log.info("成功查询到图片开始执行后续操作:{}", picture.getId());
}
Long pd = picture.getId();
//MQ发送消息完成,直接下一步==>后续异步处理后续通知业务,增加积分业务
rabbitTemplate.convertAndSend("add.topic", "add.key", pd);
return Result.success("订单完成")
}
异步执行的业务
@Component
@Slf4j
public class MqListener {
@Autowired
private PictureService pictureService;
@Autowired
private UserService userService;
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "add.queue", durable = "true"), // 声明队列
exchange = @Exchange(value = "add.topic", type = ExchangeTypes.TOPIC), // 声明交换机
key = "add.key" // 绑定RoutingKey
)
)
public void getmsg(Long id) {
pictureService.addScore(id);
pictureService.payInfo(id);
}
}