为什么元数据会添加到此Kafka连接器的输出中?

时间:2016-11-30 00:40:39

标签: java apache-kafka kafka-consumer-api apache-kafka-connect

我有一个Kafka连接器,其中包含SourceTask实现中if (!annot.IsUsed()) { PdfRectangle rect = (PdfRectangle)annot.Get(PdfName.RECT); if (rect != null && (rect.Left != 0 || rect.Right != 0 || rect.Top != 0 || rect.Bottom != 0)) { int rotation = reader.GetPageRotation(pageN); Rectangle pageSize = reader.GetPageSizeWithRotation(pageN); switch (rotation) { case 90: annot.Put(PdfName.RECT, new PdfRectangle( pageSize.Top - rect.Top, rect.Right, pageSize.Top - rect.Bottom, rect.Left)); break; case 180: annot.Put(PdfName.RECT, new PdfRectangle( pageSize.Right - rect.Left, pageSize.Top - rect.Bottom, pageSize.Right - rect.Right, pageSize.Top - rect.Top)); break; case 270: annot.Put(PdfName.RECT, new PdfRectangle( rect.Bottom, pageSize.Right - rect.Left, rect.Top, pageSize.Right - rect.Right)); break; } } } } 方法的以下代码。

poll()

如果我将消费者附加到数据主题,我会从连接器发送以下消息:

@Override
public List<SourceRecord> poll() throws InterruptedException 
{
    SomeType item = mQueue.take();
    List<SourceRecord> records = new ArrayList<>();
    SourceRecord[] sourceRecords = new SourceRecord[]{
        new SourceRecord(null, null, "data", null,
                         Schema.STRING_SCHEMA, "foo",
                         Schema.STRING_SCHEMA, "bar")
    };
    Collections.addAll(records, sourceRecords);

    return records;
}

如果我使用以下命令直接发布消息:

{"schema":{"type":"string","optional":false},"payload":"foo"}   {"schema":{"type":"string","optional":false},"payload":"bar"}

然后附上同一个消费者,我收到这条消息:

echo -e 'foo,bar' > /tmp/test_kafka.txt
cat /tmp/test_kafka.txt | kafka-console-producer.sh --broker-list kafka-host:9092 --topic data --property parse.key=true --property key.separator=,

这是我期望看到的连接器实现的输出,而不是我收到的foo bar 消息。

如何更改{"schema":...的实现,以便在没有架构元数据出现在消息的实际键和值中的情况下发送消息?

1 个答案:

答案 0 :(得分:1)

好的,事实证明这只是因为我在connect-standalone.properties

中有以下几行
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter

我应该有

key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.storage.StringConverter

作为替代解决方案,我还能够将以下设置从true更改为false

value.converter.schemas.enable=false

然后在我的处理器类中,我将代码更改为:

SourceRecord[] sourceRecords = new SourceRecord[]{
    new SourceRecord(null, null, "data", null,
                     Schema.STRING_SCHEMA, "foo",
                     null, "bar")
};

这有所不同,因为我不再为该值指定架构。