用户提交订单,积分添加使用分布式事务流程讲解:
一.
- 首先会在订单服务中会有一个add添加订单的方法,首先拿到登录人的名称,添加到order订单实体类中.
- 调用service的添加方法,通过传递的登录人名称去调用查询存储在redis中的购物车信息方法返回一个map集合,拿到总金额,总数量,雪花算法生成的id,然后继续封装到一个Order实体类中,保存到订单表中.
- 然后从map中遍历所有的订单信息,保存到订单项的表中,用过feign的远程调用,完成扣减库存并增加销量操作.
- 封装一个Task实体 封装相应信息 任务表,往任务表中添加任务信息数据(Task实体).
- 调用user服务,添加用户积分,传入金额和用户名
- 删除封装到redis的订单信息
二.
- 添加一个定时任务,获取任务表中小于当前时间的任务信息,遍历查询到的集合,用rabbitTemplate.convertAndSend()方法往添加积分任务交换机对应的添加积分队列发送消息,将遍历的数据作为消息.每隔俩秒就调用一次.
rabbitTemplate.convertAndSend(RabbitMQConfig.EX_BUYING_ADDPOINTUSER,RabbitMQConfig.CG_BUYING_ADDPOINT_KEY, JSON.toJSONString(task));
@Scheduled(cron = "0/2 * * * * ?") //2秒调用一次
三.
- 在用户服务中去监听添加积分的队列,一旦有消息立马就能获取到对应的消息进行处理,这里我们需要对消息进行判断,如果消息为null,或者我们需要的信息为null时,直接return,
如果redis中的任务是否存在,存在就return,因为此时已经有消息在处理了, - 如果不存在的话, 更新用户积分 将任务添加到redis中,通过订单id去查询,判断是否已经操作过了消息
- 将任务加入redis中 设置过期时间30秒 以防事务回滚redis数据一直在
- 修改任务积分(一块钱一分)
- 记录积分日志的信息(日志表)
- 删除redis中的信息
- 操作完成调用发送消息,将拿到的消息转为json,发送到完成添加积分任务队列中.
将任务加入redis中 设置过期时间30秒 以防事务回滚redis数据一直在
redisTemplate.boundValueOps(task.getId()).set("exist",30, TimeUnit.SECONDS);
删除redis中的信息
redisTemplate.delete(task.getId());
四.
监听添加积分完成的消息队列,获取消息数据,转换为对应的实体,直接删除任务表中的数据.
网友评论