FTP_SERVE后台服务使用说明

一、方法概述

FTP 数据推送服务负责:

  1. 优先处理重读文件bus_push_ftp_readfile_flag 表)
  2. 优先处理重读表bus_push_ftp_readtable_flag 表)
  3. 断点时间扫描 FTP 目录,读取新文件(断点续传)
  4. 按文件夹粒度推送数据,推送完毕后更新断点时间

整体执行顺序:

processReReadFiles(重读文件)
    ↓
processReReadTables(重读表)
    ↓
getFileList(断点续传扫描)
    ↓
按 fileDate 分组逐文件推送
    ↓
每组推完后立即更新断点时间

二、三种断点(续传)方式

2.1 断点续传(普通模式)

触发条件:正常调度执行
依赖表bus_push_ftp_readdate(字段:nodeidreaddate

场景 行为
无断点记录 自动初始化断点为当天,写入 bus_push_ftp_readdate
有断点记录 读取 readdate,只处理日期 ≥ 断点的文件夹
推送完一个文件夹 立即更新断点 = 该文件夹日期 + 1 天

断点推进逻辑(readAndPushTxtFiles

文件夹日期 yyyyMMdd 推送完毕
  → 断点更新为 yyyyMMdd + 1 天(yyyy-MM-dd 格式存入 bus_push_ftp_readdate)
  → 下一轮从该断点对应的文件夹开始

日期连续性要求

  • FTP 文件夹命名格式必须为 *_yyyyMMdd,如 reps1_20260429
  • 文件夹内须包含 .log 文件,表示上传已完成,否则跳过
  • 若日期不连续(期望 20260428,FTP 上只有 20260430),停止处理并报警,等待补传,或者用户手动设置断点跳过缺失日期

2.2 重读文件(指定文件/文件夹重读)

触发条件bus_push_ftp_readfile_flag 表中存在 readflag=1 的记录
依赖表bus_push_ftp_readfile_flag(字段:idnodeidfilepathreaddatereadflag

有两种子模式:

按文件夹粒度重读(填写 readdate

字段 示例值 说明
readdate 2026-04-2620260426 指定要重读的日期(两种格式均兼容)
readflag 1 标记需要重读

执行逻辑

  1. readdate 转换为 yyyyMMdd(如 20260426
  2. 扫描 FTP rootpath,匹配名称以 _20260426 结尾的所有文件夹
  3. 文件夹内须包含 .log 文件,表示上传已完成,否则跳过
  4. 遍历文件夹内所有 .txt 文件,已读文件先删除 readfile 标记再下载
  5. 下载成功后直接调用 callClient 推送
  6. 推送成功后将该记录 readflag 置为 0updateReadfileFlag

2.3 重读表(指定表名重读)

触发条件bus_push_ftp_readtable_flag 表中存在 readflag=1 的记录
依赖表bus_push_ftp_readtable_flag(字段:idnodeidtablenamereaddatereadflag

字段 示例值 说明
tablename test_db 要重读的表名
readdate 2026-04-2620260426 指定要重读的日期(两种格式均兼容)
readflag 1 标记需要重读

执行逻辑

  1. readdate 转换为 yyyyMMdd
  2. 扫描 FTP rootpath,匹配名称以 _yyyyMMdd 结尾的文件夹
  3. 文件夹内须包含 .log 文件,表示上传已完成,否则跳过
  4. 过滤文件夹内tablename_ 开头.txt 文件(如 test_db_delete_20260426.txttest_db_insert_20260426.txt
  5. 已读文件先删除 readfile 标记再下载
  6. 下载成功后直接调用 callClient 推送
  7. 推送成功后将该记录 readflag 置为 0updateReadtableFlag

三、readdate 日期格式说明

字段所在表 字段名 存储格式 读取时兼容格式
bus_push_ftp_readdate readdate yyyy-MM-dd(如 2026-04-29 yyyy-MM-ddyyyyMMdd
bus_push_ftp_readfile_flag readdate yyyy-MM-dd(如 2026-04-29 yyyy-MM-ddyyyyMMdd
bus_push_ftp_readtable_flag readdate yyyy-MM-dd(如 2026-04-29 yyyy-MM-ddyyyyMMdd

存储规范:所有写入操作(updateReadDate、初始化断点)均使用 yyyy-MM-dd 格式。


四、FTP 文件结构要求

{ftp_path}/                         ← rootpath(由 bus_push_db_parameter.ftp_path 配置)
├── reps1_20260426/                 ← 文件夹命名格式:任意前缀_yyyyMMdd
│   ├── xxx.log                     ← 必须包含 .log 文件(表示上传完成)
│   ├── test_db_insert_20260426.txt ← 数据文件,命名:{表名}_{操作类型}_{yyyyMMdd}.txt
│   ├── test_db_delete_20260426.txt
│   └── other_table_insert_20260426.txt
├── reps1_20260427/
│   ├── xxx.log
│   └── ...
└── reps1_20260428/
    └── ...(无 .log 文件则跳过,等待上传完成)

文件命名规则(用于解析表名和操作类型):

部分 示例 说明
表名 test_db 取最后一个 _yyyyMMdd 之前、再往前一个 _操作类型 之前的部分
操作类型 insert / delete 文件名中含 insert 则为插入;含 delete 则为删除
日期 20260426 文件名最后 8 位(.txt 前)

五、关键日志输出格式

5.1 断点续传阶段日志

日志内容 级别 说明
The round check has a break time yyyy-MM-dd INFO 本轮断点时间
FTP目录扫描完成: {rootpath}, 总文件夹数: {n} INFO 扫描根目录完成
发现待读取文件夹: {dirName}, 日期: {yyyyMMdd}, 包含.log文件: 是 INFO 有效文件夹
文件夹扫描完成 - 总文件夹: {}, 待读取: {}, 无.log文件: {}, 命名无效: {}, 早于断点: {} INFO 扫描统计
Get read file {fileName} INFO 发现待读文件
+++++++++++++++>>> Start to generate temporary read file <<<+++++++++++++++ INFO 开始下载临时文件
-->> Temporary file generation time: {} ms INFO 下载耗时
This round checks files with {} bars to be read INFO 本轮待处理文件总数
--- 开始处理文件夹日期: {yyyyMMdd}, 文件数: {} --- INFO 开始处理一组文件
--- 文件夹日期: {} 推送完毕,本组处理文件数: {} --- INFO 一组处理完毕
✅ 文件夹 *_{yyyyMMdd} 推送完毕,更新断点时间: {yyyy-MM-dd} INFO 断点已更新
本轮共处理 {} 个文件 INFO 本轮汇总

5.2 重读文件日志

日志内容 级别 说明
发现 {} 个需要重读的记录 INFO 检测到重读任务
开始按文件夹粒度重读,日期: {readdate}, 目标后缀: *_{yyyyMMdd} INFO 文件夹重读开始
按文件夹重读:匹配到文件夹 {dirPath} INFO 匹配成功
按文件夹重读:文件 {} 已在 readfile 表中,先删除完成标记再重读 INFO 清除旧标记
按文件夹重读:开始下载文件 {} -> {} INFO 开始下载
按文件夹重读:文件 {} 下载成功({} ms),开始推送 INFO 下载成功
文件夹 {} 重读完成,推送文件数: {} INFO 文件夹重读完毕
重读标志已更新,id: {} INFO 标志更新成功
按文件夹重读:未找到匹配文件夹 *_{yyyyMMdd} WARN 未找到对应文件夹
解析重读日期失败: {readdate}, id: {} ERROR 日期格式不合法

5.3 重读表日志

日志内容 级别 说明
发现 {} 个需要重读的表 INFO 检测到重读表任务
开始按文件夹重读表 {} 的文件,日期: {readdate}, 目标后缀: *_{yyyyMMdd} INFO 表重读开始
重读表 {}:匹配到文件夹 {} INFO 文件夹匹配成功
重读表 {}:文件 {} 下载成功({} ms),开始推送 INFO 下载成功
表 {} 文件夹 {} 重读完成,推送文件数: {} INFO 重读完毕
重读表标志已更新,id: {} INFO 标志更新成功
重读表 {}:未找到匹配文件夹 *_{yyyyMMdd} WARN 未找到文件夹
重读表记录 id={} 的 readdate 为空,跳过 WARN readdate 为空

5.4 推送阶段日志(callClient)

日志内容 级别 说明
+++++++++++++++>>> Push file {fileName} Start <<<+++++++++++++++ INFO 推送开始
+++++++++++++++>>> Push file cache {n}M <<<+++++++++++++++ INFO 缓冲区大小(默认 30MB)
30M 发送一次开始,当前批次 {} INFO 缓冲区满,分批发送
30M 发送一次结束,当前批次 {} INFO 当前批次发送完成
-->> 发送完成. 批次总共发送: {} INFO 所有批次发送完
删除临时推送文件 {filePath} INFO 清理临时文件
-->> 推送文件 {} 结束,数据推送耗时: {} ms,推送数据条数:{} INFO 推送完毕汇总
[TEST MODE] 跳过实际推送,模拟推送成功 - 文件: {} WARN 测试模式
⚠️ 临时文件不存在: {} ERROR 临时文件缺失
--->>> An exception occurs when data is pushed to the cloud ERROR 推送异常

5.5 断点异常/警告日志

日志内容 级别 说明
⚠️ 发现时间间隔,停止处理! ERROR 日期不连续
⚠️ 期望日期: {}, 期望文件夹: {} ERROR 期望的下一个文件夹
⚠️ 实际日期: {}, 实际文件夹: {} ERROR 实际遇到的文件夹
⚠️ 请检查FTP服务器上是否缺少 {} 的数据文件夹 ERROR 缺少文件夹提示
⚠️ 以下文件夹将不会被处理(因为时间不连续): ERROR 未处理文件夹列表
⚠️ 从断点时间 {} 开始无处理文件 ERROR 断点后无文件
⚠️ 1. FTP服务器上不存在 >= {} 的数据文件夹 ERROR 原因提示
⚠️ 2. 断点时间设置错误,请检查 bus_push_ftp_readdate 表中的 readdate 字段 ERROR 原因提示
⚠️ 3. 文件夹命名格式不正确,应为:*_yyyyMMdd ERROR 原因提示
FTP目录下没有文件夹: {} WARN 根目录为空

六、相关数据库表

bus_push_ftp_readdate(断点续传时间)

字段 类型 说明
nodeid VARCHAR 节点ID
readdate VARCHAR 断点时间,格式 yyyy-MM-dd,如 2026-04-29

维护方式:系统自动写入/更新,每个文件夹推送完后立即更新为该文件夹日期 +1 天。
手动干预:若需要从某日期重新处理,将 readdate 改为目标日期即可(支持 yyyy-MM-ddyyyyMMdd 两种格式)。


bus_push_ftp_readfile(已读文件记录)

字段 类型 说明
nodeid VARCHAR 节点ID
filename VARCHAR 文件名
readdate VARCHAR 读取日期
startposition VARCHAR 断点位置(XML模式用)

用途:记录已推送的文件,防止重复推送。重读时先调用 deleteReadfile 清除旧记录,推送成功后重新写入。


bus_push_ftp_readfile_flag(重读文件标志)

字段 类型 说明
id INT 主键
nodeid VARCHAR 节点ID
readdate VARCHAR 日期(文件夹重读用),支持 yyyy-MM-ddyyyyMMdd
readflag INT 1=需要重读,0=已完成

使用方式

  • 文件夹重读:填写 nodeidreaddatereadflag=1
  • readflag=0 的记录在下次查询时自动清除(getReadfileFlag 中执行 delete)

bus_push_ftp_readtable_flag(重读表标志)

字段 类型 说明
id INT 主键
nodeid VARCHAR 节点ID
tablename VARCHAR 要重读的表名,如 test_db
readdate VARCHAR 日期,支持 yyyy-MM-ddyyyyMMdd
readflag INT 1=需要重读,0=已完成

使用方式:填写 nodeidtablenamereaddatereadflag=1,推送成功后自动置 0


七、配置参数(bus_push_db_parameter 表)

variable_name 说明 示例
server_host 数据总线服务地址 39.105.216.103
server_user 数据总线用户名 -
server_password 数据总线密码 -
host FTP/SFTP 服务器地址 192.168.1.100
port FTP/SFTP 端口 21
user FTP/SFTP 用户名 -
password FTP/SFTP 密码 -
ftp_path FTP 根目录路径 /opt1/share_dxetl3/Infordata
ftp_protocol 协议类型 ftpsftp
ftp_send_buffer 发送缓冲区大小(MB) 30(默认 50)
source_db_type 数据库类型 gbase8a
default_schema 默认 schema -
separator 字段分隔符 |(默认)
newline_character 行结束标记 &END&(默认)

八、常见问题排查

现象 日志关键字 排查方向
文件不被处理 跳过文件(表不存在) 检查 bus_in_tables 表中是否配置了对应表名
文件不被处理 跳过文件(已读取) 文件已在 bus_push_ftp_readfile,需删除记录后重试
某日期文件夹未处理 跳过文件夹(无.log文件) FTP 服务器该文件夹下缺少 .log 文件
处理中断 ⚠️ 发现时间间隔,停止处理 FTP 上缺少中间某日期的文件夹,补传后自动恢复
无文件可处理 ⚠️ 从断点时间 {} 开始无处理文件 断点时间超出 FTP 现有文件夹范围,或断点设置错误
重读不生效 按文件夹重读:未找到匹配文件夹 FTP 上不存在该日期文件夹,检查 readdate 是否填写正确
推送失败 ⚠️ 临时文件不存在 FTP 下载失败,检查 FTP 连通性和文件路径
推送异常 An exception occurs when data is pushed to the cloud 检查数据总线服务地址和网络连通性
文档更新时间: 2026-05-05 17:34   作者:周风磊