跳到主要内容

概述

需求

  1. 商品数据导入共分为5个维度:spu、sku、参数、图片和详情
  2. spu为基本的商品数据,在导入其它数据之前,要优先导入spu数据
  3. 导入的数据量可能会比较大,所以需要异步进行,然后通过一个轮询查询消息

时序图

image-20220531151252946

重点步骤说明:

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

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

  • 导入的任务状态存储在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

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

com.enation.app.javashop.goodsimport