问题:如何将从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");
答案 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");