正在显示
9 个修改的文件
包含
328 行增加
和
120 行删除
1 | ### dw example 使用手册 | 1 | ### dw example 使用手册 |
2 | 2 | ||
3 | +数据格式 | ||
4 | +--- | ||
5 | + - `OBJ`:传统的JSON格式,返回数组包含严格的 key:value | ||
6 | + | ||
7 | + - `SL`:修剪过的JSON格式,字段名称和字段值分别分开存储在不同数组种 | ||
8 | + ``` | ||
9 | + { | ||
10 | + "headData": [ | ||
11 | + "currency_id", | ||
12 | + "currency_code", | ||
13 | + "currency_name" | ||
14 | + ] | ||
15 | + }, | ||
16 | + "columnDataList": [ | ||
17 | + [ | ||
18 | + 14186, | ||
19 | + "USD", | ||
20 | + "美元" | ||
21 | + ], | ||
22 | + [ | ||
23 | + 14187, | ||
24 | + "USD", | ||
25 | + "美元" | ||
26 | + ], | ||
27 | + ... | ||
28 | + ] | ||
29 | + } | ||
30 | + ``` | ||
31 | + 因为SL格式每次数据交互只序列化一次key,和传统的JSON结构相比。生成的JSON字符串长度会缩小20% ~ 40%, | ||
32 | + 但相对的比较难解析,可以在`DwParamVo`中指定格式。 | ||
33 | + | ||
34 | + | ||
3 | 修改配置文件 | 35 | 修改配置文件 |
4 | --- | 36 | --- |
5 | 修改 application.yml 的 `dwAppId`、 `dwAppSecret` 配置 | 37 | 修改 application.yml 的 `dwAppId`、 `dwAppSecret` 配置 |
@@ -15,5 +15,5 @@ public interface DwApi { | @@ -15,5 +15,5 @@ public interface DwApi { | ||
15 | /** | 15 | /** |
16 | * FBA-库存快照 | 16 | * FBA-库存快照 |
17 | */ | 17 | */ |
18 | - String FBA_FULFILLMENT_CURRENT_INVENTORY_VIEW_API = "/stock/fba_fulfillment_current_inventory_view"; | 18 | + String FULFILLMENT_CURRENT_INVENTORY = "/stock/fulfillment_current_inventory"; |
19 | } | 19 | } |
1 | -package com.aukey.example.entity; | ||
2 | - | ||
3 | -/** | ||
4 | - * @author: wgf | ||
5 | - * @create: 2020-05-19 17:18 | ||
6 | - * @description: | ||
7 | - **/ | ||
8 | -public class FbaFulfillmentCurrentInventoryView { | ||
9 | - private String corporationName; | ||
10 | - private String groupCode; | ||
11 | - private String groupName; | ||
12 | - private String deptCode; | ||
13 | - private String deptName; | ||
14 | - private String companySku; | ||
15 | - private String amazonSku; | ||
16 | - private String fnsku; | ||
17 | - | ||
18 | - /** | ||
19 | - * ...... | ||
20 | - * more field | ||
21 | - */ | ||
22 | - | ||
23 | - public String getCorporationName() { | ||
24 | - return corporationName; | ||
25 | - } | ||
26 | - | ||
27 | - public void setCorporationName(String corporationName) { | ||
28 | - this.corporationName = corporationName; | ||
29 | - } | ||
30 | - | ||
31 | - public String getGroupCode() { | ||
32 | - return groupCode; | ||
33 | - } | ||
34 | - | ||
35 | - public void setGroupCode(String groupCode) { | ||
36 | - this.groupCode = groupCode; | ||
37 | - } | ||
38 | - | ||
39 | - public String getGroupName() { | ||
40 | - return groupName; | ||
41 | - } | ||
42 | - | ||
43 | - public void setGroupName(String groupName) { | ||
44 | - this.groupName = groupName; | ||
45 | - } | ||
46 | - | ||
47 | - public String getDeptCode() { | ||
48 | - return deptCode; | ||
49 | - } | ||
50 | - | ||
51 | - public void setDeptCode(String deptCode) { | ||
52 | - this.deptCode = deptCode; | ||
53 | - } | ||
54 | - | ||
55 | - public String getDeptName() { | ||
56 | - return deptName; | ||
57 | - } | ||
58 | - | ||
59 | - public void setDeptName(String deptName) { | ||
60 | - this.deptName = deptName; | ||
61 | - } | ||
62 | - | ||
63 | - public String getCompanySku() { | ||
64 | - return companySku; | ||
65 | - } | ||
66 | - | ||
67 | - public void setCompanySku(String companySku) { | ||
68 | - this.companySku = companySku; | ||
69 | - } | ||
70 | - | ||
71 | - public String getAmazonSku() { | ||
72 | - return amazonSku; | ||
73 | - } | ||
74 | - | ||
75 | - public void setAmazonSku(String amazonSku) { | ||
76 | - this.amazonSku = amazonSku; | ||
77 | - } | ||
78 | - | ||
79 | - public String getFnsku() { | ||
80 | - return fnsku; | ||
81 | - } | ||
82 | - | ||
83 | - public void setFnsku(String fnsku) { | ||
84 | - this.fnsku = fnsku; | ||
85 | - } | ||
86 | -} |
1 | +package com.aukey.example.entity; | ||
2 | + | ||
3 | +import java.util.Date; | ||
4 | + | ||
5 | +/** | ||
6 | + * @author: wgf | ||
7 | + * @create: 2020-05-19 17:18 | ||
8 | + * @description: | ||
9 | + **/ | ||
10 | +public class FulfillmentCurrentInventory { | ||
11 | + private Integer id; | ||
12 | + private Integer accountId; | ||
13 | + private String accountName; | ||
14 | + private String siteName; | ||
15 | + private Integer areaId; | ||
16 | + private String area; | ||
17 | + private Date snapshotDate; | ||
18 | + private Date createDate; | ||
19 | + private String fnSku; | ||
20 | + private String amazonSku; | ||
21 | + private String productName; | ||
22 | + | ||
23 | + public Integer getId() { | ||
24 | + return id; | ||
25 | + } | ||
26 | + | ||
27 | + public void setId(Integer id) { | ||
28 | + this.id = id; | ||
29 | + } | ||
30 | + | ||
31 | + public Integer getAccountId() { | ||
32 | + return accountId; | ||
33 | + } | ||
34 | + | ||
35 | + public void setAccountId(Integer accountId) { | ||
36 | + this.accountId = accountId; | ||
37 | + } | ||
38 | + | ||
39 | + public String getAccountName() { | ||
40 | + return accountName; | ||
41 | + } | ||
42 | + | ||
43 | + public void setAccountName(String accountName) { | ||
44 | + this.accountName = accountName; | ||
45 | + } | ||
46 | + | ||
47 | + public String getSiteName() { | ||
48 | + return siteName; | ||
49 | + } | ||
50 | + | ||
51 | + public void setSiteName(String siteName) { | ||
52 | + this.siteName = siteName; | ||
53 | + } | ||
54 | + | ||
55 | + public Integer getAreaId() { | ||
56 | + return areaId; | ||
57 | + } | ||
58 | + | ||
59 | + public void setAreaId(Integer areaId) { | ||
60 | + this.areaId = areaId; | ||
61 | + } | ||
62 | + | ||
63 | + public String getArea() { | ||
64 | + return area; | ||
65 | + } | ||
66 | + | ||
67 | + public void setArea(String area) { | ||
68 | + this.area = area; | ||
69 | + } | ||
70 | + | ||
71 | + public Date getSnapshotDate() { | ||
72 | + return snapshotDate; | ||
73 | + } | ||
74 | + | ||
75 | + public void setSnapshotDate(Date snapshotDate) { | ||
76 | + this.snapshotDate = snapshotDate; | ||
77 | + } | ||
78 | + | ||
79 | + public Date getCreateDate() { | ||
80 | + return createDate; | ||
81 | + } | ||
82 | + | ||
83 | + public void setCreateDate(Date createDate) { | ||
84 | + this.createDate = createDate; | ||
85 | + } | ||
86 | + | ||
87 | + public String getFnSku() { | ||
88 | + return fnSku; | ||
89 | + } | ||
90 | + | ||
91 | + public void setFnSku(String fnSku) { | ||
92 | + this.fnSku = fnSku; | ||
93 | + } | ||
94 | + | ||
95 | + public String getAmazonSku() { | ||
96 | + return amazonSku; | ||
97 | + } | ||
98 | + | ||
99 | + public void setAmazonSku(String amazonSku) { | ||
100 | + this.amazonSku = amazonSku; | ||
101 | + } | ||
102 | + | ||
103 | + public String getProductName() { | ||
104 | + return productName; | ||
105 | + } | ||
106 | + | ||
107 | + public void setProductName(String productName) { | ||
108 | + this.productName = productName; | ||
109 | + } | ||
110 | +} |
1 | package com.aukey.example.util; | 1 | package com.aukey.example.util; |
2 | 2 | ||
3 | import com.alibaba.fastjson.JSON; | 3 | import com.alibaba.fastjson.JSON; |
4 | -import com.alibaba.fastjson.JSONException; | ||
5 | import com.alibaba.fastjson.JSONReader; | 4 | import com.alibaba.fastjson.JSONReader; |
6 | import com.alibaba.fastjson.TypeReference; | 5 | import com.alibaba.fastjson.TypeReference; |
7 | import com.aukey.example.vo.DwParamVo; | 6 | import com.aukey.example.vo.DwParamVo; |
@@ -31,7 +30,7 @@ import java.util.function.Supplier; | @@ -31,7 +30,7 @@ import java.util.function.Supplier; | ||
31 | * @author: wgf | 30 | * @author: wgf |
32 | * @create: 2020-05-13 11:21 | 31 | * @create: 2020-05-13 11:21 |
33 | * @description: dw帮助工具类 | 32 | * @description: dw帮助工具类 |
34 | - * | 33 | + * <p> |
35 | * 关于 java url 编码问题 | 34 | * 关于 java url 编码问题 |
36 | * Java官方的URLEncoder.encode 实际上是为了post请求的content-type为x-www-form-urlencoded来设计的 | 35 | * Java官方的URLEncoder.encode 实际上是为了post请求的content-type为x-www-form-urlencoded来设计的 |
37 | * 在进行特殊参数转义的时候会将空格转为 + | 36 | * 在进行特殊参数转义的时候会将空格转为 + |
@@ -268,14 +267,9 @@ public class DwHelperUtil { | @@ -268,14 +267,9 @@ public class DwHelperUtil { | ||
268 | jsonReader.startArray(); | 267 | jsonReader.startArray(); |
269 | 268 | ||
270 | while (jsonReader.hasNext()) { | 269 | while (jsonReader.hasNext()) { |
271 | - try { | ||
272 | T t = constructor.get(); | 270 | T t = constructor.get(); |
273 | jsonReader.readObject(t); | 271 | jsonReader.readObject(t); |
274 | container.add(t); | 272 | container.add(t); |
275 | - } catch (JSONException ex) { | ||
276 | - Object o = jsonReader.readObject(); | ||
277 | - log.info("json数据转换异常:{}", o.toString()); | ||
278 | - } | ||
279 | 273 | ||
280 | if (container.size() == batchSize) { | 274 | if (container.size() == batchSize) { |
281 | callback.accept(container); | 275 | callback.accept(container); |
@@ -292,14 +286,16 @@ public class DwHelperUtil { | @@ -292,14 +286,16 @@ public class DwHelperUtil { | ||
292 | log.info("{} 流式读取已读条数:{}", dwDataApi, total); | 286 | log.info("{} 流式读取已读条数:{}", dwDataApi, total); |
293 | container.clear(); | 287 | container.clear(); |
294 | } | 288 | } |
295 | - | ||
296 | - //结束读取 | ||
297 | - jsonReader.endArray(); | ||
298 | } else { | 289 | } else { |
299 | log.info("流式读取异常 [ url:{} ] [ code:{} ]", dwDataApi, response.code()); | 290 | log.info("流式读取异常 [ url:{} ] [ code:{} ]", dwDataApi, response.code()); |
300 | } | 291 | } |
301 | - | 292 | + } catch (Exception e) { |
293 | + log.error(e.getMessage(), e); | ||
294 | + throw e; | ||
302 | } finally { | 295 | } finally { |
296 | + //结束读取 | ||
297 | + jsonReader.endArray(); | ||
298 | + | ||
303 | if (Objects.nonNull(jsonReader)) { | 299 | if (Objects.nonNull(jsonReader)) { |
304 | jsonReader.close(); | 300 | jsonReader.close(); |
305 | } | 301 | } |
@@ -321,8 +317,9 @@ public class DwHelperUtil { | @@ -321,8 +317,9 @@ public class DwHelperUtil { | ||
321 | 317 | ||
322 | protected static Response executeHttpPostRequest(String url, Map<String, Object> paramMap) throws Exception { | 318 | protected static Response executeHttpPostRequest(String url, Map<String, Object> paramMap) throws Exception { |
323 | OkHttpClient client = new OkHttpClient.Builder() | 319 | OkHttpClient client = new OkHttpClient.Builder() |
324 | - .connectTimeout(60 * 30 * 2, TimeUnit.SECONDS) | ||
325 | - .readTimeout(60 * 1, TimeUnit.SECONDS) | 320 | + .connectTimeout(60 * 60 * 2, TimeUnit.SECONDS) |
321 | + .writeTimeout(60 * 2, TimeUnit.SECONDS) | ||
322 | + .readTimeout(60 * 2, TimeUnit.SECONDS) | ||
326 | .build(); | 323 | .build(); |
327 | 324 | ||
328 | url = jointUrl(url, paramMap); | 325 | url = jointUrl(url, paramMap); |
@@ -11,9 +11,10 @@ import java.util.List; | @@ -11,9 +11,10 @@ import java.util.List; | ||
11 | * | 11 | * |
12 | * @author 吴耿锋 | 12 | * @author 吴耿锋 |
13 | * @version 2018年5月11日 | 13 | * @version 2018年5月11日 |
14 | + * 对应 OBJ 返回数据类型 | ||
14 | */ | 15 | */ |
15 | 16 | ||
16 | -public class PageVo<T> implements Serializable { | 17 | +public class ObjVo<T> implements Serializable { |
17 | 18 | ||
18 | 19 | ||
19 | @ApiModelProperty("页数") | 20 | @ApiModelProperty("页数") |
1 | +package com.aukey.example.vo; | ||
2 | + | ||
3 | +import java.util.List; | ||
4 | + | ||
5 | +/** | ||
6 | + * @author: wgf | ||
7 | + * @create: 2020-05-22 15:42 | ||
8 | + * @description: | ||
9 | + **/ | ||
10 | +public class SlNodeVo { | ||
11 | + | ||
12 | + /** | ||
13 | + * 字段名称 | ||
14 | + */ | ||
15 | + private List<String> headData; | ||
16 | + | ||
17 | + /** | ||
18 | + * 数据列表 | ||
19 | + */ | ||
20 | + private List<List<Object>> columnDataList; | ||
21 | + | ||
22 | + public List<List<Object>> getColumnDataList() { | ||
23 | + return columnDataList; | ||
24 | + } | ||
25 | + | ||
26 | + public void setColumnDataList(List<List<Object>> columnDataList) { | ||
27 | + this.columnDataList = columnDataList; | ||
28 | + } | ||
29 | + | ||
30 | + public List<String> getHeadData() { | ||
31 | + return headData; | ||
32 | + } | ||
33 | + | ||
34 | + public void setHeadData(List<String> headData) { | ||
35 | + this.headData = headData; | ||
36 | + } | ||
37 | +} |
src/main/java/com/aukey/example/vo/SlVo.java
0 → 100644
1 | +package com.aukey.example.vo; | ||
2 | + | ||
3 | +/** | ||
4 | + * @author: wgf | ||
5 | + * @create: 2020-05-22 14:55 | ||
6 | + * @description: 对应 SL 返回数据类型 | ||
7 | + * 返回数据和字段在 SlNodeVo | ||
8 | + * SL这种方式需要对数据进行格式化 | ||
9 | + **/ | ||
10 | +public class SlVo { | ||
11 | + | ||
12 | + private Integer total; | ||
13 | + | ||
14 | + private Integer pageNumber; | ||
15 | + | ||
16 | + private SlNodeVo data; | ||
17 | + | ||
18 | + public Integer getTotal() { | ||
19 | + return total; | ||
20 | + } | ||
21 | + | ||
22 | + public void setTotal(Integer total) { | ||
23 | + this.total = total; | ||
24 | + } | ||
25 | + | ||
26 | + public Integer getPageNumber() { | ||
27 | + return pageNumber; | ||
28 | + } | ||
29 | + | ||
30 | + public void setPageNumber(Integer pageNumber) { | ||
31 | + this.pageNumber = pageNumber; | ||
32 | + } | ||
33 | + | ||
34 | + public SlNodeVo getData() { | ||
35 | + return data; | ||
36 | + } | ||
37 | + | ||
38 | + public void setData(SlNodeVo data) { | ||
39 | + this.data = data; | ||
40 | + } | ||
41 | +} |
@@ -4,11 +4,12 @@ import com.alibaba.fastjson.JSON; | @@ -4,11 +4,12 @@ import com.alibaba.fastjson.JSON; | ||
4 | import com.alibaba.fastjson.TypeReference; | 4 | import com.alibaba.fastjson.TypeReference; |
5 | import com.aukey.example.constant.DwApi; | 5 | import com.aukey.example.constant.DwApi; |
6 | import com.aukey.example.entity.CurrencySet; | 6 | import com.aukey.example.entity.CurrencySet; |
7 | -import com.aukey.example.entity.FbaFulfillmentCurrentInventoryView; | 7 | +import com.aukey.example.entity.FulfillmentCurrentInventory; |
8 | import com.aukey.example.util.DwHelperUtil; | 8 | import com.aukey.example.util.DwHelperUtil; |
9 | import com.aukey.example.vo.DwParamVo; | 9 | import com.aukey.example.vo.DwParamVo; |
10 | import com.aukey.example.vo.DwResultVo; | 10 | import com.aukey.example.vo.DwResultVo; |
11 | -import com.aukey.example.vo.PageVo; | 11 | +import com.aukey.example.vo.ObjVo; |
12 | +import com.aukey.example.vo.SlVo; | ||
12 | import io.swagger.annotations.Api; | 13 | import io.swagger.annotations.Api; |
13 | import io.swagger.annotations.ApiOperation; | 14 | import io.swagger.annotations.ApiOperation; |
14 | import org.slf4j.Logger; | 15 | import org.slf4j.Logger; |
@@ -51,9 +52,9 @@ public class TestApiController { | @@ -51,9 +52,9 @@ public class TestApiController { | ||
51 | private String appId; | 52 | private String appId; |
52 | 53 | ||
53 | 54 | ||
54 | - @ApiOperation(value = "小批量读取 DEMO") | ||
55 | - @GetMapping("/query_all") | ||
56 | - public void queryAll() { | 55 | + @ApiOperation(value = "小批量读取 OBJ 方式") |
56 | + @GetMapping("/query_all_obj") | ||
57 | + public void queryAllObj() { | ||
57 | 58 | ||
58 | // 构造请求参数 | 59 | // 构造请求参数 |
59 | DwParamVo paramVo = new DwParamVo(this.appId, TokenController.getCurrentToken()); | 60 | DwParamVo paramVo = new DwParamVo(this.appId, TokenController.getCurrentToken()); |
@@ -62,6 +63,7 @@ public class TestApiController { | @@ -62,6 +63,7 @@ public class TestApiController { | ||
62 | paramVo.setQueryCondition("WHERE currency_code = 'USD'"); | 63 | paramVo.setQueryCondition("WHERE currency_code = 'USD'"); |
63 | // 每页数据条数 dw服务端有限制 取值[1, 3000] | 64 | // 每页数据条数 dw服务端有限制 取值[1, 3000] |
64 | paramVo.setPageSize(3000); | 65 | paramVo.setPageSize(3000); |
66 | + paramVo.setDataStructure(DwParamVo.OBJ); | ||
65 | 67 | ||
66 | // 调用API | 68 | // 调用API |
67 | String result = DwHelperUtil.doGet(dwDataApi, DwApi.CURRENCY_SET_API, paramVo.toMap()); | 69 | String result = DwHelperUtil.doGet(dwDataApi, DwApi.CURRENCY_SET_API, paramVo.toMap()); |
@@ -70,13 +72,46 @@ public class TestApiController { | @@ -70,13 +72,46 @@ public class TestApiController { | ||
70 | throw new RuntimeException(String.format("API %s 调用失败", DwApi.CURRENCY_SET_API)); | 72 | throw new RuntimeException(String.format("API %s 调用失败", DwApi.CURRENCY_SET_API)); |
71 | } | 73 | } |
72 | // json解析为对象 | 74 | // json解析为对象 |
73 | - DwResultVo<PageVo<CurrencySet>> resultVo = JSON.parseObject(result, new TypeReference<DwResultVo<PageVo<CurrencySet>>>() { | 75 | + DwResultVo<ObjVo<CurrencySet>> resultVo = JSON.parseObject(result, new TypeReference<DwResultVo<ObjVo<CurrencySet>>>() { |
74 | }); | 76 | }); |
75 | 77 | ||
76 | log.info(""); | 78 | log.info(""); |
77 | log.info("API请求状态:{}", resultVo.getMessage()); | 79 | log.info("API请求状态:{}", resultVo.getMessage()); |
78 | log.info("API返回数据:{}", JSON.toJSONString(resultVo.getData().getData())); | 80 | log.info("API返回数据:{}", JSON.toJSONString(resultVo.getData().getData())); |
79 | - log.info("API返回数据两:{}", resultVo.getData().getData().size()); | 81 | + log.info("API返回数据量:{}", resultVo.getData().getTotal()); |
82 | + log.info(""); | ||
83 | + } | ||
84 | + | ||
85 | + | ||
86 | + @ApiOperation(value = "小批量读取 SL 方式") | ||
87 | + @GetMapping("/query_all_sl") | ||
88 | + public void queryAllSl() { | ||
89 | + | ||
90 | + // 构造请求参数 | ||
91 | + DwParamVo paramVo = new DwParamVo(this.appId, TokenController.getCurrentToken()); | ||
92 | + | ||
93 | + // 添加查询条件 | ||
94 | + paramVo.setQueryCondition("WHERE currency_code = 'USD'"); | ||
95 | + // 每页数据条数 dw服务端有限制 取值[1, 3000] | ||
96 | + paramVo.setPageSize(3000); | ||
97 | + paramVo.setDataStructure(DwParamVo.SL); | ||
98 | + | ||
99 | + // 调用API | ||
100 | + String result = DwHelperUtil.doGet(dwDataApi, DwApi.CURRENCY_SET_API, paramVo.toMap()); | ||
101 | + | ||
102 | + if (StringUtils.isEmpty(result)) { | ||
103 | + throw new RuntimeException(String.format("API %s 调用失败", DwApi.CURRENCY_SET_API)); | ||
104 | + } | ||
105 | + | ||
106 | + // json解析为对象 | ||
107 | + DwResultVo<SlVo> resultVo = JSON.parseObject(result, new TypeReference<DwResultVo<SlVo>>() { | ||
108 | + }); | ||
109 | + | ||
110 | + log.info(""); | ||
111 | + log.info("API请求状态:{}", resultVo.getMessage()); | ||
112 | + log.info("API返回数据字段:{}", JSON.toJSONString(resultVo.getData().getData().getHeadData())); | ||
113 | + log.info("API返回数据数组:{}", JSON.toJSONString(resultVo.getData().getData().getColumnDataList())); | ||
114 | + log.info("API返回数据量:{}", resultVo.getData().getTotal()); | ||
80 | log.info(""); | 115 | log.info(""); |
81 | } | 116 | } |
82 | 117 | ||
@@ -85,22 +120,23 @@ public class TestApiController { | @@ -85,22 +120,23 @@ public class TestApiController { | ||
85 | * 适合获取 百万级别的表,大表用分页读取会非常慢 | 120 | * 适合获取 百万级别的表,大表用分页读取会非常慢 |
86 | * 大表建议使用流式读取 | 121 | * 大表建议使用流式读取 |
87 | */ | 122 | */ |
88 | - @ApiOperation(value = "分页读取 DEMO") | ||
89 | - @GetMapping("/query_page") | ||
90 | - public void queryPage() { | 123 | + @ApiOperation(value = "分页读取 OBJ 方式") |
124 | + @GetMapping("/query_page_obj") | ||
125 | + public void queryPageObj() { | ||
91 | 126 | ||
92 | // 构造请求参数 | 127 | // 构造请求参数 |
93 | DwParamVo paramVo = new DwParamVo(this.appId, TokenController.getCurrentToken()); | 128 | DwParamVo paramVo = new DwParamVo(this.appId, TokenController.getCurrentToken()); |
94 | // 每页数据条数 dw服务端有限制 取值[1, 3000] | 129 | // 每页数据条数 dw服务端有限制 取值[1, 3000] |
95 | paramVo.setPageSize(1000); | 130 | paramVo.setPageSize(1000); |
131 | + paramVo.setDataStructure(DwParamVo.OBJ); | ||
96 | // TODO 自定义查询条件 | 132 | // TODO 自定义查询条件 |
97 | 133 | ||
98 | // json字符串转实体引用类型 | 134 | // json字符串转实体引用类型 |
99 | - TypeReference typeReference = new TypeReference<DwResultVo<PageVo<CurrencySet>>>() { | 135 | + TypeReference typeReference = new TypeReference<DwResultVo<ObjVo<CurrencySet>>>() { |
100 | }; | 136 | }; |
101 | 137 | ||
102 | // 回调函数 | 138 | // 回调函数 |
103 | - Function<DwResultVo<PageVo<CurrencySet>>, Integer> callback = (DwResultVo<PageVo<CurrencySet>> resultVo) -> { | 139 | + Function<DwResultVo<ObjVo<CurrencySet>>, Integer> callback = (DwResultVo<ObjVo<CurrencySet>> resultVo) -> { |
104 | List<CurrencySet> dataList = resultVo.getData().getData(); | 140 | List<CurrencySet> dataList = resultVo.getData().getData(); |
105 | System.out.println(dataList.size()); | 141 | System.out.println(dataList.size()); |
106 | // TODO 业务逻辑在这里实现 | 142 | // TODO 业务逻辑在这里实现 |
@@ -121,13 +157,53 @@ public class TestApiController { | @@ -121,13 +157,53 @@ public class TestApiController { | ||
121 | 157 | ||
122 | 158 | ||
123 | /** | 159 | /** |
124 | - * 流式读取适合百/千万级别的表内网数据同步,本机测试 | 160 | + * 适合获取 百万级别的表,大表用分页读取会非常慢 |
161 | + * 大表建议使用流式读取 | ||
162 | + */ | ||
163 | + @ApiOperation(value = "分页读取 SL 方式") | ||
164 | + @GetMapping("/query_page_sl") | ||
165 | + public void queryPageSl() { | ||
166 | + | ||
167 | + // 构造请求参数 | ||
168 | + DwParamVo paramVo = new DwParamVo(this.appId, TokenController.getCurrentToken()); | ||
169 | + // 每页数据条数 dw服务端有限制 取值[1, 3000] | ||
170 | + paramVo.setPageSize(1000); | ||
171 | + paramVo.setDataStructure(DwParamVo.SL); | ||
172 | + // TODO 自定义查询条件 | ||
173 | + | ||
174 | + // json字符串转实体引用类型 | ||
175 | + TypeReference typeReference = new TypeReference<DwResultVo<SlVo>>() { | ||
176 | + }; | ||
177 | + | ||
178 | + // 回调函数 | ||
179 | + Function<DwResultVo<SlVo>, Integer> callback = (DwResultVo<SlVo> resultVo) -> { | ||
180 | + log.info("字段字段:{}", resultVo.getData().getData().getHeadData()); | ||
181 | + log.info("数据数组:{}", resultVo.getData().getData().getColumnDataList()); | ||
182 | + // TODO 业务逻辑在这里实现 | ||
183 | + // ... more | ||
184 | + // mapper.insertList(dataList) | ||
185 | + | ||
186 | + // 需要返回总页数 | ||
187 | + return resultVo.getData().getTotal(); | ||
188 | + }; | ||
189 | + | ||
190 | + // 使用分页API | ||
191 | + DwHelperUtil.pageReader(callback, | ||
192 | + dwDataApi, | ||
193 | + DwApi.CURRENCY_SET_API, | ||
194 | + paramVo, | ||
195 | + typeReference); | ||
196 | + } | ||
197 | + | ||
198 | + | ||
199 | + /** | ||
200 | + * 流式读取适合百级别的表内网数据同步,每次数据读取建议在[100000, 1000000],本机测试 | ||
125 | * <p> | 201 | * <p> |
126 | * 网络环境:局域网 | 202 | * 网络环境:局域网 |
127 | * 数据源 :华为dws | 203 | * 数据源 :华为dws |
128 | * cpu : 4核3.2GHz | 204 | * cpu : 4核3.2GHz |
129 | * 内存 :16GB DDR3 | 205 | * 内存 :16GB DDR3 |
130 | - * 测试数据:1000W条 | 206 | + * 测试数据:100W条 |
131 | * 回调函数不做持久化操作 | 207 | * 回调函数不做持久化操作 |
132 | * <p> | 208 | * <p> |
133 | * <p> | 209 | * <p> |
@@ -154,24 +230,24 @@ public class TestApiController { | @@ -154,24 +230,24 @@ public class TestApiController { | ||
154 | // TODO 自定义查询条件 | 230 | // TODO 自定义查询条件 |
155 | 231 | ||
156 | // 定义实体构造函数 | 232 | // 定义实体构造函数 |
157 | - Supplier<FbaFulfillmentCurrentInventoryView> constructor = FbaFulfillmentCurrentInventoryView::new; | 233 | + Supplier<FulfillmentCurrentInventory> constructor = FulfillmentCurrentInventory::new; |
158 | 234 | ||
159 | // 流式读取回调函数 | 235 | // 流式读取回调函数 |
160 | - Consumer<List<FbaFulfillmentCurrentInventoryView>> callBack = (List<FbaFulfillmentCurrentInventoryView> list) -> { | 236 | + Consumer<List<FulfillmentCurrentInventory>> callBack = (List<FulfillmentCurrentInventory> list) -> { |
161 | System.out.println(list.size()); | 237 | System.out.println(list.size()); |
162 | // TODO 业务逻辑在这里实现 | 238 | // TODO 业务逻辑在这里实现 |
163 | // ... more | 239 | // ... more |
164 | // mapper.insertList(list) | 240 | // mapper.insertList(list) |
165 | }; | 241 | }; |
166 | 242 | ||
167 | - // 指定回调函数数据大小,取值[500, 5000]. | 243 | + // 指定回调函数数据大小,取值[1000, 5000]. 建议2000 |
168 | // 取值越大,数据读取占用的堆内存越高 | 244 | // 取值越大,数据读取占用的堆内存越高 |
169 | - int batchSize = 5000; | 245 | + int batchSize = 1000; |
170 | 246 | ||
171 | // 使用 StreamAPI | 247 | // 使用 StreamAPI |
172 | DwHelperUtil.streamReader( | 248 | DwHelperUtil.streamReader( |
173 | dwDataApi, | 249 | dwDataApi, |
174 | - DwApi.FBA_FULFILLMENT_CURRENT_INVENTORY_VIEW_API, | 250 | + DwApi.FULFILLMENT_CURRENT_INVENTORY, |
175 | paramVo.toMap(), | 251 | paramVo.toMap(), |
176 | callBack, | 252 | callBack, |
177 | batchSize, | 253 | batchSize, |
-
请 注册 或 登录 后发表评论