Kafka Streams-init()中的转发记录

时间:2019-03-15 18:39:42

标签: apache-kafka apache-kafka-streams

在自定义Transformer中,我们尝试在init(..)方法中创建和转发一些记录。根据{{​​3}},这应该是可能的。但是,这不起作用,并且我们收到以下异常:

Exception in thread "my-app-0.0.16-3be1aa47-d51d-4b0c-821a-a0b850359490-StreamThread-1" org.apache.kafka.streams.errors.StreamsException: failed to initialize processor KSTREAM-TRANSFORM-0000000004
at org.apache.kafka.streams.processor.internals.ProcessorNode.init(ProcessorNode.java:95)
at org.apache.kafka.streams.processor.internals.StreamTask.initTopology(StreamTask.java:517)
at org.apache.kafka.streams.processor.internals.StreamTask.initializeTopology(StreamTask.java:267)
at org.apache.kafka.streams.processor.internals.AssignedTasks.transitionToRunning(AssignedTasks.java:253)
at org.apache.kafka.streams.processor.internals.AssignedTasks.initializeNewTasks(AssignedTasks.java:79)
at org.apache.kafka.streams.processor.internals.TaskManager.updateNewAndRestoringTasks(TaskManager.java:318)
at org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:839)
at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:777)
at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:747)
Caused by: java.lang.NullPointerException
at org.apache.kafka.streams.kstream.internals.KStreamFilter$KStreamFilterProcessor.process(KStreamFilter.java:43)
at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:115)
at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:146)
at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:129)
at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:93)

我弄错了JavaDoc,并且根本无法从init发出记录吗?

1 个答案:

答案 0 :(得分:1)

我认为,您误解了transform API。按照定义,将输入流的每个记录转换为输出流中的零个或多个记录。

在Transformer中,通过ProcessorContext获取状态.Processor接口具有init方法。init()方法传入ProcessorContext实例,该实例提供对当前处理记录的元数据的访问,包括其源Kafka主题分区,其对应的消息偏移量以及其他此类信息。

现在我们可以使用init方法访问上下文,然后可以从上下文中调用转发方法,但不能在init方法内部调用。

您可以在understand中看到此示例。希望它对您有用。