如果我创建并启动一个KafkaStream实例,然后在关闭钩子调用.close()中,则什么都没有发生-日志记录表明存在的一个StreamThread进入了PENDING_SHUTDOWN状态,但是永远就这样坐着。我已经尝试了所有运气-读过Kafka流源代码以查看其在关机期间的工作,但是在我看来,该代码暗示StreamThread如果处于运行状态,将永远不会停止(这可能是不对的) -我没有在Kafka JIRA中看到过这种性质的错误。
这是我简单的KafkaStream(scala)应用程序的相关代码:
val props: Properties = {
val p = new Properties()
p.put(StreamsConfig.APPLICATION_ID_CONFIG, "test-application")
p.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092")
p.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, "1")
p
}
implicit val produced = Produced.`with`(new StringSerde(), new StringSerde())
val builder: StreamsBuilder = new StreamsBuilder()
val in: KStream[String, String] = builder.stream[String, String]("input-topic")
in.map((k,v) =>{
println("Consumed and transforming value")
(k,s"$v_transformed")
}).to("output-topic")
val streams: KafkaStreams = new KafkaStreams(builder.build(), props)
streams.start()
sys.addShutdownHook(streams.stop())
如您所见,它只是从一个主题中读取内容,对使用记录中的值进行微小的更改,然后将其写入另一个主题中。
流已启动,当向其发送SIGINT时,应用程序将调用stop()。
当我^ C终止进程时,我看到Kafka日志记录指出StreamThread-1正在转换为PENDING_SHUTDOWN,这是有史以来的最高记录。它最终应该(在几秒钟之内)达到状态NOT_RUNNING,但是永远不会达到,并且它将继续输出它从输入主题中继续读取的每条记录的println语句。
我在这里做什么错了?
更新:根据评论者的建议,我尝试以60秒的超时时间调用close(),但最终还是得到了,但仍然没有关机:-
[shutdownHook1]信息o.apache.kafka.streams.KafkaStreams- 流客户端 [-] 流客户端无法在超时时间内完全停止