1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| @Slf4j @Service public class DelayQueueService { @Resource private OrderMapper orderMapper;
@Resource private UserInfoMapper userInfoMapper; @Resource private BonusInfoMapper bonusInfoMapper;
@Autowired private RedissonClient redisson;
private RDelayedQueue<String> delayedQueue;
@PostConstruct public void initDelayQueue() { RBlockingQueue<String> blockingQueue = redisson.getBlockingQueue("orderDelayQueue"); delayedQueue = redisson.getDelayedQueue(blockingQueue); new DelayTaskQueueExecutor<>("ORDER_DELAY", blockingQueue, this::processOrder); }
public void addToDelayQueue(String orderId) { delayedQueue.offer(orderId, 2, TimeUnit.MINUTES); }
@Transactional public void processOrder(String orderId) { Torder order = orderMapper.selectOne(Wrappers.lambdaQuery(Torder.class).eq(Torder::getOrderId, orderId)); if (order != null) { Integer status = order.getStatus(); if (status == Common.ORDER_ORIGINAL_STATUS) { order.setStatus(Common.ORDER_CLOSED_STATUS); String userId = order.getToken(); UserInfo userInfo = userInfoMapper.selectOneForUpdate(userId); if (userInfo != null) { UsedWordsBonusInfo wordsBonusInfo = usedWordsBonusInfoMapper.selectOne(Wrappers.lambdaQuery(UsedWordsBonusInfo.class).eq(UsedWordsBonusInfo::getOrderId, order.getOrderId())); if (wordsBonusInfo.getSelfWordsDeducted() == Common.ALREADY_DEDUCTION) { userInfo.setRegisterBonusWords(userInfo.getRegisterBonusWords() + wordsBonusInfo.getUsedRegisterBonus()); userInfo.setInviteBonusWords(userInfo.getInviteBonusWords() + wordsBonusInfo.getUsedInviteBonus()); log.info("订单:{},返还注册字数:{},邀请字数:{}", orderId, wordsBonusInfo.getUsedRegisterBonus(), wordsBonusInfo.getUsedInviteBonus()); wordsBonusInfo.setSelfWordsDeducted(Common.ORIGIN_STATUS); usedWordsBonusInfoMapper.updateById(wordsBonusInfo); userInfoMapper.updateById(userInfo); } } } orderMapper.updateById(order); } } }
|