生产者代码将从光盘中读取.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();
}
}
答案 0 :(得分:0)
可能有很多原因。
您的生产者未发送该消息。在这种情况下,您可以通过向生产者添加回调并打印异常来进行检查。如果异常为null,则send()成功。
producer.send(记录,(recordMetadata,异常)-> { System.err.println(exception); });
由于您正在发送mp4
文件,因此我想您可能未设置Kafka代理配置和/或主题配置来支持这么大的消息。
检查主题和代理的max.message.bytes
和message.max.bytes
配置。在这种情况下,您将获得RecordTooLargeException
您将不得不等到生产者完全产生该消息。
您需要在使用者配置中将auto.offset.reset
设置为earliest
。这样可以确保如果该主题没有偏移数据,则它将从第一条消息开始使用,否则将等待下一条消息。
您的poll
持续时间很短,您可能需要增加此时间。