概述
需求
- 商品数据导入共分为5个维度:spu、sku、参数、图片和详情
- spu为基本的商品数据,在导入其它数据之前,要优先导入spu数据
- 导入的数据量可能会比较大,所以需要异步进行,然后通过一个轮询查询消息
时序图
重点步骤说明:
导入的处理过程可能会很长,所以是异步的(图中绿色箭头部分)
当导入任务提交后,开启轮询,时时读取导入的状态
- 导入的任务状态存储在redis,以便异步处理和轮询进程可以同步状态
类图
说明:
- 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