From 8180f41c2286c7ff6fb78a0a11444d4f1a8b487f Mon Sep 17 00:00:00 2001 From: liyongjie <1318551549@qq.com> Date: Wed, 29 Nov 2023 21:21:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3rabbitmq=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E4=BA=8B=E5=8A=A1=E5=9B=9E=E6=BB=9A=EF=BC=8C=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bwie/scenic/rabbitmq/RabbitMqConfig.java | 52 +++++-------------- .../scenic/service/impl/OrderServiceImpl.java | 22 +++++--- 2 files changed, 29 insertions(+), 45 deletions(-) diff --git a/work-modules/work-scenic/src/main/java/com/bwie/scenic/rabbitmq/RabbitMqConfig.java b/work-modules/work-scenic/src/main/java/com/bwie/scenic/rabbitmq/RabbitMqConfig.java index 49879e3..8ae8c66 100644 --- a/work-modules/work-scenic/src/main/java/com/bwie/scenic/rabbitmq/RabbitMqConfig.java +++ b/work-modules/work-scenic/src/main/java/com/bwie/scenic/rabbitmq/RabbitMqConfig.java @@ -1,13 +1,9 @@ package com.bwie.scenic.rabbitmq; -import com.alibaba.fastjson.JSONObject; -import com.bwie.common.constants.TokenConstants; import com.bwie.common.domain.Order; import com.bwie.common.domain.Scenic; -import com.bwie.common.domain.User; -import com.bwie.common.utils.JwtUtils; +import com.bwie.common.exception.GlobalExceptionHandler; import com.bwie.scenic.mapper.OrderMapper; -import com.bwie.scenic.service.OrderService; import com.bwie.scenic.service.ScenicService; import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; @@ -19,10 +15,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import javax.servlet.http.HttpServletRequest; import java.io.IOException; -import java.math.BigDecimal; -import java.util.concurrent.TimeUnit; import static com.bwie.scenic.service.impl.OrderServiceImpl.REFUND_QUEUE; @@ -41,9 +34,6 @@ public class RabbitMqConfig { @Autowired private RedisTemplate redisTemplate; - @Autowired - private HttpServletRequest request; - @Autowired private OrderMapper orderMapper; @@ -52,53 +42,39 @@ public class RabbitMqConfig { /** * 1.6 异步完成退票功能。消息保证不丢失不重复消费 + * * @param orderId * @param message * @param channel */ @Transactional - @RabbitListener(queuesToDeclare = { @Queue(name = REFUND_QUEUE)}) - public void refund(Integer orderId, Message message, Channel channel){ + @RabbitListener(queuesToDeclare = {@Queue(name = REFUND_QUEUE)}) + public void refund(Integer orderId, Message message, Channel channel) throws GlobalExceptionHandler { String messageId = message.getMessageProperties().getMessageId(); Long add = redisTemplate.opsForSet().add(messageId, REFUND_QUEUE); - log.info("消息队列:[{}],接受到信息:[{}],开始消费...",REFUND_QUEUE,orderId); + log.info("消息队列:【{}】,接受到信息:【{}】,开始消费...", REFUND_QUEUE, orderId); try { - if (add > 0){ - // 获取用户信息 - String token = request.getHeader(TokenConstants.TOKEN); - String userKey = JwtUtils.getUserKey(token); - String json = redisTemplate.opsForValue().get(TokenConstants.LOGIN_TOKEN_KEY + userKey); - User user = JSONObject.parseObject(json, User.class); - + if (add.intValue() > 0) { // 获取当前订单信息 Order order = orderMapper.findById(orderId); - // 1.6 钱款退回原路,扣除10%的手续费,退票成功 - user.setBalance(user.getBalance().add(order.getTotalFares().multiply(new BigDecimal(0.9)))); - orderMapper.updateUserBalance(user); - redisTemplate.opsForValue().set(TokenConstants.LOGIN_TOKEN_KEY + userKey, JSONObject.toJSONString(user), - 30, TimeUnit.MINUTES); - // 获取景区信息 Scenic scenic = scenicService.findById(order.getScenicId()); // 景区剩余票数+已退票数 scenic.setRemainingVotes(scenic.getRemainingVotes() + order.getVotes()); scenicService.updateRemainingVotes(scenic); + // 订单为已退票 + order.setStatues(3); + orderMapper.updateOrder(order); + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); - log.info("消息队列:[{}],接受到信息:[{}],消费成功...",REFUND_QUEUE,orderId); - }else { - log.info("消息队列:[{}],接受到信息:[{}],消费重复...",REFUND_QUEUE,orderId); + log.info("消息队列:【{}】,接受到信息:【{}】,消费成功...", REFUND_QUEUE, orderId); + } else { + log.info("消息队列:【{}】,接受到信息:【{}】,消费重复...", REFUND_QUEUE, orderId); } } catch (IOException e) { - e.printStackTrace(); - log.error("消息队列:[{}],接受到信息:[{}],消费异常,异常信息:[{}]...",REFUND_QUEUE,orderId,e.getMessage()); - try { - channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true); - log.info("消息队列:[{}],接受到信息:[{}],消费退还...",REFUND_QUEUE,orderId); - } catch (IOException ex) { - e.printStackTrace(); - } + throw new GlobalExceptionHandler(); } } } diff --git a/work-modules/work-scenic/src/main/java/com/bwie/scenic/service/impl/OrderServiceImpl.java b/work-modules/work-scenic/src/main/java/com/bwie/scenic/service/impl/OrderServiceImpl.java index 97adaec..e95d42e 100644 --- a/work-modules/work-scenic/src/main/java/com/bwie/scenic/service/impl/OrderServiceImpl.java +++ b/work-modules/work-scenic/src/main/java/com/bwie/scenic/service/impl/OrderServiceImpl.java @@ -97,13 +97,6 @@ public class OrderServiceImpl implements OrderService { @Transactional @Override public void refund(Integer orderId) { - // 获取当前订单信息 - Order order = orderMapper.findById(orderId); - - // 订单为已退票 - order.setStatues(3); - orderMapper.updateOrder(order); - rabbitTemplate.convertAndSend(REFUND_QUEUE, orderId, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { @@ -111,5 +104,20 @@ public class OrderServiceImpl implements OrderService { return message; } }); + + // 获取用户信息 + String token = request.getHeader(TokenConstants.TOKEN); + String userKey = JwtUtils.getUserKey(token); + String json = redisTemplate.opsForValue().get(TokenConstants.LOGIN_TOKEN_KEY + userKey); + User user = JSONObject.parseObject(json, User.class); + + // 获取当前订单信息 + Order order = orderMapper.findById(orderId); + + // 1.6 钱款退回原路,扣除10%的手续费,退票成功 + user.setBalance(user.getBalance().add(order.getTotalFares().multiply(new BigDecimal(0.9)))); + orderMapper.updateUserBalance(user); + redisTemplate.opsForValue().set(TokenConstants.LOGIN_TOKEN_KEY + userKey, JSONObject.toJSONString(user), + 30, TimeUnit.MINUTES); } }