object MyKafkaSenderUtil {
val props = new Properties()
// Kafka服務端的主機名和端口號
props.put("bootstrap.servers", "hadoop201:9092,hadoop202:9092,hadoop203:9092")
// key序列化
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
// value序列化
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
private val producer: KafkaProducer[String, String] = new KafkaProducer[String, String](props)
def send(topic: String, content: String) = {
producer.send(new ProducerRecord[String, String](topic, content))
}
def main(args: Array[String]): Unit = {
send("order0508","chenchi")
}
}
上面是kafka生產者代碼, 看着好像沒錯,其實裏面有個大坑,
說下問題 現象,測試的時候想看能否正常生產數據到kafka,結果奇了怪了,控制檯一直不報錯,服務器上kafka一直不消費??
心想可能是kafka客戶端問題,這不簡單,直接在linux上起生產消費,結果正常
看了日誌,看了topic裏面的偏移量,沒問題呀。
後來反覆看,發現問題 是kafka沒有 produce.flush 其實是沒有producer.close
kafka是積累了一批數據到達一定的時數量或者一定時間段後會自動flush,但是我們才生產了1條數據,時間不夠,數量也不夠,所以消息全部積壓了,這個時候需要手動把消息推送到消費端,所以需要flush一下
備註:以前覺得各種連接 con.close 不關會內存泄漏,其實測試的時候不關也沒啥事,但是這個還是不好的習慣