(卡夫卡)溪流 - foreach内的foreach

时间:2018-03-22 09:01:40

标签: stream apache-kafka-streams

我有一段代码迭代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)。

1 个答案:

答案 0 :(得分:1)

你不能那样做。

通过调用stream1.foreach之类的内容,您正在构建流拓扑。构建整个拓扑后,您可以使用new KafkaStreams(topology, streamingConfig).start()

之类的东西来启动它

您必须了解foreach的主体只会在您的流处理拓扑正在执行(正在运行)时被调用。因此,使用您的代码,调用stream2.foreach - 意味着构建拓扑 - 发生在拓扑构建和启动之后,这没有任何意义。