analysis-task-1.md 3.0 KB

任务 1: 入口流程分析

CleanTask.doTask() 方法执行流程分析

核心步骤

  1. 工作表筛选与分类

    • 创建 extractSheetList 存储无模板ID的工作表
    • 创建 sheetMap 映射有模板ID的工作表(键为sheetName)
    • 筛选逻辑:只处理有模板ID的工作表
  2. 文件类型处理

    • 通过 fileInfo.getFileType() 获取文件类型并转换为 ExcelTypeEnum
    • 支持多种文件类型(Excel、CSV等)
  3. ETL监听器创建

    • 创建 StreamingEtlListener 实例
    • 传入 LogDirtyDataHandler 处理脏数据
    • 传入工作表信息列表和提取列表
  4. 文件读取配置

    • 获取文件编码 Charset
    • 使用 try-with-resources 创建 ExcelReader
    • 配置参数:密码、表头行号、文件类型、自动修剪、编码、转换器
  5. CSV特殊处理

    • 对于CSV文件,设置分隔符配置
    • 直接调用 reader.readAll() 读取所有数据
  6. Excel工作表排序

    • 获取所有工作表 readSheets
    • 按优先级排序:
      • 优先处理 OPEN_ACCOUNT_ID 中的模板ID(1、2)
      • 然后处理其他模板ID
    • 按排序后的顺序读取工作表
  7. 异常处理

    • 捕获通用异常,记录错误日志
    • 处理特定异常:
      • UnsupportedFileFormatException 或 POIXMLException:标记文件为不支持
      • EncryptedDocumentException:标记文件为加密
  8. 结果处理

    • 将主文件信息添加到 sheetList
    • 通过 FileInfoMapper 批量插入文件信息到数据库
    • 使用 DynamicDsKey.with("case", ...) 切换数据源

关键设计特点

  1. 流式处理:使用 StreamingEtlListener 实现逐行处理,支持大数据量文件
  2. 优先级处理:开户信息优先处理,确保依赖关系正确
  3. 异常容错:完善的异常处理机制,确保任务不会因单个文件失败而中断
  4. 资源管理:使用 try-with-resources 确保资源正确释放
  5. 数据源隔离:使用动态数据源切换,确保数据存储到正确的数据库

代码优化建议

  1. 错误处理增强:可以考虑添加更细粒度的错误分类和处理
  2. 日志增强:添加更多关键步骤的日志记录,便于问题排查
  3. 参数验证:增加对输入参数的验证,提高代码健壮性
  4. 性能优化:对于大量工作表的情况,可以考虑并行处理

数据流图

[文件] → [CleanTask.doTask()] → [工作表筛选] → [创建ETL监听器] → [文件读取]
                                           ↓
                                   [按优先级排序工作表]
                                           ↓
                                   [逐行处理数据]
                                           ↓
                                   [异常处理]
                                           ↓
                                   [批量存储结果]