Skip to content

Stream Reader

Stream Reader 是一个从内存读取数据的插件, 他主要用来快速生成期望的数据并对写入插件进行测试

一个完整的 StreamReader 配置文件如下:

json
{
  "reader": {
    "name": "streamreader",
    "parameter": {
      "column": [
        {
          "value": "unique_id",
          "type": "string"
        },
        {
          "value": "1989-06-04 08:12:13",
          "type": "date",
          "dateFormat": "yyyy-MM-dd HH:mm:ss"
        },
        {
          "value": 1984,
          "type": "long"
        },
        {
          "value": 1989.64,
          "type": "double"
        },
        {
          "value": true,
          "type": "bool"
        },
        {
          "value": "a long text",
          "type": "bytes"
        }
      ],
      "sliceRecordCount": 10
    }
  }
}

上述配置文件将会生成 10条记录(假定channel为1),每条记录的内容如下:

unique_id,'1989-06-04 08:12:13',1984,1989.64,true,'a long text'

目前 StreamReader 支持的输出数据类型全部列在上面,分别是:

  • string 字符类型
  • date 日期类型
  • long 所有整型类型
  • double 所有浮点数
  • bool 布尔类型
  • bytes 字节类型

其中 date 类型还支持 dateFormat 配置,用来指定输入的日期的格式,默认为 yyyy-MM-dd HH:mm:ss。比如你的输入可以这样:

json
{
  "value": "1989/06/04 12:13:14",
  "type": "date",
  "dateFormat": "yyyy/MM/dd HH:mm:ss"
}

注意,日期类型不管输入是何种格式,内部都转为 yyyy-MM-dd HH:mm:ss 格式。

日期格式中的小时请使用 HH(24 小时制)。hh 表示 12 小时制的小时,如果格式中没有 AM/PM 标记就无法确定具体时刻,插件会在作业启动时直接报错,提示改用 HH

StreamReader 还支持随机输入功能,比如我们要随机得到0-10之间的任意一个整数,我们可以这样配置列:

json
{
  "random": "0,10",
  "type": "long"
}

获得一个 0 至 100 之间的随机浮点数,可以这样配置:

json
{
  "random": "0,100",
  "type": "double"
}

如果要指定浮点数的小数位数,比如指定小数位为2位,则可以这样设定

json
{
  "random": "0,100,2",
  "type": "double"
}

注意: 并不能保证每次生成的小数恰好是2位,如果小数为数为0 ,则小数位数会少于指定的位数。

这里使用 random 这个关键字来表示其值为随机值,其值的范围为左右闭区间。

其他类型的随机类型配置如下:

  • long: random 0, 10 0到10之间的随机数字
  • string: random 0, 10 0到 10 长度之间的随机字符串
  • bool: random 0, 10 false 和 true出现的比率
  • double: random 0, 10 0到10之间的随机浮点数
  • double: random 0, 10, 2 0到10之间的随机浮点数,小数位为2位
  • date: random '2014-07-07 00:00:00', '2016-07-07 00:00:00' 开始时间->结束时间之间的随机时间,日期格式默认(不支持逗号)yyyy-MM-dd HH:mm:ss
  • BYTES: random 0, 10 0到10长度之间的随机字符串获取其UTF-8编码的二进制串

StreamReader 还支持递增函数,比如我们要得到一个从1开始,每次加5的等差数列,可以这样配置:

json
{
  "incr": "1,5",
  "type": "long"
}

如果需要获得一个递减的数列,则把第二个参数的步长(上例中的5)改为负数即可。步长默认值为1。

递增还支持日期类型( 4.0.1 版本引入),比如下面的配置:

json
{
  "incr": "1989-06-04 09:01:02,2,d",
  "type": "date"
}

incr 由三部分组成,分别是开始日期,步长以及步长单位,中间用英文逗号(,)分隔。

  • 开始日期:正确的日期字符串,默认格式为 yyyy-MM-dd HH:mm:ss,如果时间格式不同,则需要配置 dateFormat 来指定日期格式,这是必填项
  • 步长:每次需要增加的长度,默认为1,如果希望是递减,则填写负数,这是可选项
  • 步长单位:按什么时间单位进行递增/递减,默认为按天(day),这是可选项,可选的单位有
    • d/day
    • M/month
    • y/year
    • h/hour
    • m/minute
    • s/second
    • w/week

配置项 sliceRecordCount 用来指定要生成的数据条数,如果指定的 channel,则实际生成的记录数为 sliceRecordCount * channel

内置数据规则

除了按类型生成常量、随机值和递增数列,StreamReader 还可以按业务规则直接生成贴近真实数据的数据,比如身份证号码、银行卡号、地址、公司名称等。这类列使用 rule 配置项来指定规则,无需配置 value,例如:

json
{
  "rule": "idCard"
}

一个包含全部规则的完整示例:

json
{
  "job": {
    "setting": {
      "speed": {
        "byte": -1,
        "channel": 1
      },
      "errorLimit": {
        "record": 0,
        "percentage": 0.02
      }
    },
    "content": {
      "reader": {
        "name": "streamreader",
        "parameter": {
          "column": [
            {
              "value": "1,100,2",
              "rule": "random",
              "type": "double"
            },
            {
              "value": "Addax",
              "type": "string"
            },
            {
              "value": "1",
              "rule": "incr",
              "type": "long"
            },
            {
              "value": "1989/06/04 00:00:01,-1",
              "rule": "incr",
              "type": "date",
              "dateFormat": "yyyy/MM/dd HH:mm:ss"
            },
            {
              "value": "test",
              "type": "bytes"
            },
            {
              "rule": "address"
            },
            {
              "rule": "bank"
            },
            {
              "rule": "company"
            },
            {
              "rule": "creditCard"
            },
            {
              "rule": "debitCard"
            },
            {
              "rule": "idCard"
            },
            {
              "rule": "lat"
            },
            {
              "rule": "lng"
            },
            {
              "rule": "name"
            },
            {
              "rule": "job"
            },
            {
              "rule": "phone"
            },
            {
              "rule": "stockCode"
            },
            {
              "rule": "stockAccount"
            }
          ],
          "sliceRecordCount": 10
        }
      },
      "writer": {
        "name": "streamwriter",
        "parameter": {
          "print": true,
          "encoding": "UTF-8"
        }
      }
    }
  }
}

执行该任务,输出结果类似如下:

txt
$ bin/addax.sh job/streamreader-rules.json

  ___      _     _            
 / _ \    | |   | |           
/ /_\ \ __| | __| | __ ___  __
|  _  |/ _` |/ _` |/ _` \ \/ /
| | | | (_| | (_| | (_| |>  < 
\_| |_/\__,_|\__,_|\__,_/_/\_\
:: Addax version ::    (v6.0.14-SNAPSHOT)
2026-09-13 14:17:39.640 [        main] INFO  Engine               - 
{
	"setting":{
		"speed":{
			"byte":-1,
			"channel":1
		},
		"errorLimit":{
			"record":0,
			"percentage":0.02
		}
	},
	"content":{
		"reader":{
			"name":"streamreader",
			"parameter":{
				"column":[
					{
						"value":"1,100,2",
						"rule":"random",
						"type":"double"
					},
					{
						"value":"Addax",
						"type":"string"
					},
					{
						"value":"1",
						"rule":"incr",
						"type":"long"
					},
					{
						"value":"1989/06/04 00:00:01,-1",
						"rule":"incr",
						"type":"date",
						"dateFormat":"yyyy/MM/dd HH:mm:ss"
					},
					{
						"value":"test",
						"type":"bytes"
					},
					{
						"rule":"address"
					},
					{
						"rule":"bank"
					},
					{
						"rule":"company"
					},
					{
						"rule":"creditCard"
					},
					{
						"rule":"debitCard"
					},
					{
						"rule":"idCard"
					},
					{
						"rule":"lat"
					},
					{
						"rule":"lng"
					},
					{
						"rule":"name"
					},
					{
						"rule":"job"
					},
					{
						"rule":"phone"
					},
					{
						"rule":"stockCode"
					},
					{
						"rule":"stockAccount"
					}
				],
				"sliceRecordCount":10
			}
		},
		"writer":{
			"name":"streamwriter",
			"parameter":{
				"print":true,
				"encoding":"UTF-8"
			}
		}
	}
}

2026-09-13 14:17:39.650 [        main] INFO  JobContainer         - The jobContainer begins to process the job.
2026-09-13 14:17:39.657 [       job-0] INFO  JobContainer         - The Reader.Job [streamreader] perform prepare work .
2026-09-13 14:17:39.657 [       job-0] INFO  JobContainer         - The Writer.Job [streamwriter] perform prepare work .
2026-09-13 14:17:39.657 [       job-0] INFO  JobContainer         - Job set Channel-Number to 1 channel(s).
2026-09-13 14:17:39.657 [       job-0] INFO  JobContainer         - The Reader.Job [streamreader] is divided into [1] task(s).
2026-09-13 14:17:39.657 [       job-0] INFO  JobContainer         - The Writer.Job [streamwriter] is divided into [1] task(s).
2026-09-13 14:17:39.666 [       job-0] INFO  JobContainer         - The Scheduler launches [1] taskGroup(s).
2026-09-13 14:17:39.668 [ taskGroup-0] INFO  TaskGroupContainer   - The taskGroupId=[0] started [1] channels for [1] tasks.
2026-09-13 14:17:39.670 [ taskGroup-0] INFO  Channel              - The Channel set byte_speed_limit to -1, No bps activated.
2026-09-13 14:17:39.670 [ taskGroup-0] INFO  Channel              - The Channel set record_speed_limit to -1, No tps activated.
98.27	Addax	1	1989-06-04 00:00:01	0x74657374	宁夏回族自治区邯郸市龙潭区新华路249号	阳泉商行	九方房地产集团有限公司	4096678316310982	6217252221144286715	421126196801114274	-3.3966765	-151.6848752	狄红	安防主管	13538523906	008224	8680205898
81.33	Addax	2	1989-06-03 00:00:01	0x74657374	西藏自治区昆明县山亭区韶山街102号	盛京银行	联软办公有限合伙企业	6223473408795921	6213428525497728769	420117193803291935	45.4005918	126.2302139	芦萍	西点师	13420192359	836128	3569253894
28.62	Addax	3	1989-06-02 00:00:01	0x74657374	河南省兴安盟市海港区永联街265号	乌海银行	兰金电子餐饮有限公司	6227593032063763	6212939436209713059	320115200704155336	-37.3717424	83.8123369	孙林	列车/地铁车长	13077891026	883280	5750169522
7.38	Addax	4	1989-06-01 00:00:01	0x74657374	北京市淮安县六枝特区白山路5号	张家口商行	昊嘉文化有限合伙企业	6283121239374080	6235866437693714523	530802196306243564	-81.0485543	-176.9651246	勾玉	锅炉工程师/技师	15088018035	164106	2892469333
27.8	Addax	5	1989-05-31 00:00:01	0x74657374	香港特别行政区太原县平山区黄河街214号	承德银行	精芯机械中外合作有限公司	6259058913047415	6235868387408215337	320305197301266078	-30.3777802	73.0269088	巫凯	印刷排版/制版	19140432084	400570	1119544796
71.41	Addax	6	1989-05-30 00:00:01	0x74657374	河北省辛集市怀柔区碧海路50号	晋城商行	恩悌网络股份有限公司	6259075791345102	6213330694668956477	350582200507135392	54.4136463	62.497184	沙海燕	化验员	15899573264	405982	1551956384
42.79	Addax	7	1989-05-29 00:00:01	0x74657374	湖北省拉萨市梁平区白云街80号	中国建设银行	兰金电子餐饮集团	3568353959366817	6230407263361590072	520121193407021739	-36.5783856	-23.1595399	唐磊	CNC工程师	15762242326	031212	4222388439
89.21	Addax	8	1989-05-28 00:00:01	0x74657374	山东省长春县华龙区解放路239号	民生银行	MBP软件物流股份有限公司	6227539162714957	6213423889811345807	450107193805289620	59.4473891	126.722241	荆秀芳	瘦身顾问	14533489851	685121	2386678456
77.44	Addax	9	1989-05-27 00:00:01	0x74657374	广西壮族自治区合肥市普陀区光明路137号	天津银行	天开信息中外合作有限公司	6259068931268261	6200618145417973849	441600199110099977	70.7287609	143.8947897	滕雪梅	公共卫生/疾病控制	15030051423	682375	4332730599
1.67	Addax	10	1989-05-26 00:00:01	0x74657374	江西省惠州市双滦区七星路155号	中国银行	襄樊地球村信息技术有限公司	5477660282898100	6212939142939212015	130522195402117955	-12.8224904	175.018515	强杨	财务分析经理/主管	13046686503	029874	5578465632
2026-09-13 14:17:42.674 [       job-0] INFO  AbstractScheduler    - The scheduler has completed all tasks.
2026-09-13 14:17:42.676 [       job-0] INFO  JobContainer         - The Writer.Job [streamwriter] perform post work.
2026-09-13 14:17:42.677 [       job-0] INFO  JobContainer         - The Reader.Job [streamreader] perform post work.
2026-09-13 14:17:42.689 [       job-0] INFO  StandAloneJobContainerCommunicator - Total 10 records, 1715 bytes | Speed 571B/s, 3 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 0.000s |  All Task WaitReaderTime 0.010s | Percentage 100.00%
2026-09-13 14:17:42.690 [       job-0] INFO  JobContainer         - 
Job start  at             : 2026-09-13 14:17:39
Job end    at             : 2026-09-13 14:17:42
Job took secs             :                  3s
Total   bytes             :                1715
Average   bps             :              571B/s
Average   rps             :              3rec/s
Number of rec             :                  10
Failed record             :                   0

当前内置的规则如下:

规则名称含义示例数据类型说明
address随机生成一条基本满足国内实际情况的地址信息辽宁省兰州市徐汇区东山街176号string
bank随机生成一个国内银行名称华夏银行string
company随机生成一个公司的名称万迅电脑科技有限公司string
creditCard随机生成一个信用卡卡号6227544006180760string16 位
debitCard随机生成一个储蓄卡卡号6216695638260308313string19 位
email随机生成一个电子邮件地址[email protected]string
idCard随机生成一个国内身份证号码350600198508222018string18 位,符合校验规则,头 6 位编码满足行政区划要求
job随机生成一个国内岗位名称系统工程师string数据来源于招聘网站
lat随机生成纬度数据48.6648764double固定 7 位小数,也可以用 latitude 表示
lng随机生成经度数据120.6018163double固定 7 位小数,也可以使用 longitude 表示
name随机生成一个国内名字池浩string暂没考虑姓氏在国内的占比度
phone随机生成一个国内手机号码15292600492string暂不考虑虚拟手机号
stockAccount随机生成一个 10 位的股票交易账户0692522928string完全随机,不满足账户规范
stockCode随机生成一个 6 位的股票代码687461string前两位满足国内股票代码编号规范
uuid随机生成一个 UUID 字符串bc1cf125-929b-43b7-b324-d7c4cc5a75d2string
zipCode随机生成一个国内邮政编号411105long6 位数字,不完全满足国内邮政编号规范

规则名称不区分大小写,也不区分下划线和横线,因此 idCardid_cardID_CARD 是同一条规则。

关于规则的几点说明:

  • 规则的数据类型是固定的,无法通过 type 修改;如果配置的 type 与规则的类型不一致,作业会在启动时直接报错
  • 数据由规则自己生成,配置的 value 会被忽略,并给出告警

rule 配置项

rule 除了上面这些内置规则,还支持 constantrandomincr 三种通用规则,它们的参数写在 value 中,含义与本文档前面介绍的配置项完全一致:

json
{ "rule": "constant", "value": "addax", "type": "string" }
{ "rule": "random", "value": "1,10", "type": "long" }
{ "rule": "incr", "value": "1,5", "type": "long" }
{ "rule": "incr", "value": "1989-06-04 09:01:02,2,d", "type": "date" }

也就是说,{"random": "1,10"}{"rule": "random", "value": "1,10"} 等价,{"incr": "1,5"}{"rule": "incr", "value": "1,5"} 等价。两种写法都支持,同一列同时配置 rulerandom/incr 时以 rule 为准,被忽略的配置会有告警。

从 datareader 迁移

datareader 插件已合并到 StreamReader:它的内置规则(身份证、银行卡、地址等)现在由 StreamReader 提供,原先用于造数据的 datareader 插件不再单独发布。

迁移时只需要把作业配置中的插件名改掉,列的配置无需修改:

json
{
  "reader": {
    "name": "streamreader",
    "parameter": {
      "column": [
        { "rule": "idCard" }
      ],
      "sliceRecordCount": 10
    }
  }
}

如果列配置中使用了 hh 这样的 12 小时制日期格式,需要一并改成 HH