如何将从一个主题创建的流连接到从另一主题派生的KTable(作为聚合操作)

时间:2019-04-17 09:24:57

标签: apache-kafka-streams

问题:如何将从TOPIC_2(在步骤2)创建的流加入到KTable stateTable(在格式的步骤1)中。

目标:在加入操作之后,如果我们更改AlarmState(KTable stateTable的值)对象的状态,则应在stateTable(step1的一部分)中反映相同的状态

在步骤1中创建了KTable(作为stateTable)(从TOPIC_1创建) 还有另一个主题TOPIC_2,其中生成了数据(在步骤2中) stateTable的密钥与TOPIC_2中的生成数据相同

第一步。

final KStream<String, MetricBasicMessage> basicMsgStream = builder.stream("TOPIC_1",
                Consumed.with(Serdes.String(), new JSONSerde<>()));

KTable <String, AlarmState> stateTable = 
         builder.stream("TOPIC_1",Consumed.with(Serdes.String(), new JSONSerde<>()))
                .flatMapValues(...)
                .filter(...)
                .map(...)
                .groupByKey(...)
                .aggregate(...);

final KafkaStreams streams = new KafkaStreams(builder.build(), <streamsConfiguration>);
        streams.start();
Runtime.getRuntime().addShutdownHook(new Thread(streams::close));

第二步。

String keyToJoinWithState = key.substring(0, index);

producer.send("TOPIC_2", keyToJoinWithState, new NotificationMessage(taskType, thresh),"NOTIIFCATION_MESSAGE");

1 个答案:

答案 0 :(得分:1)

如果要与某个表加入流,则只需调用

KStream::join(final KTable<K, VT> table, final ValueJoiner<? super V, ? super VT, ? extends VR> joiner);

会是这样的:

KStream<String, String> stream2 = builder.<String, NotificationMessage >stream("TOPIC_2", Consumed.with(Serdes.String(), new NotificationMessageSerdes()));
stream2.join(stateTable, (v1, v2) -> ??? /* How to join values from Stream and KTable */).to("output2");