我有一段代码迭代KStream并检查是否满足条件。在这种情况下,它会调用另一种方法来进行其他处理。代码如下所示:
stream1.foreach((k, v) -> {
if (someCondition) {
System.out.println("Triggered Join");
joinStreams();
}
}
});
现在,joinStreams()
方法的主体如下所示(仅用于测试目的)。
private static void joinStreams() {
System.out.println("Started Join");
stream2.foreach((k, v) -> System.out.println("OK"));
}
调用joinStreams()
时,它只打印“已启动加入”并永久挂起。当我从main()
直接调用它时,它会打印“Started Join”,然后打印出与流中的消息一样多的“OK”(这是它的正常行为)。
我的问题是:什么可能导致这种奇怪的结果?
P.S:正如我所理解的那样,问题出在foreach(joinStreams()
)内的foreach(来自stream1
)。
答案 0 :(得分:1)
你不能那样做。
通过调用stream1.foreach
之类的内容,您正在构建流拓扑。构建整个拓扑后,您可以使用new KafkaStreams(topology, streamingConfig).start()
。
您必须了解foreach
的主体只会在您的流处理拓扑正在执行(正在运行)时被调用。因此,使用您的代码,调用stream2.foreach
- 意味着构建拓扑 - 发生在拓扑构建和启动之后,这没有任何意义。