Kafka消息包含控制字符(MongoDB源连接器)

Kafka消息包含控制字符(MongoDB源连接器),mongodb,apache-kafka,apache-kafka-connect,confluent-platform,mongodb-kafka-connector,Mongodb,Apache Kafka,Apache Kafka Connect,Confluent Platform,Mongodb Kafka Connector,我有一个Kafka Connect MongoDB源连接器(两者都通过Confluent平台)正在工作,但它创建的消息在开始时包含一个控制字符,这使得该消息的下游解析(到JSON)比我想象的要困难 正在运行的源连接器: { "name": "mongo-source-connector", "config": { "connector.class": "com.mongodb

我有一个Kafka Connect MongoDB源连接器(两者都通过Confluent平台)正在工作,但它创建的消息在开始时包含一个控制字符,这使得该消息的下游解析(到JSON)比我想象的要困难

正在运行的源连接器:

{
    "name": "mongo-source-connector",
    "config": {
        "connector.class": "com.mongodb.kafka.connect.MongoSourceConnector",
        "connection.uri": "mongodb://myUsername:myPassword@my-mongodb-host-address:27017",
        "database": "myDatabase",
        "collection": "myCollection",
        "change.stream.full.document": "updateLookup",
        "errors.log.enable": true
    }
}
此源连接器在Kafka主题中创建的消息如下(请注意前导控件字符):

控制字符使对JSON的下游解析变得困难,因为它使原本有效的JSON无效。我不知道它为什么会在那里,也不知道如何摆脱它

我猜,我可以像对待JSON那样,把像这个控制字符一样的垃圾分析出来,但这好像是一个我想避免的创可贴。

我现在处理消息的方式,我认为这是不相关的,因为我已经测试过它使用有效的JSON而不使用控制字符,如果它有问题,如下所示:


数据类MyChangesetMessageId(
@JsonProperty(“\u数据”)
val数据:字符串
)
数据类MyChangesetMessageTimestamp(
val t:Long,
val i:Int
)
数据类MyChangesetMessageClusterTime(
@JsonProperty(“\$timestamp”)
val时间戳:MyChangesetMessageTimestamp
)
数据类MyChangesetOid(
@JsonProperty(“\$oid”)
val oid:字符串
)
数据类MyChangesetMessageFullDocument(
@JsonProperty(“\u id”)
val id:MyChangesetOid,
val uuid:String,
val endingNumber:Int
)
数据类MyChangesetMessageNS(
val db:String,
瓦尔科尔:字符串
)
数据类MyChangesetDocumentKey(
@JsonProperty(“\u id”)
valid:MyChangesetOid
)
数据类MyChangesetMessage(
@JsonProperty(“\u id”)
val id:MyChangesetMessageId,
val操作类型:字符串,
val clusterTime:MyChangesetMessageClusterTime,
val fullDocument:MyChangesetMessageFullDocument,
val ns:MyChangesetMessageNS,
val documentKey:MyChangesetDocumentKey
)
...
val objectMapper=jacksonObjectMapper()
val changesetMessage=objectMapper.readValue(message,MyChangesetMessage::class.java)

欢迎提出任何想法。

您所指的字符通常与已解码为字符串的Avro序列化数据相同

检查Connect worker中的键/值转换器设置,因为您尚未在连接器中定义它


如果您想解析为JSON,请使用JSONConverter,否则如果您想跳过数据类定义并从Avro模式生成数据类定义,Avro也可以使用,看起来像
output.json.formatter=com.mongodb.kafka.connect.source.json.formatter.DefaultJson
。现在就用
com.mongodb.kafka.connect.source.json.formatter.SimplifiedJson
试试吧,因为我不知道还有什么好尝试的。默认值也是
output.format.key=json
output.format.value=json
根据我询问的
value.converter
不是formatters@OneCricketeer源连接器似乎没有
值.converter
属性。水槽连接器可以,但工作正常。我能找到的最接近源代码的属性是
output.format.key
output.format.value
属性,它们可以是
json
bson
schema
value.converter=io.confluent.connect.avro.AvroConverter
因为我想我无法用源连接器覆盖它?@OneCricketeer我将它切换到
StringConverter
,并删除了这个神奇的角色。谢谢你的主意。如果你想回答这个问题,我可以接受。
�{"_id": {"_data": "82609E8726000000012B022C0100296E5A1004BE208B099BCF4106822DE274B0B9D39A46645F69640064609E87267125D17D12D180620004"}, "operationType": "insert", "clusterTime": {"$timestamp": {"t": 1621002022, "i": 1}}, "fullDocument": {"_id": {"$oid": "609e87267125d17d12d18062"}, "uuid": "23534a5c-ad82-431c-a821-6b4aed4f59a1", "endingNumber": 10}, "ns": {"db": "myDatabase", "coll": "myCollection"}, "documentKey": {"_id": {"$oid": "609e87267125d17d12d18062"}}}