MQ的作用:
1.异步处理
2.流量削峰 比如秒杀业务 控制请求数量
3.日志处理
4.应用解耦
一:扣库存:
- product系统:
/**
* 扣库存 给订单服务调用
* postman :http://localhost:8088/productInfo/koukucun
* body-raw :[{"productId":1,"productShuliang":2}]
*/
@PostMapping("/koukucun")
@Transactional(rollbackFor=Exception.class)
public void kouKuCun(@RequestBody List<CartDto> cartDtoList)
{
log.info("扣库存参数:"+cartDtoList);
//检查库存够不够
for (CartDto cartDto1:cartDtoList)
{
ProductInfo productInfo=iProductInfoService.selectById(cartDto1.getProductId());
//判断商品是否存在
if(null==productInfo)
{
//商品不存在
throw new ProductException(ResultEnum.PRODUCT_NOT_EXIST);
}
Integer result= productInfo.getProductStock()-cartDto1.getProductShuliang();
//判断库存是否足够
if (result<0)
{
//库存不足
throw new ProductException(ResultEnum.KUCUN_NOT_EHIGHT);
}
//把扣完的数量 修改到数据库
productInfo.setProductId(cartDto1.getProductId());
productInfo.setProductStock(result);
//修改数据库 完成扣库存
Boolean is= iProductInfoService.updateById(productInfo);
if(is)
{
log.info("扣库存成功");
//发送mq消息
//把对象序列化成json
String productJson = JSON.toJSONString(productInfo);
jmsMessagingTemplate.convertAndSend(queue,productJson);
log.info("发送mq消息成功!");
}
else
{
log.info("扣库存失败");
}
}
}
2.订单系统
package com.zhu.order.listener;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
@Component
public class QueueListener {
@JmsListener(destination = "publish.queue2", containerFactory = "jmsListenerContainerQueue")
public String receive(String text){
System.out.println("QueueListener: consumer-a 收到一条信息: " + text);
//把json字符串反序列化
//存入redis
return "consumer-a received : " + text;
}
}