我有一个名为 topic1 的主题和一个名为 topic2 的主题。 我有以下代码:
- topic1 的流:
KStream<Long, byte[]> events = builder.stream("topic1", Consumed.with(Serdes.Long(), Serdes.ByteArray()));
- topic2 的表:
KTable<Long, byte[]> table = builder.table("topic2",
Consumed.with(Serdes.Long(), Serdes.ByteArray()));
当我与 topic1 的制作人一起制作时,一切都很好。 topic1 和 topic2 的值不同,我想使用此事件流将第一个主题生产者的生产记录消耗掉,然后将事件附加到第二个主题表格并保存同一关键字的第二个主题值的状态(关键字很长,第一个和第二个主题的数字相同)。换句话说,我想基于相同的键将流与表连接起来并更新表。
我的代码:
StoreBuilder<KeyValueStore<Long, byte[]>> store = Stores
.keyValueStoreBuilder(Stores.persistentKeyValueStore(STORE_TOPIC2), Serdes.Long(), Serdes.ByteArray())
.withLoggingEnabled(new HashMap<>());
builder.addStateStore(store);
events.join(table, KeyValue::new, Joined.with(Serdes.Long(), Serdes.ByteArray(), Serdes.ByteArray()))
.transform(Update::new, STORE_TOPIC2)
.to("topic2", Produced.with(Serdes.Long(), Serdes.ByteArray()));
在最后一行,我生成了对topic2的联合事件,但是在该主题上没有任何结果,我的转换器“ Update”如下所示:
private static class Update implements Transformer<Long, KeyValue<byte[], byte[]>, KeyValue<Long, byte[]>> {
private KeyValueStore<Long, byte[]> store1;
@Override
@SuppressWarnings("unchecked")
public void init(ProcessorContext context) {
store1 = (KeyValueStore<Long, byte[]>) context.getStateStore(store);
}
@Override
public KeyValue<Long, byte[]> transform(final Long key, final KeyValue<byte[], byte[]> updates) {
System.out.println("Inside event transformer for key: " + key);
System.out.println("Last produced graph: " + store.get(key));
CustomClass c = null;
try {
c = deserializeModel(store.get(key));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (c == null) {
c = new CustomClass(...);
}
try {
return KeyValue.pair(companyKey, serializeModel(companyNetwork));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}