Kafka为消息添加前缀

时间:2013-11-29 08:56:54

标签: apache-kafka

使用kafka 7.2时,在使用生产者发送消息时,我发现消息一旦消费,消息就会在消息开头附加一部分。

例如,当向kafka发送一个简单的字符串“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

字符串“........ֲִ。| King Daniel”

所以在我的消息开头我还有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个额外的字符。

如何获取我的确切原始讯息?

1 个答案:

答案 0 :(得分:2)

问题是ByteBuffer.array()方法返回一个支持此缓冲区的数组(请参阅http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#array())。

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

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

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

但是,可能需要将writer扩展为直接从ByteBuffer写入数据并避免额外复制。