下述文档中的类和代码均可在ageiport-test模块中搜索获得,未避免文档和代码不一致,文档中只描述重点接口
定义几个导入导出用到的POJO分别对应QUERY/VIEW/DATA三个泛型
参考代码: com.alibaba.ageiport.test.processor.core.model
第1步,准备导入文件
此步骤在生产环境中不需要,一般导入的文件由用户通过Web页面上传
- 项目目录的resources文件夹下创建import-xlsx文件夹
- 在import-xlsx文件夹创建StandaloneImportProcessor.xlsx文件,包含两列编码、姓名(与View中的字段对应)
- 在StandaloneImportProcessor.xlsx文件添加一些数据
第2步,实现导入Processor
参考代码:com.alibaba.ageiport.test.processor.core.importer.StandaloneImportProcessor
- 实现ImportProcessor接口,并使用上文定义POJO Query、Data、View作为接口的泛型参数
- 实现ImportProcessor接口的convertAndCheck方法,此方法负责检查导入的数据,文件中的View对象转为Data对象。返回值BizImportResult<View, Data>,当无错误数据时BizImportResult只设置View即可,若有错误数据则需设置View,View最终会被写到文件中输出给用户。
- 实现ExportProcessor接口的write方法,此方法负责执行写入业务逻辑。返回值BizImportResult<View, Data> ,当无错误数据时BizImportResult只设置View即可,若有错误数据则需设置View,View最终会被写到文件中输出给用户。
第3步,注册第1步实现的导入Processor
- 项目目录的resources文件夹下创建META-INF文件夹
- META-INF文件夹下创建名为com.alibaba.ageiport.processor.core.Processor的文本文件
- 添加一行配置记录:StandaloneImportProcessor=com.alibaba.ageiport.test.processor.core.importer.StandaloneImportProcessor,其中等号左侧为ImportSpecification中的code,等号右侧为导出实现类的全类名
第4步,运行单元测试,执行任务
此步骤实际生产环境中一般由API触发,是用户从页面点击导入按钮上传文件触发的。
- 初始化AgeiPort实例,在单测中为了尽可能少的依赖外部组件,我们使用AgeiPortOptions.Debug()测试配置来初始化AgeiPort实例。若为生产环境,AgeiPort实例应被维护到应用的上下文中,比如在Spring的Configuration中初始化AgeiPort并作为一个bean存储在Spring上下文中。
- 读取文件并将文件上传到文件存储中,获取文件的Key。
- 构造查询参数TaskExecuteParam,必须传入:TaskSpecificationCode,标识某一个任务;BizUserId标识当前任务的触发人;InputFileKey为第2步中获取到的文件Key;上文定义的Query对象需要以JSON的格式传入。
- 调用本地方法executeTask,开始执行任务,并获取任务实例ID。用户可根据自身技术线路封装远程调用接口。processor包中也包含了可远程执行任务的HTTP API,详情见:API参考文档。
- 使用内部封装的TaskHelp方法判断任务是否执行成功,TestHelp类主要是封装了一些判断任务执行状态的断言
- 调用本地接口创建任务参考代码:
com.alibaba.ageiport.test.processor.core.exporter.StandaloneImportProcessor
- 调用HTTP接口创建任务参考代码:
com.alibaba.ageiport.test.processor.core.api.HttpApiTest
第5步,查询任务进度,下载导出文件
此步骤生产环境中一般由API触发,在用户触发任务后,页面自动轮询任务进度,最终将生成的文件返回给用户,详见API参考文档。
可参照TestHelper类的assertWithFile方法,代码在:com.alibaba.ageiport.test.processor.core.TestHelper#assertWithFile
- 创建进度查询请求参数GetTaskProgressParam,其中MainTaskId为上文创建任务返回的任务ID
- 调用本地方法,查询任务进度。用户可根据自身技术线路封装远程调用接口。processor包中也包含了可远程执行任务的HTTP API,详情见:API参考文档。
- 轮询任务进度,直至任务完成或出错
- 若convertAndCheck和write方法返回的BizImportResult包含View,View数据会被写入到输出文件中
- 若导入有错误数据文件输出,下载文件到本地
- 若已下载错误文件,断言判断错误文件中的数据是否符合预期
方式一:ImportSpecification注解中通过executeType属性指定,默认值为"STANDALONE"即为单机执行 方式二:通过实现接口com.alibaba.ageiport.processor.core.task.importer.ImportProcessor#taskRuntimeConfig返回ExecuteType的值为" STANDALONE",可动态设置执行方式,此方式优先级比方式一高
方式一:ImportSpecification注解中通过executeType属性指定,设置为"CLUSTER"即为多机执行 方式二:通过实现接口com.alibaba.ageiport.processor.core.task.importer.ImportProcessor#taskRuntimeConfig返回ExecuteType的值为" CLUSTER",可动态设置执行方式,此方式优先级比方式一高
方式一:注解中添加fileType="csv",参考代码:com.alibaba.ageiport.test.processor.core.importer.CSVImportProcessor
@ImportSpecification(code = "CSVImportProcessor", name = "CSVImportProcessor", fileType = "csv")
方式二::通过实现接口com.alibaba.ageiport.processor.core.task.importer.ImportProcessor#taskRuntimeConfig返回FileType的值为" csv",可动态设置执行方式,此方式优先级比方式一高
public BizImportTaskRuntimeConfig taskRuntimeConfig(BizUser user, Query query) throws BizException {
final BizImportTaskRuntimeConfigImpl runtimeConfig = new BizImportTaskRuntimeConfigImpl();
runtimeConfig.setExecuteType("STANDALONE");
runtimeConfig.setFileType("csv");
return runtimeConfig;
}