一.原扣库存逻辑
...
// 6.扣库存
List<DecreaseStockInput> decreaseStockInputList = orderDTO.getOrderItemList().stream().map(e -> {
DecreaseStockInput decreaseStockInput = new DecreaseStockInput();
decreaseStockInput.setGoodsId(e.getGoodsId());
decreaseStockInput.setGoodsStock(e.getGoodsCount());
return decreaseStockInput;
}).collect(Collectors.toList());
/**
* 使用Feign调用微服务
*/
count = productClient.decreaseStock(decreaseStockInputList);
if(count < 0){
throw new OrderException(ExceptionCodeEnum.ORDER_SAVE_FAIL);
}
...
二.使用SpringCloud Stream 异步下单
order服务
...
// 6.扣库存
List<DecreaseStockInput> decreaseStockInputList = orderDTO.getOrderItemList().stream().map(e -> {
DecreaseStockInput decreaseStockInput = new DecreaseStockInput();
decreaseStockInput.setGoodsId(e.getGoodsId());
decreaseStockInput.setGoodsStock(e.getGoodsCount());
return decreaseStockInput;
}).collect(Collectors.toList());
String json = GsonUtil.toJson(decreaseStockInputList);
sender.sendMessage(json);
...
product服务
@EnableBinding(Barista.class)
@Service
@Slf4j
public class RabbitmqReceiver {
@Autowired
private GoodsInfoService goodsInfoService;
@StreamListener(Barista.INPUT_CHANNEL)
@SendTo(Barista.OUTPUT_SENDTO_CHANNEL)
public String receiver(String message){
log.info("【product】message=>{}",message);
String delMsg = String.format("【product】message=>%s",message);
/**
* 业务逻辑处理 减库存
*/
List<DecreaseStockInput> decreaseStockInputList = (List<DecreaseStockInput>)GsonUtil.fromJson(message, new TypeToken<List<DecreaseStockInput>>(){}.getType());
goodsInfoService.decreaseStock(decreaseStockInputList);
return delMsg;
}
@StreamListener(Barista.INPUT_SENDTO_CHANNEL)
public void sendToReceiver(String message){
log.info("处理之后的信息=>{}",message);
}
}
即可实现的简易的异步扣库存
网友评论