我有来自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
答案 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吗?