一次Java对象引用使用不当的引起问题

  1. 背景描述
    铺货的时候要对照bach那边的库存做校验,不同蜂房要查看的sku列表是相同的,但是每个sku在每个蜂房的库存都是不一样的,要把每个蜂房的sku库存情况以Map的形式存储下来,以蜂房的code为key,sku的库存为value,而sku的库存也做成了map,以skuCode为key,sku对象,形成<蜂房code,<skuCode,sku>>这样的数据结构。然后每个铺货点位找到对应的蜂房,查看蜂房内要铺货的sku库存是否满足铺货要求,满足就可以分货,然后将对应sku的库存扣除,不满足就不铺货。

  2. 问题描述
    今天发现了一个问题,运营人员说生成的铺货单的点位不够,但是对应蜂房的库存确实可以满足铺货的。

  3. 问题分析
    通过grep日志发现,同一个蜂房下同一个sku的库存扣减是不连续的。比如库存数突然从224跳到160,那么中间的库存被谁拿走了?猜测是因为别的点位(本应该去它对应的蜂房)也来拿取了蜂房的库存。
    通过review代码发现了问题
    初始化库存的代码如下:

Map<String, Sku> skuMap = skuReposityMap.get(shop.getEntrepotCode());
ArrayList<Sku> allSku = Lists.newArrayList();
allSku.addAll(Safes.of(template.getNormalList()));
allSku.addAll(Safes.of(template.getHotList()));
allSku.addAll(Safes.of(template.getColdList()));
allSku.addAll(Safes.of(template.getDeskList()));
allSku.addAll(Safes.of(template.getPlugList()));
for (Sku sku : allSku) {
    //问题就出在这行代码上
    skuMap.put(sku.getCode(), sku);
}
skuReposityMap.put(shop.getEntrepotCode(), skuMap);

扣减库存的代码如下

private List<ShopSkuRelation> filterNecessary(Shop shop, List<ShopSkuRelation> goods, Map<String, Sku> inventory,
            List<Sku> skuList) {
        return goods.stream().filter(shopSkuRelation -> {
            Sku sku = inventory.get(shopSkuRelation.getSkuCode());
            Scale6Decimal originInventory = sku.getInventory();
            logger.info("库房:{},skuCode:{},库存是:{}", shop.getEntrepotCode(), sku.getCode(), originInventory);
            Scale6Decimal result = originInventory.minus(new Scale6Decimal(new BigDecimal(shopSkuRelation.getNum())));
            logger.info("扣减库存,shelfCode是:{},蜂房:{},skuCode是:{},库存是:{},扣减num is {},结果是:{}", shop.getCode(),
                    shop.getEntrepotCode(), sku.getCode(), sku.getInventory(), shopSkuRelation.getNum(), result);
            if (result.isNegative()) {
                logger.info("skuCode:{},num is :{},repository is {},inventory is{},仓库不满足需求了", sku.getCode(),
                        shopSkuRelation.getNum(), shop.getEntrepotCode(), originInventory);
                return false;
            } else {
                //修改库存
                sku.setInventory(result);
                return true;
            }
        }).collect(Collectors.toList());
    }

第一段是循环遍历初始化库房-sku库存的数据结构,由于都是每个蜂房查询的sku列表是相同的,这个地方拿到的sku都是从template中get的,然后放到不同的map中去。而在下面修改库存的时候,其实修改的sku对象指向到的是同一份sku实例,本来我们期望的是不同蜂房的sku库存是相互隔离的,但是由于在初始化的时候,不同的蜂房使用了同一份sku,因此就出现了不同的点位扣除是同一份sku的库存

  1. 解决方案
    在初始化的时候,template吐出来的sku集合是一个deep copy就好了,这样就能保证每次遍历拿到的sku是独立的,也能保证即使对sku进行结构性变化,也不会影响到template。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容

  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,412评论 1 14
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,247评论 11 349
  • 最近在负责电商后台的商品模块改造以及新增仓储物流功能,将工作内容梳理总结了一下,第一篇文章梳理改造的商品管理模块,...
    野马王一点阅读 2,776评论 0 16
  • 记忆中,很少做梦,即使做了梦,但醒来之后就很快忘记,努力去想,却找不到痕迹,模模糊糊,无法记忆。所以,做梦对我来说...
    偶然之音阅读 90评论 0 0
  • 如果是冬天的温度,会让人觉得温暖。可是夏天的温度,想到的只能是炙热。夏天总会有高温的伴随,那就理解为夏天空调的温度...
    墨兰琼玉阅读 276评论 0 0