我是kafka的新手,并且想使用Kafka 2.3来实现生产者/消费者应用程序。
kafka-console-consumer
来检查此主题,成功地获得了该主题的价值,但没有得到我的消费者。那么我的消费者怎么了?
package com.phitrellis.tool
import java.util.Properties
import java.util.concurrent.{Future, TimeUnit}
import org.apache.kafka.clients.consumer.KafkaConsumer
import org.apache.kafka.clients.producer._
object MyKafkaProducer extends App {
def createKafkaProducer(): Producer[String, String] = {
val props = new Properties()
props.put("bootstrap.servers", "*:9092")
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("producer.type", "async")
props.put("acks", "all")
new KafkaProducer[String, String](props)
}
def writeToKafka(topic: String): Unit = {
val producer = createKafkaProducer()
val record = new ProducerRecord[String, String](topic, "key", "value22222222222")
println("start")
producer.send(record)
producer.close()
println("end")
}
writeToKafka("phitrellis")
}
package com.phitrellis.tool
import java.util
import java.util.Properties
import java.time.Duration
import scala.collection.JavaConverters._
import org.apache.kafka.clients.consumer.KafkaConsumer
object MyKafkaConsumer extends App {
def createKafkaConsumer(): KafkaConsumer[String, String] = {
val props = new Properties()
props.put("bootstrap.servers", "*:9092")
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
// props.put("auto.offset.reset", "latest")
props.put("enable.auto.commit", "true")
props.put("auto.commit.interval.ms", "1000")
props.put("group.id", "test")
new KafkaConsumer[String, String](props)
}
def consumeFromKafka(topic: String) = {
val consumer: KafkaConsumer[String, String] = createKafkaConsumer()
consumer.subscribe(util.Arrays.asList(topic))
while (true) {
val records = consumer.poll(Duration.ofSeconds(2)).asScala.iterator
println("true")
for (record <- records){
print(record.value())
}
}
}
consumeFromKafka("phitrellis")
}
答案 0 :(得分:2)
消费者代码中的两行至关重要:
props.put("auto.offset.reset", "latest")
props.put("group.id", "test")
要从主题开始进行阅读,必须将auto.offset.reset
设置为earliest
(latest
会导致在使用者启动之前跳过生成的消息)。
group.id
负责组管理。如果您开始使用某些group.id
处理数据,然后重新启动应用程序或使用相同的group.id
重新启动应用程序,则只会读取新消息。
对于您的测试,我建议添加auto.offset.reset
-> earliest
并更改group.id
props.put("auto.offset.reset", "earliest")
props.put("group.id", "test123")
其他:
您必须记住,KafkaProducer::send
返回Future<RecordMetadata>
并且消息是异步发送的,如果您在Future
将结束消息之前编程已完成,则可能不会发送消息。
答案 1 :(得分:0)
这里有两个部分。生产方和消费者。
关于生产者,您什么也没说,因此我们假设它确实起作用。但是,您是否检查了服务器?您可以检查kafka日志文件,以查看有关这些特定主题/分区的任何数据。
在使用者方面,要进行验证,您应该尝试使用同一主题的命令行进行使用,以确保数据在那里。在下面的链接中找到“ Kafka Consumer Console”,然后执行这些步骤。
http://cloudurable.com/blog/kafka-tutorial-kafka-from-command-line/index.html
如果有关该主题的数据,那么运行该命令应该可以获取数据。如果不是,那么它将只是“挂起”,因为它正在等待将数据写入该主题。
此外,您可以尝试使用这些命令行工具生成相同的主题,以确保群集配置正确,具有正确的地址和端口,未阻塞端口等。