后台秒杀令牌生成失败。

来源:9-3 秒杀令牌实现(下)

weixin_慕村3424678

2020-07-03

请问老师:

我在访问:

file:///Users/asher/IdeaProjects/html/getitem.html?id=11


时,从控制台看到,

Request URL:
http://localhost:8090/order/generatetoken?token=fe506a137d3b47c7aa0355be7ec451f8

响应头,老是:

{"status":"fail","data":{"errCode":10001,"errMsg":"生成令牌失败"}}


我知道应该是后台生成令牌失败了,同时,Redis里也没有看到相关的key。

无奈,跟着老师敲的代码,也检查了。就是找不出最终出错的地方在哪儿。

老师,和路过的同学,能帮我分析一下吗?多谢。

写回答

1回答

weixin_慕村3424678

提问者

2020-07-03

自问自答,debug,仔细的排查了一下代码之后,发现了问题:

 @Override
    public String generateSecondKillToken(Integer promoId,Integer itemId,Integer userId) {
//        判断秒杀是否开始
        PromoDO promoDO = promoDOMapper.selectByPrimaryKey(promoId);
        PromoModel promoModel = convertFromDataObject(promoDO);
        if (promoModel == null) {
            return null;
        }
        System.out.println(promoModel.getStartDate());
        System.out.println(promoModel.getEndDate());
        if (promoModel.getStartDate().isAfterNow()) {
            promoModel.setStatus(1);
        } else if (promoModel.getEndDate().isBeforeNow()) {
            promoModel.setStatus(3);
        } else {
            promoModel.setStatus(2);
        }
        if (promoModel.getStatus().intValue() != 2) {
            return null;
        }
//      判断商品信息是否存在
        ItemModel itemModel = itemService.getItemByIdInCache(itemId);
        if (itemModel == null) {
            return null;
        }

//        判断用户信息是否存在
        UserModel userModel = userService.getUserByIdInCache(userId);
        if (userModel == null) {
            return null;
        }
//       生成token,将token放到Redis中,设置5分钟有效期
        String token = UUID.randomUUID().toString().replace("-", "");
        redisTemplate.opsForValue().set("promo_token_" + promoId+"_userid_"+userId+"_itemid_"+itemId, token);
              redisTemplate.expire("promo_token_" + promoId+"_userid_"+userId+"_itemid_"+itemId, 5, TimeUnit.MINUTES);
        return token;
    }

在生产秒杀令牌token的时候,把

else if (promoModel.getEndDate().isBeforeNow())

这段错误的写成了:

else if (promoModel.getStartDate().isBeforeNow())

导致,判断的时候,开始时间肯定是早于现在,于是把状态置为3,到后面的判断状态不等于2,return NULL了。

新新手路过,大家不要介意。

1
1
龙虾三少
好赞的
2020-08-04
共1条回复

聚焦Java性能优化 打造亿级流量秒杀系统(赠秒杀项目)

理解高流量电商网站性能构建思路 用高逼格技术解决性能提升问题

2174 学习 · 1009 问题

查看课程