![](/img/trans.png)
[英]Cannot have circular references in bean class, but got the circular reference of class class org.apache.avro.Schema
[英]Kafka Connect API and Avro Object (SourceRecord vs org.apache.avro.Schema)
我在使用 kafka 源連接器(需要准備 SourceRecord 實例)將 Avro object(org.apache.avro.specific.SpecificRecord 的實例)發送到 kafka 主題時遇到問題。 在我的例子中,我假設基於模式,例如:
{
"namespace": "com.model.avro.generated",
"type": "record",
"name": " MessageExVal",
"version": "1",
"fields": [
{
"name": "messageSource",
"type": "string"
},
{
"name": "messageSourceVersion",
"type": [
"string",
"null"
]
}
]
}
在avro-maven-plugin
for maven 的幫助下,我將生成項目中使用的類 model。 class MessageExVal
的實例為我提供了“ org.apache.avro.Schema
”(通過方法getSchema() or getClassSchema()
)。 從第二端 kafka connect api 需要我org.apache.kafka.connect.data.Schema
才能創建由源連接器的poll()
方法返回的SourceRecord
的新實例。 在配置中我提供參數:
"value.converter": "io.confluent.connect.avro.AvroConverter",
"value.converter.schema.registry.url": "http://localhost:8081",
在“輪詢”方法之后執行的fromConnectData()
方法中的AvroConverter
代碼中,我看到從org.apache.kafka.connect.data.Schema
到org.apache.avro.Schema
的轉換將完成。 那么是否有任何選項可以傳遞 avro 模式而不首先將其轉換為“連接版本”,因為稍后它無論如何都會轉換回 avro? 您可以在下面找到我所指的代碼中帶有注釋點的 poll 方法的實現:
@Override
public List<SourceRecord> poll() throws InterruptedException {
List<SourceRecord> records = new LinkedList<SourceRecord>();
MessageExVal myValue = MessageExVal.newBuilder()
.setMessageType(“some value”)
.setMessageSource(“some other value”)
.build();
SourceRecord sr = new SourceRecord(null, null,
"test_topic",
myValue.getSchema(), //incorrect - different types
myValue);
records.add(sr);
return records;
}
總結一下,我的問題是如何使用 kafka connect SourceConnector 將“myValue”放入主題? 我將非常感謝每一個提示:)
因為后來它無論如何都會轉換回avro?
數據以二進制形式存儲在主題中,因此您仍然需要支付反序列化成本
kafka connect api 需要我 org.apache.kafka.connect.data.Schema 才能創建 SourceRecord 的新實例
是的。 您可以使用toConnectData
來獲取它,或者您可以從代碼的依賴項中刪除 Avro 並直接從 Connect 創建 Schema 和 Struct 實例。
轉換器負責序列化,Connect 中不需要 Avro
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.