Kafka consumer.poll返回空

时间:2018-05-06 04:48:57

标签: java apache-kafka

生产者代码将从光盘中读取.mp4视频文件并将其发送到kafka,这显然可用于打印"Message sent to the Kafka Topic java_in_use_topic Successfully",但consumer.poll为空:

@RestController
@RequestMapping(value = "/javainuse-kafka/")
public class ApacheKafkaWebController {
@GetMapping(value = "/producer")
public String producer(@RequestParam("message") String message) {
    Map<String, Object> props = new HashMap<>();
    // list of host:port pairs used for establishing the initial connections to the Kakfa cluster
    props.put(org.apache.kafka.clients.producer.ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
            "localhost:9092");
    props.put(org.apache.kafka.clients.producer.ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
    props.put(org.apache.kafka.clients.producer.ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class.getName());
    Producer<String, byte[]> producer = new KafkaProducer<>(props);
    Path path = Paths.get("C:/kafka-picture-consumer/SampleVideo_1280x720_1mb.mp4");
    ProducerRecord<String, byte[]> record = null;
    try {
        record = new ProducerRecord<>("topiccc", "keyyyyy", Files.readAllBytes(path));
    } catch (IOException e) {
        e.printStackTrace();
    }
    producer.send(record);
    producer.close();
    return "Message sent to the Kafka Topic java_in_use_topic Successfully";
}

将在servlet中使用的消费者代码:

public class ConsumerService {
    public byte[] consumer(){
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("group.id", "test");
        props.put("enable.auto.commit", "true");
        props.put("auto.commit.interval.ms", "1000");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.ByteArrayDeserializer");
        KafkaConsumer<String, byte[]> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Collections.singletonList("topiccc"));
        ConsumerRecords<String, byte[]> records = consumer.poll(100);
       System.out.println("ISSSSSSSSSSSSSSSSSSSSSSSSSSSSS EMPTYYYYYYYYYY:"+String.valueOf(records.isEmpty()));
        return records.iterator().next().value();
    }
}

1 个答案:

答案 0 :(得分:0)

可能有很多原因。

  1. 您的生产者未发送该消息。在这种情况下,您可以通过向生产者添加回调并打印异常来进行检查。如果异常为null,则send()成功。

    producer.send(记录,(recordMetadata,异常)-> {      System.err.println(exception); });

由于您正在发送mp4文件,因此我想您可能未设置Kafka代理配置和/或主题配置来支持这么大的消息。 检查主题和代理的max.message.bytesmessage.max.bytes配置。在这种情况下,您将获得RecordTooLargeException

  1. 您将不得不等到生产者完全产生该消息。

  2. 您需要在使用者配置中将auto.offset.reset设置为earliest。这样可以确保如果该主题没有偏移数据,则它将从第一条消息开始使用,否则将等待下一条消息。

  3. 您的poll持续时间很短,您可能需要增加此时间。