FTP_SERVE后台服务使用说明
一、方法概述
FTP 数据推送服务负责:
- 优先处理重读文件(
bus_push_ftp_readfile_flag表) - 优先处理重读表(
bus_push_ftp_readtable_flag表) - 按断点时间扫描 FTP 目录,读取新文件(断点续传)
- 按文件夹粒度推送数据,推送完毕后更新断点时间
整体执行顺序:
processReReadFiles(重读文件)
↓
processReReadTables(重读表)
↓
getFileList(断点续传扫描)
↓
按 fileDate 分组逐文件推送
↓
每组推完后立即更新断点时间二、三种断点(续传)方式
2.1 断点续传(普通模式)
触发条件:正常调度执行
依赖表:bus_push_ftp_readdate(字段:nodeid、readdate)
| 场景 | 行为 |
|---|---|
| 无断点记录 | 自动初始化断点为当天,写入 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(字段:id、nodeid、filepath、readdate、readflag)
有两种子模式:
按文件夹粒度重读(填写 readdate)
| 字段 | 示例值 | 说明 |
|---|---|---|
readdate |
2026-04-26 或 20260426 |
指定要重读的日期(两种格式均兼容) |
readflag |
1 |
标记需要重读 |
执行逻辑:
- 将
readdate转换为yyyyMMdd(如20260426) - 扫描 FTP rootpath,匹配名称以
_20260426结尾的所有文件夹 - 文件夹内须包含
.log文件,表示上传已完成,否则跳过 - 遍历文件夹内所有
.txt文件,已读文件先删除readfile标记再下载 - 下载成功后直接调用
callClient推送 - 推送成功后将该记录
readflag置为0(updateReadfileFlag)
2.3 重读表(指定表名重读)
触发条件:bus_push_ftp_readtable_flag 表中存在 readflag=1 的记录
依赖表:bus_push_ftp_readtable_flag(字段:id、nodeid、tablename、readdate、readflag)
| 字段 | 示例值 | 说明 |
|---|---|---|
tablename |
test_db |
要重读的表名 |
readdate |
2026-04-26 或 20260426 |
指定要重读的日期(两种格式均兼容) |
readflag |
1 |
标记需要重读 |
执行逻辑:
- 将
readdate转换为yyyyMMdd - 扫描 FTP rootpath,匹配名称以
_yyyyMMdd结尾的文件夹 - 文件夹内须包含
.log文件,表示上传已完成,否则跳过 - 过滤文件夹内以
tablename_开头的.txt文件(如test_db_delete_20260426.txt、test_db_insert_20260426.txt) - 已读文件先删除
readfile标记再下载 - 下载成功后直接调用
callClient推送 - 推送成功后将该记录
readflag置为0(updateReadtableFlag)
三、readdate 日期格式说明
| 字段所在表 | 字段名 | 存储格式 | 读取时兼容格式 |
|---|---|---|---|
bus_push_ftp_readdate |
readdate |
yyyy-MM-dd(如 2026-04-29) |
yyyy-MM-dd 或 yyyyMMdd |
bus_push_ftp_readfile_flag |
readdate |
yyyy-MM-dd(如 2026-04-29) |
yyyy-MM-dd 或 yyyyMMdd |
bus_push_ftp_readtable_flag |
readdate |
yyyy-MM-dd(如 2026-04-29) |
yyyy-MM-dd 或 yyyyMMdd |
存储规范:所有写入操作(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-dd 和 yyyyMMdd 两种格式)。
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-dd 或 yyyyMMdd |
readflag |
INT | 1=需要重读,0=已完成 |
使用方式:
- 文件夹重读:填写
nodeid、readdate,readflag=1 readflag=0的记录在下次查询时自动清除(getReadfileFlag中执行 delete)
bus_push_ftp_readtable_flag(重读表标志)
| 字段 | 类型 | 说明 |
|---|---|---|
id |
INT | 主键 |
nodeid |
VARCHAR | 节点ID |
tablename |
VARCHAR | 要重读的表名,如 test_db |
readdate |
VARCHAR | 日期,支持 yyyy-MM-dd 或 yyyyMMdd |
readflag |
INT | 1=需要重读,0=已完成 |
使用方式:填写 nodeid、tablename、readdate,readflag=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 |
协议类型 | ftp 或 sftp |
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 作者:周风磊