我正在学习kafka流,并编写了一个简单的应用程序,如下所示:
MainApp:
Topology topology = new Topology();
topology.addSource("SOURCE", "source-topic");
topology.addProcessor("Processor1", () -> new Processor1(), "SOURCE");
topology.addProcessor("Processor2", () -> new Processor2(), "Processor1");
topology.addProcessor("Processor3", () -> new Processor3(), "Processor2");
topology.addSink("SINK", "sink-topic", "Processor3");
KafkaStreams streams = new KafkaStreams(topology, config);
streams.start();
单个流处理器的代码段:
public class Processor1 implements Processor<String, String> {
// Rest of code
@Override
public void process(String key, String value) {
System.out.println("Inside Processor1#process() method");
context.forward(key, value);
}
我了解我们需要创建Topology
,然后启动它,我们调用streams.start();
我无法理解process()
方法是如何自动调用的,以及谁调用它?
答案 0 :(得分:1)
Processor process()
类自动调用的 ProcessorContextImpl
方法在特定拓扑节点的每个传入消息上。
对于您构建的拓扑,当消息到达传入主题时,SOURCE
节点将使用它,并通过内部调用forward
方法将消息转发(传播)到子节点(您可以调试/查看代码)来自ProcessorContextImpl
类)。在您的情况下,SOURCE
节点将键和值转发到子节点Processor1
。之后,触发了类process()
中的Processor1
方法。当代码到达context.forward()
时,消息将转发到下一个子节点Processor2
。之后,该消息以类似的方式传播到Processor3
和SINK
节点,最后,消息产生到出站主题。此类用于特定消息的管道在单个线程上执行(如果您具有配置num.stream.threads = 1
的默认值,则将在每个应用程序实例的单个线程上处理所有消息)。