Markdown Converter
Agent skill for markdown-converter
- **名称**:Addax
Sign in to like and favorite skills
在与用户讨论 / 理解需求时,应优先按以下抽象模型理解:
Job(作业)
Task(子任务)
TaskGroup
Reader → Channel → Writer 流水线Reader 插件
Writer 插件
Transformer(数据转换)
dx_substr / dx_pad / dx_replace / dx_filter / dx_groovyChannel(通道)
整体框架:Framework + 插件(Reader / Writer / Transformer)
数据通路(简化):
作业生命周期(JobContainer 内部):
preHandler() – 作业前置处理init() – 初始化 reader/writer 插件prepare() – 源端和目标端的准备工作split() – 按并发度拆分成多个 Taskschedule() – 将 Task 组织为 TaskGroup,并发执行post() – 全局后置收尾(如 rename 影子表)postHandler() – 作业后置处理Task 执行:
Reader → Channel → Writer 的线程模型执行Job JSON 顶层结构:
{ "job": { "settings": {}, "content": { "reader": {}, "writer": {}, "transformer": [] } } }
job.settings
speed.byte:每秒允许的最大字节数(Bps),-1 表示不限制speed.record:每秒允许的最大记录数speed.channel:通道数(影响 Task 数量)errorLimit.record:允许错误记录总数errorLimit.percentage:允许错误记录占比job.content.reader
{ "name": "mysqlreader", "parameter": { "username": "", "password": "", "column": [], "autoPk": false, "splitPk": "", "connection": [ { "jdbcUrl": [], "table": [] } ], "where": "" } }
job.content.writer
{ "name": "mysqlwriter", "parameter": { "username": "", "password": "", "writeMode": "", "column": [], "session": [], "preSql": [], "postSql": [], "connection": [ { "jdbcUrl": "", "table": [] } ] } }
job.content.transformer
{ "transformer": [ { "name": "dx_substr", "parameter": { "idx": 1, "pos": 0, "length": 3 } } ] }
AI 在阅读/生成 Job 时,应显式区分:
job.settings.speed.channel = Nsplit() 按源端特性拆成若干 Task(如按分表、分片、主键范围等)split() 需与 Reader 的 Task 数量 1:1 对齐taskGroup.channel(conf/core.json 中配置)决定 TaskGroup 数量:
taskGroupCount = speed.channel / taskGroup.channelspeed.channelsplitPk / 分区表)Addax 在数据质量方面的关键点:
类型不丢失/不失真
Long / Double / String / Date / Timestamp / Bool / Bytes错误控制
errorLimit.record 和 errorLimit.percentage 控制“可容忍错误”脏数据(Dirty Data)
AI 在帮助用户排错时:
errorLimit,在保障数据质量和任务稳定之间平衡运行时环境
三种典型使用方式
1)Docker 运行示例:
docker pull quay.io/wgzhao/addax:latest docker run -ti --rm --name addax \ quay.io/wgzhao/addax:latest \ /opt/addax/bin/addax.sh /opt/addax/job/job.json
2)一键安装脚本(Linux / macOS):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/wgzhao/Addax/master/install.sh)"
/usr/local/addax/opt/addax3)源码编译:
git clone https://github.com/wgzhao/addax.git cd addax mvn clean package mvn package -Pdistribution # 或 assembly:single # 产出目录示例:target/addax-<version>
bin/addax.sh job/job.json
基本用法:
bin/addax.sh <job_file> [options]
关键参数(AI 在给终端命令建议时要正确使用):
-h, --help:帮助-v, --version:版本-l, --log:指定日志文件路径-d, --debug:开启调试模式(IDEA 远程调试会用到)-L, --log-level:DEBUG | INFO | WARN | ERROR-j, --jvm:追加 JVM 参数-p, --params:向 Job 传入动态参数(-Dkey=value 形式)示例(动态参数):
bin/addax.sh job/test.json \ -p "-Dusername=root -Dpassword=123456 -Dparam1=value1 -Dparam2=value2"
Job JSON 中可以通过
${param} 访问这些值,比如 ${username}。
内置时间变量(示例时间
2025-07-16 12:13:14):
${curr_date_short} → 20250716${curr_date_dash} → 2025-07-16${curr_datetime_short} → 20250716121314${curr_datetime_dash} → 2025-07-16 12:13:14${biz_date_short} / ${biz_date_dash} / ${biz_datetime_*} 等core/src/main/bin/addax-server.sh启动示例:
./addax-server.sh start # 默认并发上限 30 ./addax-server.sh start -p 50 --daemon # 最大并发 50,后台运行 ./addax-server.sh stop
并发配置优先级:
-p / --parallelADDAX_SERVER_PARALLELHTTP 接口:
1)提交任务
/api/submit?k1=v1&k2=v2示例:
curl 'http://localhost:10601/api/submit?jobName=example-job' \ -H 'Content-Type: application/json' \ -d @job/job.json
响应:
{ "taskId": "xxxx-xxxx-xxxx" }
或并发达到上限时:
{ "error": "ERROR: Maximum number of concurrent tasks reached." }
2)查询任务状态
/api/status?taskId={taskId}{ "taskId": "xxxx-xxxx-xxxx", "status": "SUCCESS", "result": "Job example-job executed.", "error": null }
AI 在设计自动化系统(如调度、工作流)时,可建议用户使用 Server 模块通过 HTTP 集成。
Reader / Writer 插件覆盖的常见系统包括但不限于:
当用户问“是否支持 XXX 数据源”时,应:
xxxreader/xxxwriterplugin.json 描述 + 若干 jar 依赖Reader 或 Writer 抽象类Job 和 Task${ADDAX_HOME}/plugin ├── reader │ └── <plugin_name> │ ├── <plugin_name>-<version>.jar │ ├── libs/ -> 指向 shared 依赖目录的符号链接 │ ├── plugin.json │ └── plugin_job_template.json └── writer └── ...
plugin.json 示例:
{ "name": "mysqlwriter", "class": "com.wgzhao.addax.plugin.writer.mysqlwriter.MysqlWriter", "description": "Use Jdbc connect to database, execute insert sql.", "developer": "wgzhao" }
注意:
plugin.json 中的 name 一致name 找插件,通过 class(完全限定名)反射加载以 Reader 为例:
public class SomeReader extends Reader { public static class Job extends Reader.Job { public void init() { } public void prepare() { } public List<Configuration> split(int adviceNumber) { return null; } public void post() { } public void destroy() { } } public static class Task extends Reader.Task { public void init() { } public void prepare() { } public void startRead(RecordSender recordSender) { } public void post() { } public void destroy() { } } }
Job 级别:
super.getPluginJobConf()split(adviceNumber):按并发建议数拆分 Configuration 列表(每个对应一个 Task)Task 级别:
super.getPluginJobConf() 获取本 Task 的配置startRead() / startWrite() 中进行实际 I/ORecordSender / RecordReceiver 和 Record/Column 抽象进行传输重要约束:
prepare / post 在 Job 和 Task 层都有,需根据场景选择合适层级实现Addax 提供
Configuration 类和路径 DSL 来读取 JSON 配置:
a.b.ca.f[2].g{ "a": { "b": { "c": 2 }, "f": [1, 2, { "g": true }] }, "x": 4 }
x → 4a.b.c → 2a.b.f[2].g → trueAI 在帮用户写插件代码时,可直接给出
Configuration.get("a.b.c") 等示例。
bin/addax.sh -d job/job.json
Listening for transport dt_socket at address: 9999 形式暴露 JVM 调试端口本地调试典型配置:
com.wgzhao.addax.core.Engine-Daddax.home=/opt/app/addax/4.0.3-classpath .:/opt/app/addax/4.0.3/lib/*-job job/job.json/opt/app/addax/4.0.3Addax 会在日志中输出类似:
Total 1000000 records, 22000000 bytes | Transform 100000 records(in), 10000 records(out) | Speed 2.10MB/s, 100000 records/s | Error 0 records, 0 bytes | Percentage 100.00%
以及最终汇总:
任务启动时刻 : 2015-03-10 17:34:21 任务结束时刻 : 2015-03-10 17:34:31 任务总计耗时 : 10s 任务平均流量 : 2.10MB/s 记录写入速度 : 100000rec/s 转换输入总数 : 1000000 转换输出总数 : 1000000 读取出记录总数 : 1000000 同步失败总数 : 0
Transformer 维度统计:
AI 在分析性能问题 / 瓶颈时,应从:
$ADDAX_HOME/conf/core.json → core.server.address示例:
{ "core": { "server": { "address": "http://localhost:9090/api/v1/addax/jobReport", "timeout": 5 } } }
上报数据结构(JSON):
{ "jobName": "test", "startTimeStamp": 1587971621, "endTimeStamp": 1587971621, "totalCosts": 10, "totalBytes": 330, "byteSpeedPerSecond": 33, "recordSpeedPerSecond": 1, "totalReadRecords": 6, "totalErrorRecords": 0, "jobContent": { "配置内容省略": "此处为实际任务配置" } }
AI 可建议用户:
addax-admin(后端)
https://github.com/wgzhao/addax-adminaddax-ui(前端)
https://github.com/wgzhao/addax-uiAI 在回答“有没有 Web 管理界面 / 调度平台”时,可推荐这两个项目。
版本规范:遵循 SemVer (
x.y.z)
z Patch:兼容修复、性能优化y Minor:新增特性或兼容性风险较小的修改x Major:重大变更,通常不向后兼容开发规范(概略)
AddaxException,并区分错误类型AI 在生成 PR/代码建议时,应尽量贴合以上风格。