后台秒杀令牌生成失败。
来源: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了。
新新手路过,大家不要介意。
112020-08-04
相似问题