跳到主要内容

概述

需求

  • 商品数据分为3个维度导入:spu,sku和图片

  • spu为基本的商品数据

  • sku导入前要求spu先导入或存在

  • 图片导入前要求sku先存在

  • 导入的数据量可能会比较大,所以需要异步进行,然后通过一个轮询查询消息

架构

时序图

image-20220531151252946

导入的处理过程可能会很长,所以是异步的(图中绿色部分)

当导入任务提交后,U启个轮询,时时读取导入的状态

导入的任务状态存储在redis,以便异步处理和轮询进程可以同步状态

类图

image-20220531151945180

  • DataImportTask:数据导入接口,分别有三个实现对应三个导入场景
  • ImportStatusEnum:导入状态的标识

方法详解

importData方法

boolean importData(File file,Long shopId, Long categoryId, Long shopCatId,String uuid) 
tip

uuid是前端的一个唯一标识,为了在缓存中生成一个唯一的任务标识使用

为了兼容各个产品,所以有shopid

getStatus方法

ImportStatus getStatus(uuid);

根据uuid拼装缓存key,拿到状态返回

接口多实现的绑定

@Autowired
@Qualifier(value = "spuImportTaskImpl")
private DataImportTask spuImportTask;

异步的实现

通过@Async 来实现

@Async
public void importData(){....}

缓存key的约定

spu:

CachePrefix.GOODS_SPU_IMPORT_+UUID

sku:

CachePrefix.GOODS_SKU_IMPORT_+UUID

图片:

CachePrefix.GOODS_IMAGE_IMPORT_+UUID
tip

本模块的代码可能会多个产品使用到,所以为了方便迁移,统一放在如下包中:

cn.shoptnt.goodsimport