Stream (卡夫卡)流-foreach内部foreach
我有一段代码,它在KStream上迭代并检查是否满足条件。在这种情况下,它调用另一个方法来执行其他处理。代码如下所示:Stream (卡夫卡)流-foreach内部foreach,stream,apache-kafka-streams,Stream,Apache Kafka Streams,我有一段代码,它在KStream上迭代并检查是否满足条件。在这种情况下,它调用另一个方法来执行其他处理。代码如下所示: stream1.foreach((k,v)->{ 如果(某些条件){ System.out.println(“触发连接”); joinStreams(); } } }); 现在,joinStreams()方法的主体如下所示(仅用于测试目的) private static void joinStreams(){ System.out.println(“已开始加入”); stre
stream1.foreach((k,v)->{
如果(某些条件){
System.out.println(“触发连接”);
joinStreams();
}
}
});
现在,joinStreams()
方法的主体如下所示(仅用于测试目的)
private static void joinStreams(){
System.out.println(“已开始加入”);
stream2.foreach((k,v)->System.out.println(“OK”);
}
调用joinStreams()
时,它只打印“已启动的连接”并永远挂起。当我从main()
直接调用它时,它会打印“startedjoin”,后面跟着与流中消息数量相同的“OK”(这是它的正常行为)。
我的问题是:是什么导致了这种奇怪的结果?
注:据我所知,问题在于foreach(来自
joinStreams()
)内部的foreach(来自stream1
)。你不能这样做
通过调用类似于stream1.foreach
,您正在构建流拓扑。一旦构建了整个拓扑,您就可以使用类似于newkafkastreams(拓扑,streamingConfig).start()的东西启动它
您必须理解,foreach
的主体只有在流处理拓扑正在执行(正在运行)时才会被调用。因此,在您的代码中,对stream2.foreach
(用于构建拓扑)的调用发生在拓扑构建和启动之后,这是没有意义的。您就是做不到这一点
通过调用类似于stream1.foreach
,您正在构建流拓扑。一旦构建了整个拓扑,您就可以使用类似于newkafkastreams(拓扑,streamingConfig).start()的东西启动它
您必须理解,foreach
的主体只有在流处理拓扑正在执行(正在运行)时才会被调用。因此,在您的代码中,对stream2.foreach
(用于构建拓扑)的调用发生在拓扑构建和启动之后,这是没有意义的。是的,解决了它。我错过了这些关于拓扑的细节。谢谢是的,这就解决了。我错过了这些关于拓扑的细节。谢谢