AGEIPort API参考手册:所有接口详解与调用示例
【免费下载链接】AGEIPort项目地址: https://gitcode.com/gh_mirrors/ag/AGEIPort
AGEIPort(Alibaba Generic Export Import Framework)是阿里巴巴集团内部广泛使用的高性能数据导入导出框架,专为复杂业务场景设计,提供完整的API接口体系。本文将详细介绍AGEIPort的核心接口功能、调用方法及最佳实践,帮助开发者快速掌握这个强大的数据处理工具。
🚀 AGEIPort框架架构概览
AGEIPort采用事件驱动架构设计,支持透明化的集群/单机执行、串行/并行执行,能够大幅提升数据处理性能。框架核心分为三个主要模块:
- ageiport-processor(必须模块):框架核心,包含本地API和HTTPAPI,开发者在此实现业务逻辑
- ageiport-task(必须模块):任务处理模块,与数据库交互,提供任务管理接口
- ageiport-web(可选模块):前端页面接口,减少重复Controller开发
📋 ImportProcessor接口详解
ImportProcessor是数据导入的核心接口,负责处理Excel/CSV等格式的数据文件导入业务。
核心泛型参数
- QUERY:查询参数对象,映射前端传递的查询条件
- VIEW:文件数据对象,映射文件中每行数据的Java对象
- DATA:实际数据对象,VIEW转换后用于写入数据源的类型
必须实现的接口方法
1. convertAndCheck方法
BizImportResult<VIEW, DATA> convertAndCheck( BizUser bizUser, QUERY query, List<VIEW> views )功能:校验并转换VIEW对象列表数据,返回DATA列表和VIEW列表
参数说明:
bizUser:当前创建任务的用户信息query:当前任务的查询参数views:VIEW对象列表,从文件中读取的数据
返回值:包含VIEW和DATA数据的导入结果对象
2. write方法
BizImportResult<VIEW, DATA> write( BizUser bizUser, QUERY query, List<DATA> data )功能:执行用户写入逻辑,将处理后的数据写入目标系统
参数说明:
bizUser:当前创建任务的用户信息query:当前任务的查询参数data:DATA对象列表,经过转换和校验的数据
可选实现的接口方法
1. getHeaders方法
获取导入任务的表头定义,优先级高于@ViewField注解
BizColumnHeaders getHeaders(BizUser bizUser, QUERY query)2. getDynamicHeaders方法
处理动态表头场景,如日期列名随时间变化
BizDynamicColumnHeaders getDynamicHeaders(BizUser bizUser, QUERY query)3. taskRuntimeConfig方法
修改任务运行时配置,如超时时间、分片策略等
BizImportTaskRuntimeConfig taskRuntimeConfig(BizUser bizUser, QUERY query)4. group方法
将数据分组输出到不同文件或Excel的Sheet
BizDataGroup<VIEW> group( BizUser bizUser, QUERY query, List<VIEW> views )📤 ExportProcessor接口详解
ExportProcessor是数据导出的核心接口,负责将业务数据导出为Excel/CSV等格式文件。
必须实现的接口方法
1. totalCount方法
Integer totalCount(BizUser bizUser, QUERY query)功能:获取导出任务的数据总量,用于计算分片
2. queryData方法
List<DATA> queryData( BizUser bizUser, QUERY query, BizExportPage bizExportPage )功能:分页获取要导出的数据
参数说明:
bizExportPage:当前子任务的分页信息,包含offset和size
3. convert方法
List<VIEW> convert( BizUser bizUser, QUERY query, List<DATA> data )功能:转换子任务分页数据,将DATA对象转换为VIEW对象
可选实现的接口方法
1. getDynamicHeaders方法
处理动态列导出场景
BizDynamicColumnHeaders getDynamicHeaders(BizUser bizUser, QUERY query)2. resetQuery方法
修改查询参数对象
QUERY resetQuery(BizUser bizUser, QUERY query)🏷️ 核心注解详解
@ViewField注解
用于定义VIEW对象的字段映射关系
| 字段 | 含义 | 必填 | 示例 |
|---|---|---|---|
| headerName | 表头名称 | 是 | "用户姓名" |
| type | 表头类型 | 否 | FieldType.STRING |
| index | 表头下标 | 否 | 0 |
| isDynamicColumn | 是否动态列 | 否 | false |
| groupIndex | 分组下标 | 否 | 0 |
| groupName | 分组名称 | 否 | "基本信息" |
| isErrorHeader | 是否错误列 | 否 | false |
| isRequired | 是否必填 | 否 | true |
| columnWidth | 列宽度 | 否 | 15 |
| values | 可选值 | 否 | {"男", "女"} |
@ImportSpecification注解
标注在ImportProcessor实现类上,定义导入任务规格
@ImportSpecification( code = "userImport", name = "用户数据导入", desc = "批量导入用户信息", type = TaskType.IMPORT, executeType = ExecuteType.CLUSTER, timeoutMs = 3600000, totalThreshold = 100000, fileType = FileType.XLSX, pageSize = 1000, sliceStrategy = AvgImportSliceStrategy.class )@ExportSpecification注解
标注在ExportProcessor实现类上,定义导出任务规格
@ExportSpecification( code = "userExport", name = "用户数据导出", desc = "批量导出用户信息", type = TaskType.EXPORT, executeType = ExecuteType.CLUSTER, timeoutMs = 1800000, totalThreshold = 50000, fileType = FileType.CSV, pageSize = 2000, sliceStrategy = AvgExportSliceStrategy.class )🔧 实际调用示例
导入任务实现示例
@ImportSpecification( code = "productImport", name = "产品信息导入" ) public class ProductImportProcessor implements ImportProcessor<ProductQuery, ProductView, ProductData> { @Override public BizImportResult<ProductView, ProductData> convertAndCheck( BizUser bizUser, ProductQuery query, List<ProductView> views ) { // 数据校验和转换逻辑 List<ProductData> dataList = new ArrayList<>(); List<ProductView> errorViews = new ArrayList<>(); for (ProductView view : views) { if (validate(view)) { ProductData data = convertToData(view); dataList.add(data); } else { errorViews.add(view); } } return new BizImportResult<>(dataList, errorViews); } @Override public BizImportResult<ProductView, ProductData> write( BizUser bizUser, ProductQuery query, List<ProductData> data ) { // 数据写入逻辑 productService.batchSave(data); return new BizImportResult<>(data, new ArrayList<>()); } }导出任务实现示例
@ExportSpecification( code = "orderExport", name = "订单数据导出" ) public class OrderExportProcessor implements ExportProcessor<OrderQuery, OrderView, OrderData> { @Override public Integer totalCount(BizUser bizUser, OrderQuery query) { return orderService.countByQuery(query); } @Override public List<OrderData> queryData( BizUser bizUser, OrderQuery query, BizExportPage page ) { return orderService.findByQuery(query, page.getOffset(), page.getSize()); } @Override public List<OrderView> convert( BizUser bizUser, OrderQuery query, List<OrderData> data ) { return data.stream() .map(this::convertToView) .collect(Collectors.toList()); } }🎯 最佳实践与性能优化
1. 分片策略配置
合理配置分片大小可以显著提升处理性能:
- 小数据量(<1万条):单机执行,分片大小1000
- 中数据量(1万-10万条):集群执行,分片大小2000
- 大数据量(>10万条):集群执行,分片大小5000
2. 内存优化建议
- 使用流式处理避免内存溢出
- 合理设置JVM堆内存大小
- 启用GC优化参数
3. 错误处理机制
- 实现完善的校验逻辑
- 提供清晰的错误信息
- 支持错误数据导出
4. 监控与日志
- 集成应用监控系统
- 记录任务执行日志
- 设置合理的超时时间
📊 任务执行流程
导入任务流程
- 接收上传文件
- 解析文件数据为VIEW对象
- 执行convertAndCheck进行校验转换
- 执行write写入目标系统
- 返回执行结果
导出任务流程
- 调用totalCount获取数据总量
- 根据分片策略创建子任务
- 每个子任务调用queryData获取数据
- 调用convert转换为VIEW对象
- 合并所有子任务结果生成文件
🔍 调试与问题排查
常见问题解决方案
- 任务超时:调整timeoutMs参数,优化数据处理逻辑
- 内存溢出:减小分片大小,优化数据转换逻辑
- 文件格式错误:检查文件编码,确保符合规范
- 数据校验失败:完善校验逻辑,提供明确错误信息
调试工具推荐
- 使用框架提供的日志输出
- 集成APM监控系统
- 配置详细的调试日志级别
📈 扩展与自定义
AGEIPort框架支持高度自定义,可以通过以下方式扩展功能:
- 自定义分片策略:实现SliceStrategy接口
- 自定义文件格式:扩展FileType枚举
- 自定义任务类型:扩展TaskType枚举
- 自定义适配器:实现Adapter接口修改任务执行流程
🎉 总结
AGEIPort提供了一套完整、高性能的数据导入导出解决方案。通过本文的API详解和示例,开发者可以快速掌握框架的核心接口使用方法。无论是简单的数据导入导出,还是复杂的业务场景处理,AGEIPort都能提供稳定可靠的支撑。
记住关键点:合理设计QUERY、VIEW、DATA三个泛型参数,正确实现必须接口方法,根据业务需求选择实现可选接口方法,就能构建出高效的数据处理任务。
官方文档:docs/zh/API参考文档.md 提供了更详细的API说明和配置参数,建议在实际开发中结合文档进行参考。
【免费下载链接】AGEIPort项目地址: https://gitcode.com/gh_mirrors/ag/AGEIPort
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考