简介

chunjun是一款基于flink的开源数据同步工具,官方文档,其提供了很多flink官方未提供的插件供大家来使用,特别是达梦插件在国产化环境中很方便!

本次介绍的是chunjun中的一款http插件,通过该插件可以实现基于http请求的流处理,但是目前官方提供的http插件在以SQL模式运行的时候是有一些问题的,所以我花了些时间将问题排查修复下,并且添加了一个分页的新功能。下面是具体的过程。

问题

按照官方文档使用http插件运行的时候,会报下面的错误

    java.lang.RuntimeException: request data error,msg is prevResponse value is  exception java.lang.RuntimeException: key data.id on {msg=请求成功, total=0, code=0000, data=[{name=第0臭桑, id=0}, {name=第1臭桑, id=1}], timestamp=2023-02-12 16:39:12} is not a json

    at com.dtstack.chunjun.util.MapUtil.getValueByKey(MapUtil.java:161)
at com.dtstack.chunjun.connector.http.client.ResponseParse.buildResponseByKey(ResponseParse.java:63)
at com.dtstack.chunjun.connector.http.client.JsonResponseParse.next(JsonResponseParse.java:95)
at com.dtstack.chunjun.connector.http.client.HttpClient.doExecute(HttpClient.java:272)
at com.dtstack.chunjun.connector.http.client.HttpClient.execute(HttpClient.java:184)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750) at com.dtstack.chunjun.connector.http.inputformat.HttpInputFormat.nextRecordInternal(HttpInputFormat.java:118)
at com.dtstack.chunjun.source.format.BaseRichInputFormat.nextRecord(BaseRichInputFormat.java:198)
at com.dtstack.chunjun.source.format.BaseRichInputFormat.nextRecord(BaseRichInputFormat.java:68)
at com.dtstack.chunjun.source.DtInputFormatSourceFunction.run(DtInputFormatSourceFunction.java:133)
at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:110)
at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:66)
at org.apache.flink.streaming.runtime.tasks.SourceStreamTask$LegacySourceFunctionThread.run(SourceStreamTask.java:267)

解决方案【修改源码】

修改HttpOptions 添加两个配置
// 第一个是配置是数据主体,一般http请求都是标准的统一返回值,有状态码 状态信息 数据主体,我们需要的数据都在数据主体里面的
public static final ConfigOption<String> DATA_SUBJECT =
ConfigOptions.key("dataSubject")
.stringType()
.defaultValue("${data}")
.withDescription("response data subject");
// 这个配置是发送http请求的周期,如果设置2的话 就会重复请求两次的 如果是-1则会一直重复请求
public static final ConfigOption<Long> CYCLES =
ConfigOptions.key("cycles")
.longType()
.defaultValue(1L)
.withDescription("request cycle");
修改HttpDynamicTableFactory
    @Override
public Set<ConfigOption<?>> optionalOptions() {
Set<ConfigOption<?>> options = new HashSet<>();
options.add(HttpOptions.DECODE);
options.add(HttpOptions.METHOD);
options.add(HttpOptions.HEADER);
options.add(HttpOptions.BODY);
options.add(HttpOptions.PARAMS);
options.add(HttpOptions.INTERVALTIME);
options.add(HttpOptions.COLUMN);
options.add(HttpOptions.DELAY);
// 下面这俩是对应了with参数
options.add(HttpOptions.DATA_SUBJECT);
options.add(HttpOptions.CYCLES);
return options;
}
    private HttpRestConfig getRestapiConf(ReadableConfig config) {
Gson gson = GsonUtil.setTypeAdapter(new Gson());
HttpRestConfig httpRestConfig = new HttpRestConfig();
httpRestConfig.setIntervalTime(config.get(HttpOptions.INTERVALTIME));
httpRestConfig.setUrl(config.get(HttpOptions.URL));
httpRestConfig.setDecode(config.get(HttpOptions.DECODE));
httpRestConfig.setRequestMode(config.get(HttpOptions.METHOD));
// 将上面配置的参数信息封装到http请求配置里面
httpRestConfig.setDataSubject(config.get(HttpOptions.DATA_SUBJECT));
httpRestConfig.setCycles(config.get(HttpOptions.CYCLES));
httpRestConfig.setParam(
gson.fromJson(
config.get(HttpOptions.PARAMS),
new TypeToken<List<MetaParam>>() {}.getType()));
httpRestConfig.setHeader(
gson.fromJson(
config.get(HttpOptions.HEADER),
new TypeToken<List<MetaParam>>() {}.getType()));
httpRestConfig.setBody(
gson.fromJson(
config.get(HttpOptions.BODY),
new TypeToken<List<MetaParam>>() {}.getType()));
httpRestConfig.setColumn(
gson.fromJson(
config.get(HttpOptions.COLUMN),
new TypeToken<List<FieldConf>>() {}.getType()));
return httpRestConfig;
}
修改HttpRowConverter
// 修改类的泛型 原来是 String 现在需要修改成Map<String,Object>
public class HttpRowConverter
extends AbstractRowConverter<Map<String, Object>, RowData, RowData, LogicalType>
    // 上面修改了泛型后 这里重写的方法参数类型也会是map类型,在别的地方调用这个方法的时候,传递的就是map类型数据
// 但是源码里面用String接收的,这样会导致调用方法的时候就出错,而且单步调试的时候就是进不到这个方法的,只能进入到类上
// 前面传递过来的就是map类型数据了,源码里面,这个方法里的前两行是将字符串转成map的,那也就是说这两行代码不需要了,删除即可
@Override
public RowData toInternal(Map<String, Object> result) throws Exception {
GenericRowData genericRowData = new GenericRowData(rowType.getFieldCount());
List<String> columns = rowType.getFieldNames();
for (int pos = 0; pos < columns.size(); pos++) {
Object value =
MapUtil.getValueByKey(
result, columns.get(pos), httpRestConfig.getFieldDelimiter());
if (value instanceof LinkedTreeMap) {
value = value.toString();
}
genericRowData.setField(pos, toInternalConverters.get(pos).deserialize(value));
}
return genericRowData;
}

经过上面的修改之后,可以在with参数里面指定数据主体和请求周期,直接在localTest类运行即可成功!下面是示例的sql

CREATE TABLE source
(
id int,
name varchar
) WITH (
'connector' = 'http-x'
,'url' = 'http://127.0.0.1:8090/test/test'
,'intervalTime' = '3000'
,'method' = 'get'
,'cycles' = '5',
,'dataSubject' = '${data}'
,'decode' = 'json'
,'paging' = 'true'
,'pagingParam' = 'pageNumber'
,'params' = '[{"key": "pageNumber","value":1,"type":"int"},{"key": "pageSize","value":100,"type":"int"}]'
,'column' = '[
{
"name": "id",
"type": "int"
},
{
"name": "name",
"type": "String"
}
]'
); CREATE TABLE sink
(
id int,
name varchar
) WITH (
'connector' = 'stream-x'
); insert into sink
select *
from source u;

后续

目前在上面的基础上,我又加了分页查询的功能,后面有时间会编辑此博客加上分页的源码修改

最后

转载请注明来处

纯钧chunjun的http-x插件修复的更多相关文章

  1. 简单实用的纯CSS百分比圆形进度条插件

    percircle是一款简单实用的纯CSS百分比圆形进度条插件.你不需要做任何设置,只需要按该圆形进度条插件提供的标准HTML结构来编写代码,就可以生成一个漂亮的百分比圆形进度条. 首先要做的就是引入 ...

  2. 纯js写图片轮播插件

    最近终于写成了自己创作的图片轮播插件,使用原生js编写.与目前网上流行的轮播插件相比,功能和效果稍弱,但是使用起来相当方便. 先看html代码 <!DOCTYPE html> <ht ...

  3. 【富文本、JS】将接口传来的全部纯URL替换为富文本插件能识别到的img标签

    replaceURLWithImage (text) { var a = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0 ...

  4. 纯原生js移动端城市选择插件

    接着上一篇纯js移动端日期选择插件,话说今天同事又来咨询省市县联动的效果在移动端中如何实现,还是老样子,百度上一搜,诶~又全是基于jquery.zepto的,更加可恨的是大多数都是PC版的,三个sel ...

  5. 移动端网站的内容触摸滑动-Swiper插件

    手机平板等大多移动端站点都会有触摸滑动内容的功能,公司移动端站点(m.muzhiwan.com)的标题广告滑动以及轮播效果就是用的Swiper插件. Swiper就是常用于移动端网站的内容触摸滑动的一 ...

  6. JQuery表单验证插件EasyValidator,超级简单易用!

    本插件的宗旨是:用户无需写一行JS验证代码,只需在要验证的表单中加入相应的验证属性即可,让验证功能易维护,可扩展,更容易上手. DEMO中已经包含了常用的正则表达式,可以直接复用,为了考虑扩展性,所以 ...

  7. 分享8款绚丽的HTML5/jQuery特效插件

    有几天没有分享前端资源了,今天要向大家分享15款非常给力的HTML5/jQuery特效插件,废话少说,一起来看看. 1.CSS3图片重力感应特效 很酷的一款CSS3模拟重力感应特效,你可以拖动图片来甩 ...

  8. jquery插件的写法

    jquery插件及zepto插件,写法上有些区别. 区别点: 1.自定义事件的命名空间 jq的时间命名空间是用点“.”,而zepto是用冒号“:” 如 //jquery $(this).trigger ...

  9. 触摸滑动插件 Swiper

    Swiper Swiper  是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端. Swiper中文网里已有详细的使用介绍,我就不多做介绍了. http://www.swiper ...

  10. CDN公共库、前端开发常用插件一览表(VendorPluginLib)

    =======================================================================================前端CDN公共库===== ...

随机推荐

  1. linux压缩文件并排除指定目录

    今天要在linux上打包一个项目另作他用,但是项目图片都是放本地服务器的,整个项目打包好后有2G多下载十分费时.项目中的图片我们可以不要,所以压缩的时候要排除图片目录. 具体命令如下: // 参数说明 ...

  2. mysql中innodb创建表的一些限制

    1. 背景 在新创建mysql数据表的时候.不太确定表能创建多少个字段,多少个索引.索引多少有限制么?mysql的数据是怎么存储的存在在哪里. 2.基本个数限制 在MySQL5.6.9以后的版本,一个 ...

  3. GoLand打开后Project消失

    一直用的好好的Goland,突然不能用了,左边栏Project"消失"了. 如下: 解决方法 遇到上面问题,一般情况是GoLand的cache问题,这个时候要将GoLand清理一下 ...

  4. 静态类使用@Resource注解注入

    工作中需要,简单记录一下 @Component public class AccountUtil { private static AccountIdDao accountIdDao; @Resour ...

  5. MyBatisPlus常用功能总结!(附项目示例)

    这篇主要是总结一下MybatisPlus一些常用的场景,目前主要有以下几点: 完整的CURD操作示例 逻辑删除功能示例 自动填充功能示例 分页插件功能示例 有关一些其它重要的功能比如 条件生成器.主键 ...

  6. 【剑指 Offer II 118. 多余的边】并查集求回路

    class Solution { int[] parent; int[] rank; public void init(int n) { parent = new int[n + 1]; rank = ...

  7. 3DCAT首届行业生态交流会|瑞云科技技术总监赵志杰:实时渲染助力元宇宙应用触手可及

    2021年12月17日下午,由深圳市瑞云科技有限公司主办,深圳市虚拟现实产业联合会协办的 云XR如何赋能元宇宙--3DCAT实时云渲染首届行业生态合作交流会 圆满落幕.此次活动围绕 "云XR ...

  8. 活动报名|3DCAT实时渲染云行业生态合作系列沙龙之“云XR如何赋能虚拟仿真实验教学”线上活动邀您参会

    当前,虚拟现实发展方兴未艾,"XR+教育"融合发展前景广阔. 3DCAT实时渲染云积极联动教育行业渠道商等生态合作伙伴,合力打造"虚拟现实实验室"." ...

  9. C#异步编程:原理与实践

    一.引言 在现代应用程序开发中,尤其是在涉及I/O操作(如网络请求.文件读写等)时,异步编程成为了提高性能和用户体验的关键技术.C#作为.NET框架下的主流开发语言,提供了强大的异步编程支持,通过as ...

  10. 三维模型3DTile格式轻量化云端处理技术方法分析

    三维模型3DTile格式轻量化云端处理技术方法分析 在现代的地理信息系统 (GIS) 中,3D Tiles 是一种很重要的数据格式,用于存储和传输大规模地理空间数据.然而,由于其数据密度高,传输和加载 ...