组件架构

- intefaces模块:主要包含用户使用接口API
- tools模块:包含组件内核实现的文件操作工具
- codec模块:对文件结构,行数据,字段数据进行编码解码
- meta模块: 元数据配置以及加载
- loader/extension模块: 对配置、插件等资源进行加载
- resource模块:对资源层抽象,组件内部实现classpath, file, oss加载,用户可以自定义插件实现其他存储加载
- spi模块:开放给用户的插件扩展入口
- config模块:配置相关的资源信息
一:FileConfig
创建文件操作工具的配置对象, 这里定义的参数优先级最高
| 属性类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|
| type | 否 | protocol | 目前不用关注 保留属性,后续可能扩展不是根据协议解析的文件操作 |
| filePath | 是 | 操作文件的路径 | |
| fileDataType | 否 | FileDataTypeEnum.ALL | 文件根据协议布局模板+数据定义模板进行文件处理,协议布局模板和数据定义模板都包含head, body, tail;但是文件在分片过程中如果是body分片, 利用同样的协议布局模板+数据定义模板需要指定数据类型FileDataTypeEnum.BODY |
| templatePath | 是 | 数据定义模板路径 | |
| templateEncoding | 否 | utf-8 | 数据定义模板文件的编码;优先级:FileConfig > TemplateConfig > FileDefaultConfig |
| fileEncoding | 否 | utf-8 | |
| lineBreak | 否 | \r\n | 生成文件的换行符;优先级 FileConfig > TemplateConfig > FileDefaultConfig |
| storageConfig | 是 | 文件操作的存储配置 | |
| processorKeys | 否 | processor回调指定的key | |
| summaryEnable | 否 | false | 是否开启汇总功能 |
| createEmptyFile | 否 | false | 写文件时,如果没有数据是否生成空文件 |
| rowValidators | 否 | 设置行级校验器 | |
| columnSplit | 否 | 保留属性,先不要关注 | |
| offset | 否 | 文件分片操作起始位置,通过setPartial方法设置 | |
| length | 否 | 文件分片操作数据长度,通过setPartial方法设置 | |
| isAppend | 否 | false | 写文件时,是否在文件尾追加 |
| is | 否 | InputStream, 读数据时外部构建的输入流 |
FileDefaultConfig
FileDefaultConfig设置的属性是组件的默认配置 。
| 方法 | 默认值 | 描述 |
|---|---|---|
| setDefaultFileEncoding | utf-8 | 设置读取或者生成文件的编码 |
| setDefaultTemplateEncoding | utf-8 | 设置加载的数据定义模板的编码 |
| setDefaultLineBreak | \r\n | 设置生成文件的换行符,读取时组件都能识别 |
| addDefaultFleParam | 无 | 设置扩展属性,组件内核不会使用,会透传给自己实现的扩展插件 |
| setCommonLog | 无 | 设置日志回调的实现 |
| setRdfProcessorPath | classpath*:META-INF/rdf-file/auto-processor/ | 设置自动执行处理器存储和根路径 |
| setRdfProtocolPath | classpath*:META-INF/rdf-file/protocol/ | 设置协议布局模板存储和根路径 |
| setRdfFormatPath | classpath*:META-INF/rdf-file/format/ | 设置字段格式化方式存储和根路径 |
| setRdfTemplatePath | classpath: | 设置数据定义模板存储和根路径 |
二:FileFactory
FileFactory是Rdf-File组件入口,通过FileFactory创建文件处理所需的工具对象
| FileFactory创建工具 | 参数对象 | 描述 |
|---|---|---|
| FileReader | FileConfig | 创建文件读工具 |
| FileWriter | FileConfig | 创建文件写工具 |
| FileMerger | FileConfig | 创建文件合并工具 |
| FileValidator | FileConfig | 创建文件校验工具 |
| FileSorter | FileConfig | 创建文件排序工具 |
| FileStorage | StorageConfig | 创建文件存储操作工具 |
| FileSplitter | StorageConfig | 创建文件分割工具 |
三:FileReader
| 方法 | 描述 |
|---|---|
| < T > T readHead(Class<?> requiredType) | 将读取的头,转换成指定类型 不能是接口 |
| < T > T readRow(Class<?> requiredType) | 读取body数据并将每行数据转换成指定类型,不能是接口 |
| String readLine() | 读取一行数据,不做解析转换 |
| Summary getSummary() | 获取汇总字段,FileConfig.summaryEnable=false时抛异常 |
| void close() | 关闭流 |
四:FileValidator
| 方法 | 描述 |
|---|---|
| ValidateResult validate() | 文件校验 根据文件模板校验文件格式,包括非空字段 根据文件模板配置的RowValidator校验每行数据 根据文件模板配置的汇总信息校验文件汇总信息和总笔数 |
五:FileSorter
5.1 接口方法
| 接口方法 | 描述 |
|---|---|
| SortResult sort(SortConfig sortConfig) | 文件排序 |
5.2 SortConfig参数说明
| 入参SortConfig配置 | 必填 | 描述 |
|---|---|---|
| sortIndexes[] | 否 | 指定排序字段索引,若排序字段值相等整行排序,若sortIndexes没有指定,整行排序 |
| resultPath | 是 | 排序临时文件存放目录地址 |
| resultFileName | 否 | 结果文件名,没有设置系统生成一个 |
| sortType | 是 | 排序方式,升序或降序 |
| headLines | 否 | 保留字段,不要设置 |
| executor | 是 | 排序使用的线程池 |
| resultFileType | 是 | 返回的结果类型,SLICE_FILE_PATH: 有序的分片文件,FULL_FILE_PATH: 合成一个有序的完整文件 |
| columnRearrangeIndex | 否 | 保留字段:对字段重新排序 如:{5,3,6,0,2,1} |
| rowFilters | 否 | 对行数据进行过滤判定的回调 |
| sliceSize | 否 | 默认 1M |
| resultStorageConfig | 否 | 结果文件存放存储,默认NAS |
| sourceFilePaths | 否 | 多文件排序时设置,覆盖FileConfig.filePath参数 |
5.3 结果对象说明
| 结果对象值 | 描述 |
|---|---|
| String fullFilePath | 当ResultFileTypeEnum.FULL_FILE_PATH时整个排完序文件path |
| String headSlicePath | 分片头路径 |
| List bodySlicePath | 分片体路径 |
| String tailSlicePath | 分片尾路径 |
六:FileSplitter
文件分割器,返回结果只是标记了分片文件的范围,没有真正切分文件
文件切分保证在数据的行尾,不会在一行数据中间
| 方法 | 描述 |
|---|---|
| List< FileSlice> split(String path, int sliceSize) | 对整个文件按大小切分 |
| FileSlice getHeadSlice(FileConfig fileConfig) | 获取文件头分片,分片范围内只包含文件头 |
| FileSlice getBodySlice(FileConfig fileConfig) | 获取文件body分片,分片范围内只包含文件body数据 |
| List< FileSlice> getBodySlices(FileConfig fileConfig, int sliceSize) | 对文件body按大小切分, 返回文件body分片列表 |
| FileSlice getTailSlice(FileConfig fileConfig) | 获取文件尾分片,分片范围内只包含文件尾 |
七:FileMerger
| MergerConfig参数设置 | 描述 |
|---|---|
| setHeadFilePaths(List headFilePaths) | 合并头文件列表,同存储 |
| setHeadFilePathHolders(List headFilePaths) | 合并头文件列表,可以不同存储 |
| setBodyFilePaths(List bodyFilePaths) | 合并body文件列表,同存储 |
| setBodyFilePathHolders(List bodyFilePaths) | 合并body文件列表,可以不同存储 |
| setTailFilePaths(List tailFilePaths) | 合并尾文件列表,同存储 |
| setTailFilePathHolders(List tailFilePaths) | 合并尾文件列表,可以不同存储 |
| setExistFilePaths(List existFilePaths) | 合并已存在完整文件列表,同存储 |
| setExistFilePathHolders(List existFilePaths) | 合并已存在完整文件列表,可以不同存储 |
| setStreamAppend(boolean streamAppend) | 合并的时候是否开启流合并 |
| 方法 | 描述 |
|---|---|
| void merge(MergerConfig config) | 文件合并 |
八:FileWriter
| 方法 | 描述 |
|---|---|
| void writeHead(Object headBean) | 写入头部信息, 传入一个javabean对象或者map |
| void writeRow(Object rowBean) | 写入一行记录, 传入一个javabean对象或者map |
| void writeTail(Object tailBean) | 写入尾部信息, 传入一个javabean对象或者map |
| void writeLine(String line) | 直接写入一行字符串 |
| Summary geSummary() | 获取写入的汇总信息 |
| void close() | 关闭流 |
九:FileStorage
| 方法 | 描述 |
|---|---|
| void createNewFile(String filePath) | 创建一个空文件,不能创建文件夹,如果创建文件前文件已存在则覆盖原文件 |
| FileInfo getFileInfo(String filePath) | 获取文件信息:是否存在、文件大小、最后修改时间,metadata,userMetadata 特定存储返回一些特殊信息如oss的md5等 |
| List< String> listFiles(String folderName, String[] regexs) | 只查询当前文件夹下的文件和文件夹全路径,regexs 正则式可以过滤 |
| List< String> listFiles(String folderName, FilePathFilter... fileFilters) | 只查询当前文件夹下的文件和文件夹全路径, fileFilters过滤器过滤 |
| List< String> listAllFiles(String folderName, String[] regexs) | 只查询文件夹子文件夹中的所有文件 (不包括文件夹),regexs 正则式可以过滤 |
| List< String> listAllFiles(String folderName, FilePathFilter... fileFilters) | 只查询文件夹子文件夹中的所有文件 (不包括文件夹),fileFilters过滤器过滤 |
| void download(String srcFile, String toFile) | 1. 下载 文件srcFile=oss/yeb/test/aa.txt, toFile=/sharedata/test/bb/aa.txt 2. 下载文件夹 srcFile=oss/yeb/test/, toFile=/sharedata/kkk/, 将oss/yeb/test/下目录包括子目录下文件下载到/sharedata/kkk/目录下 |
| void upload(String srcFile, String toFile, boolean override) | 1.上传文件 2.文件夹上传, 将原文件夹下所有文件及子文件上传到目标目录3.override 指定是否覆盖已有文件 |
| void rename(String srcFile, String toFile) | 文件重名:如果要重命名文件夹,目标文件夹不能是原始文件夹的子目录,如果目标文件已存在,则覆盖目标文件 |
| void copy(String srcFile, String toFile) | 文件拷贝: 如果是oss存储,只能支持同账号下拷贝 |
| void delete(String fullPath) | 可以删除文件或文件夹 |
StorageConfig
| 属性 | 值 | 描述 |
|---|---|---|
| storageType | nas/oss | 指定存储类型组件实现了nas/oss, 业务可扩展 |
| param | Map<String, Object> | 组件给插件透传一些值, 如oss存储实现需要提供账号信息,nas存储只需要指定类型即可 |
Oss扩展配置
oss存储插件的实现,需要指定oss相关配置信息
param通过指定key透传
StorageConfig storageConfig = new StorageConfig(FileOssStorageContants.STORAGE_OSS);
storageConfig.addParam(OssConfig.OSS_STORAGE_CONFIG_KEY, ossConfig);
ossConfig 参数列表
| 参数key | 必填 | 描述 |
|---|---|---|
| bucketName | 是 | oss 命令空间 |
| endpoint | 是 | oss 访问地址 |
| accessKeyId | 是 | oss 访问key |
| accessKeySecret | 是 | oss 访问密钥 |
| ossTempRoot | 否 | 写文件时OSS本地文件根目录 写文件时会先写在本地再上传到OSS OSS本地目录为:tempRoot + OSS路径,默认值是:/home/admin/logs/ossLocal/ |
| ossBigFileSize | 否 | oss大文件上传采用并发上传,默认大文件size是1G |
| ossAppendSizeLimit | 否 | 追加上传的次数没有限制,文件大小有限制,默认上限为5GB |