在kafka手册网站中,有一个代码块可以从kafka获取消息。但是如果只有一条大于fetch size的消息,它就不起作用。
但是,我们事先并不知道队列的最大大小是多少。有没有办法让它总是至少获取一条消息?
import kafka.api.FetchRequest;
import kafka.javaapi.consumer.SimpleConsumer;
import kafka.javaapi.message.ByteBufferMessageSet;
import kafka.message.Message;
import kafka.message.MessageSet;
import kafka.utils.Utils;
...
// create a consumer to connect to the kafka server running on localhost, port 9092, socket timeout of 10 secs, socket receive buffer of ~1MB
SimpleConsumer consumer = new SimpleConsumer("127.0.0.1", 9092, 10000, 1024000);
long offset = 0;
while (true) {
// create a fetch request for topic “test”, partition 0, current offset, and fetch size of 1MB
FetchRequest fetchRequest = new FetchRequest("test", 0, offset, 1000000);
// get the message set from the consumer and print them out
ByteBufferMessageSet messages = consumer.fetch(fetchRequest);
for(MessageAndOffset msg : messages) {
System.out.println("consumed: " + Utils.toString(msg.message.payload(), "UTF-8"));
// advance the offset after consuming each message
offset = msg.offset;
}
}
答案 0 :(得分:1)
此处有两种方法:配置服务器以拒绝大于消费者可以获取的最大邮件大小的邮件。在生成/使用主题之前,请确保您的经纪人的max.message.bytes设置和消费者的fetch.message.max.bytes相同(请参阅https://kafka.apache.org/08/configuration.html)。这将把问题推向生产者,以弄清楚如何防止邮件大小过大。
另一种方法是增加消费者的fetch-max-bytes并重试。因此,从consumer.fetch(fetchRequest)捕获MessageSizeTooLarge错误并重试此w /更大的最大消息大小(示例代码中的最后一个参数1000000):
FetchRequest fetchRequest = new FetchRequest("test", 0, offset, 1000000)
但这很危险 - 这是最大消息大小配置的重点。
我建议将消息大小限制推送给您的制作人。