概述
需求
商品数据分为3个维度导入:spu,sku和图片
spu为基本的商品数据
sku导入前要求spu先导入或存在
图片导入前要求sku先存在
导入的数据量可能会比较大,所以需要异步进行,然后通过一个轮询查询消息
架构
时序图
导入的处理过程可能会很长,所以是异步的(图中绿色部分)
当导入任务提交后,U启个轮询,时时读取导入的状态
导入的任务状态存储在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
本模块的代码可能会多个产品使用到,所以为了方便迁移,统一放在如下包中:
cn.shoptnt.goodsimport