我正在使用KafkaConsumer来消费来自Kafka服务器(主题)的消息..
但问题是,如果动态创建的主题(我的意思是说在消费者代码启动之后)它将无法工作,但API表示它将支持动态主题创建..这是您的参考链接.. < / p>
使用的Kafka版本:0.9.0.1
https://kafka.apache.org/090/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html
这是JAVA代码......
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test");
props.put("enable.auto.commit", "false");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
Pattern r = Pattern.compile("siddu(\\d)*");
consumer.subscribe(r, new HandleRebalance());
try {
while(true) {
ConsumerRecords<String, String> records = consumer.poll(Long.MAX_VALUE);
for (TopicPartition partition : records.partitions()) {
List<ConsumerRecord<String, String>> partitionRecords = records.records(partition);
for (ConsumerRecord<String, String> record : partitionRecords) {
System.out.println(partition.partition() + ": " +record.offset() + ": " + record.value());
}
long lastOffset = partitionRecords.get(partitionRecords.size() - 1).offset();
consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(lastOffset + 1)));
}
}
} finally {
consumer.close();
}
注意:我的主题名称与正则表达式匹配。 如果我重新启动消费者,那么它将开始阅读推送到主题的消息......
真的很感激任何帮助...
答案 0 :(得分:11)
在apache kafka邮件档案中有一个答案。我在下面复制它:
消费者支持配置选项&#34; metadata.max.age.ms&#34; 这基本上控制了获取主题元数据的频率。通过 默认情况下,这设置得相当高(5分钟),这意味着需要 最多5分钟,以发现与您的常规匹配的新主题 表达。您可以将此值设置得更低,以便更快地发现主题。
所以在你的道具中你可以:
props.put("metadata.max.age.ms", 5000);
这将使您的消费者每5秒钟了解一下新主题。
答案 1 :(得分:2)
你可以挂钩Zookeeper。查看the sample code。实质上,您将在Zookeeper节点/brokers/topics
上创建一个观察程序。当在这里添加新孩子时,会添加一个新的主题,并且您的观察者将被触发。
请注意,这个和另一个答案之间的区别在于,这个是另一个是轮询的触发器 - 这一个将尽可能接近实时,另一个将在您的轮询间隔内充其量只是。
答案 2 :(得分:0)
这是使用KafkaConsumer api为我工作的解决方案。这是它的Java代码。
private static Consumer<Long, String> createConsumer(String topic) {
final Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
BOOTSTRAP_SERVERS);
props.put(ConsumerConfig.GROUP_ID_CONFIG,
"KafkaExampleConsumer");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class.getName());
// Create the consumer using props.
final Consumer<Long, String> consumer =
new KafkaConsumer<>(props);
// Subscribe to the topic.
consumer.subscribe(Collections.singletonList(topic));
return consumer;
}
public static void runConsumer(String topic) throws InterruptedException {
final Consumer<Long, String> consumer = createConsumer(topic);
ConsumerRecords<Long, String> records = consumer.poll(100);
for (ConsumerRecord<Long, String> record : records)
System.out.printf("hiiiii offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
consumer.commitAsync();
consumer.close();
//System.out.println("DONE");
}
使用此功能,我们可以使用动态创建的主题中的消息。