Apache kafka 卡夫卡在消息中添加前缀

Apache kafka 卡夫卡在消息中添加前缀,apache-kafka,Apache Kafka,使用producer发送消息时,我发现一旦使用它,消息就会在消息的开头附加一个部分 例如,向卡夫卡发送一个简单字符串“King Daniel”,该字符串在字节数组中如下所示: 4B 69 6E 67 20 44 61 6E 69 65 6C 但当我出于某种原因消费它时,我得到: 00 00 00 00 00 11 01 00 C2 C4 1E 7C 4B 69 6E 67 20 44 61 6E 69 65 6C 哪根弦是“……丹尼尔国王” 因此,我在邮件的开头增加了12个字符。 这是某种标

使用producer发送消息时,我发现一旦使用它,消息就会在消息的开头附加一个部分

例如,向卡夫卡发送一个简单字符串“King Daniel”,该字符串在字节数组中如下所示:

4B 69 6E 67 20 44 61 6E 69 65 6C
但当我出于某种原因消费它时,我得到:

00 00 00 00 00 11 01 00 C2 C4 1E 7C 4B 69 6E 67 20 44 61 6E 69 65 6C
哪根弦是“……丹尼尔国王”

因此,我在邮件的开头增加了12个字符。 这是某种标题吗?我怎样才能得到我的原始信息

这是我的消费代码:

public void start() {
initConsumer();
LOG.info("Starting kafka consumer for topic " + topic);
try {
    long offset = 0;
    while (true) {
    // create a fetch request for partition 0, current offset, and
    // fetch size of 1MB
    FetchRequest fetchRequest = new FetchRequest(topic, 0, offset, 1000000);
    ByteBufferMessageSet messages = consumer.fetch(fetchRequest);

    for (MessageAndOffset msg : messages) {
        ByteBuffer payload = msg.message().payload();
        writer.writeToFile(payload.array());
        // advance the offset after consuming each message
        offset = msg.offset();
    }
    }
} catch (Exception e) {
    LOG.error("Error occured while consuming from kafka", e);
}
}
因此,我正在将
msg.message().payload().array()
写入一个文件,然后当我打开这个文件时,我可以看到原始内容,并在开头添加了12个额外的字符


如何获取确切的原始消息?

问题是
ByteBuffer.array()
方法返回一个数组,该数组支持该缓冲区(请参阅)

ByteBuffer可能只占用备份阵列的一部分。此外,此方法不适用于只读ByteBuffers和direct ByteBuffers:如果数组是只读的,它将抛出
ReadOnlyBufferException
;如果
ByteBuffer
没有支持数组,它将抛出
UnsupportedOperationException

您可以使用以下代码段将
ByteBuffer
内容读入数组:

ByteBuffer payload = msg.message().payload();
byte[] contents = new byte[payload.remaining()];
payload.get(contents);
writer.writeToFile(contents);

但是,可能值得扩展您的
编写器
以直接从
ByteBuffer
写入数据,并避免额外的副本。

您是否尝试过
Utils.toString(msg.message.payload(),“UTF-8”)
,如手册中所述?使用UTF-8解码对于简单字符串是可以的,但我真正的消息不适合它,无论如何,这不是问题所在。谢谢