电商 / 进销存系统,用户提交订单,核心主流程:创建订单 → 扣减库存 → 支付跳转。
下单成功后,还有一系列非强依赖、耗时较长的附属操作:
所有逻辑串行执行,接口响应慢、超时风险高;某一个附属操作报错,会直接导致整个下单流程失败,容错性差。
基于你的技术栈,提供两种主流方案:
启动类添加 @EnableAsync
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync// 开启Spring异步支持
publicclassOrderApplication{
publicstaticvoidmain(String[] args){
SpringApplication.run(OrderApplication.class, args);
}
}
importorg.springframework.stereotype.Service;
importjavax.annotation.Resource;
@Service
publicclassOrderService{
@Resource
privateOrderAsyncService orderAsyncService;
/**
* 下单主流程(同步执行核心逻辑)
*/
publicStringcreateOrder(Long userId,Long goodsId,Integer num){
// 1. 核心同步操作:创建订单、扣库存(必须保证事务一致性)
String orderNo =generateOrderNo();
saveOrder(orderNo, userId, goodsId, num);
deductStock(goodsId, num);
// 2. 附属操作:调用异步方法,主线程直接放行,不等待执行结果
orderAsyncService.afterOrderSuccess(orderNo, userId);
// 主线程快速响应前端
return"下单成功,订单号:"+ orderNo;
}
// 模拟生成订单号
privateStringgenerateOrderNo(){
return"ORD"+System.currentTimeMillis();
}
// 模拟保存订单
privatevoidsaveOrder(String orderNo,Long userId,Long goodsId,Integer num){}
// 模拟扣减库存
privatevoiddeductStock(Long goodsId,Integer num){}
}
2.2 异步服务(@Async 标记异步方法)
importorg.springframework.scheduling.annotation.Async;
importorg.springframework.stereotype.Service;
@Service
publicclassOrderAsyncService{
/**
* 订单成功后异步执行附属逻辑
*/
@Async
publicvoidafterOrderSuccess(String orderNo,Long userId){
// 1. 发送短信通知
sendSms(userId, orderNo);
// 2. 推送站内消息
pushMessage(userId, orderNo);
// 3. 记录对账日志
recordAccountLog(orderNo);
// 4. 增加用户积分
addUserPoints(userId,10);
}
privatevoidsendSms(Long userId,String orderNo){
// 模拟调用短信接口,耗时操作
}
privatevoidpushMessage(Long userId,String orderNo){}
privatevoidrecordAccountLog(String orderNo){}
privatevoidaddUserPoints(Long userId,Integer points){}
}
afterOrderSuccess 方法,Spring 自动分配独立子线程执行;适用于微服务、集群部署、要求消息不丢失、可重试的生产环境。
importorg.apache.rocketmq.client.producer.SendResult;
importorg.apache.rocketmq.spring.core.RocketMQTemplate;
importorg.springframework.messaging.Message;importorg.springframework.messaging.support.MessageBuilder;
importorg.springframework.stereotype.Service;
importjavax.annotation.Resource;
@Service
publicclassOrderService{
@Resource
privateRocketMQTemplate rocketMQTemplate;
// 定义Topic
privatestaticfinalStringORDER_SUCCESS_TOPIC="order_success_topic";
publicStringcreateOrder(Long userId,Long goodsId,Integer num){
// 1. 核心同步逻辑
String orderNo =generateOrderNo();
saveOrder(orderNo, userId, goodsId, num);
deductStock(goodsId, num);
// 2. 构建消息,发送到MQ(异步解耦)
OrderMsg msg =newOrderMsg(orderNo, userId);
Message<OrderMsg> message =MessageBuilder.withPayload(msg).build();
rocketMQTemplate.syncSend(ORDER_SUCCESS_TOPIC, message);
return"下单成功,订单号:"+ orderNo;
}
// 模拟方法省略
privateStringgenerateOrderNo(){return"ORD"+System.currentTimeMillis();}
privatevoidsaveOrder(String orderNo,Long userId,Long goodsId,Integer num){}
privatevoiddeductStock(Long goodsId,Integer num){}
// 消息实体
publicstaticclassOrderMsg{
privateString orderNo;
privateLong userId;
// 构造器、get/set
publicOrderMsg(String orderNo,Long userId){
this.orderNo = orderNo;
this.userId = userId;
}
publicStringgetOrderNo(){return orderNo;}
publicLonggetUserId(){return userId;}
}
}
2.2 消息消费者(独立服务 / 模块)
importorg.apache.rocketmq.spring.annotation.RocketMQMessageListener;
importorg.apache.rocketmq.spring.core.RocketMQListener;
importorg.springframework.stereotype.Service;
@Service
@RocketMQMessageListener(
topic ="order_success_topic",
consumerGroup ="order_success_consumer_group"
)
publicclassOrderConsumerimplementsRocketMQListener<OrderService.OrderMsg>{
@Override
publicvoidonMessage(OrderService.OrderMsg msg){
String orderNo = msg.getOrderNo();
Long userId = msg.getUserId();
// 异步执行所有附属业务
sendSms(userId, orderNo);
pushMessage(userId, orderNo);
recordAccountLog(orderNo);
addUserPoints(userId,10);
}
// 模拟业务方法
privatevoidsendSms(Long userId,String orderNo){}
privatevoidpushMessage(Long userId,String orderNo){}
privatevoidrecordAccountLog(String orderNo){}
privatevoidaddUserPoints(Long userId,Integer points){}}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。