kafka-connect-transforms 中文乱码
问题描述
目前使用kafka-connect
将分布式数据采集到集中式数据库,在采集时,需要追加数据来源标识,其中包含中文内容;
使用notepad++编辑源端配置文件connect-jdbc-source.properties
,示例如下:
# 转换处理
transforms=insertField
transforms.insertField.type=org.apache.kafka.connect.transforms.InsertField$Value
transforms.insertField.static.field=jgmc
transforms.insertField.static.value=xxx社区
但是目标端接收该数据时,数据发生乱码,显示为:
xxx社区
解决办法
检查kafka
源码,发现其使用Properties
类加载配置文件,代码片段如下:
/**
* Read a properties file from the given path
* @param filename The path of the file to read
* @param onlyIncludeKeys When non-null, only return values associated with these keys and ignore all others
* @return the loaded properties
*/
public static Properties loadProps(String filename, List<String> onlyIncludeKeys) throws IOException {
Properties props = new Properties();
if (filename != null) {
try (InputStream propStream = Files.newInputStream(Paths.get(filename))) {
props.load(propStream);
}
} else {
System.out.println("Did not load any properties since the property file is not specified");
}
if (onlyIncludeKeys == null || onlyIncludeKeys.isEmpty())
return props;
Properties requestedProps = new Properties();
onlyIncludeKeys.forEach(key -> {
String value = props.getProperty(key);
if (value != null)
requestedProps.setProperty(key, value);
});
return requestedProps;
}
使用该代码片段,在eclipse中编写测试类,直接读取配置文件确实会出现同样问题。
此时使用eclipse打开该配置文件,发现同样显示乱码。
尝试直接在eclipse中编辑该配置文件,添加中文xxx社区
,得到的输出是xxx\u793E\u533A
,格式如下:
# 转换处理
transforms=insertField
transforms.insertField.type=org.apache.kafka.connect.transforms.InsertField$Value
transforms.insertField.static.field=jgmc
transforms.insertField.static.value=xxx\u793E\u533A
此时再次执行测试类,发现输出正常。
按照上述方式修改kafka-connect
配置文件,中文信息可以正确显示到目标数据库了,问题解决。
截图如下
id=22
为异常数据;
id=23
为修改配置后的正常数据;