Kafka Streams不会触发连接流的输出?

时间:2018-04-27 03:42:18

标签: apache-kafka-streams spring-cloud-stream confluent-kafka

我有来自3个mysql表的原始流,1个主表和2个子表。我尝试加入三个原始流并转换为单个输出流。如果父流上有任何更新,但如果子流上有任何更改,则无法触发输出。

    @StreamListener
    public Stream<Long, Output> handleStreams(@Input KStream<Long, Parent> parentStream,
    @Input KStream<Long, Child1> child1Stream,
    @Input KStream<Long, Child2> child2Stream) {

    KTable<Long, Parent> parentTable = convertParent(parentStream);
    KTable<Long, ArrayList<Child1>> child1Table = convertChild1(parentStream);
    KTable<Long, ArrayList<Child2>> child2Table = convertChild2(parentStream);

    parentTable
           .leftJoin(child1Table, (parent, child1List) -> new Output(k, v))
           .leftJoin(child2Table, (output, child2List) -> output.setChild2List(child2List))
           .toStream()
        }

父流上的任何新添加或更新都会被处理器拾取并将其与其他KTable连接并在输出流上返回。但是,child1stream或child2stream上的任何添加或更新都不会触发输出流。

我认为将所有输入流都设置为KTable,它们将始终存储更改,因为它们都具有相同的密钥,并且父表或子表上的任何更新都将被接收到连接。但它没有发生,任何人都可以提出我在这里缺少的东西吗?

我已经尝试过KStream-KStream,Stream-KTable,KTable-KTable连接,但在子更新的情况下都没有。

-Thanks

2 个答案:

答案 0 :(得分:2)

您能否显示EnableBinding以及您要绑定的处理器界面?

这对我来说不合适:

@StreamListener
    public Stream<Long, Output> handleStreams(@Input KStream<Long, Parent> parentStream,
    @Input KStream<Long, Child1> child1Stream,
    @Input KStream<Long, Child2> child2Stream) {

您没有在输入上指定绑定。当你有多个输入时,你需要有这样的东西:

@StreamListener
        public Stream<Long, Output> handleStreams(@Input("input1") KStream<Long, Parent> parentStream,
        @Input("input2") KStream<Long, Child1> child1Stream,
        @Input("input3") KStream<Long, Child2> child2Stream) {

每个输入都需要在处理器界面中定义。请参阅此处以获取示例:https://github.com/spring-cloud/spring-cloud-stream-samples/blob/master/kafka-streams-samples/kafka-streams-table-join/src/main/java/kafka/streams/table/join/KafkaStreamsTableJoin.java#L46

答案 1 :(得分:0)

注意如何使用与parentTable相同的流创建子表:

KTable<Long, ArrayList<Child1>> child1Table = convertChild1(parentStream);
KTable<Long, ArrayList<Child2>> child2Table = convertChild2(parentStream);

不确定convertChild1和convertChild2方法的作用,但是它们不应该分别作为参数给出child1Stream和child2Stream吗?