Apache kafka 如何在Spring Cloud Kafka Streams应用程序中执行flatTransform?
我正在尝试在Spring Cloud Kafka Streams应用程序中执行Apache kafka 如何在Spring Cloud Kafka Streams应用程序中执行flatTransform?,apache-kafka,apache-kafka-streams,spring-kafka,spring-cloud-stream,spring-cloud-stream-binder-kafka,Apache Kafka,Apache Kafka Streams,Spring Kafka,Spring Cloud Stream,Spring Cloud Stream Binder Kafka,我正在尝试在Spring Cloud Kafka Streams应用程序中执行flatTransform。但我不确定将kafkastreamssstatestore注释放在哪里。目前我收到错误:拓扑无效:尚未添加StateStore activeInstruments。如果有人能给我一些指导,我将非常感激 @SpringBootApplication public class InstrumentsApp { public static void main(String[] args) {
flatTransform
。但我不确定将kafkastreamssstatestore
注释放在哪里。目前我收到错误:拓扑无效:尚未添加StateStore activeInstruments
。如果有人能给我一些指导,我将非常感激
@SpringBootApplication
public class InstrumentsApp {
public static void main(String[] args) {
SpringApplication.run(InstrumentsApp.class, args);
}
public static class InstrumentsConsumer {
@Bean
public Serde<InstrumentsRes> instrumentsResSerde() {
ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
mapper.registerModule(new JavaTimeModule());
mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
return new JsonSerde<>(InstrumentsRes.class, mapper);
}
@Bean
public Serde<Instrument> instrumentSerde() {
ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
mapper.registerModule(new JavaTimeModule());
mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
return new JsonSerde<>(Instrument.class, mapper);
}
@Bean
@KafkaStreamsStateStore(name = "activeInstruments",
type = KafkaStreamsStateStoreProperties.StoreType.KEYVALUE)
public Consumer<KStream<String, InstrumentsRes>> process() {
return instruments -> instruments.flatTransform(
new TransformerSupplier<String, InstrumentsRes, Iterable<KeyValue<String, Instrument>>>() {
public Transformer<String, InstrumentsRes, Iterable<KeyValue<String, Instrument>>> get() {
return new Transformer<String, InstrumentsRes, Iterable<KeyValue<String, Instrument>>>() {
private ProcessorContext context;
private KeyValueStore<String, InstrumentsRes> state;
@SuppressWarnings("unchecked")
@Override
public void init(ProcessorContext context) {
this.context = context;
this.state = (KeyValueStore<String, InstrumentsRes>) context
.getStateStore("activeInstruments");
}
@Override
public Iterable<KeyValue<String, Instrument>> transform(String key,
InstrumentsRes value) {
List<KeyValue<String, Instrument>> result = new ArrayList<>();
for (Instrument instrument : value.result) {
result.add(KeyValue.pair(instrument.instrumentName, instrument));
}
InstrumentsRes prevValue = state.get(key);
if (prevValue != null) {
HashSet<String> prevInstrumentNames = value.getInstrumentNames();
HashSet<String> newInstrumentNames = value.getInstrumentNames();
prevInstrumentNames.removeAll(newInstrumentNames);
for (String instrumentName : prevInstrumentNames) {
result.add(KeyValue.pair(instrumentName, null));
}
}
state.put(key, value);
return result;
}
public void close() {
}
};
}
}, "activeInstruments");
}
}
}
@springboot应用程序
公共类工具{
公共静态void main(字符串[]args){
run(InstrumentsApp.class,args);
}
公共静态类工具使用者{
@豆子
公共Serde仪器资源数据库(){
ObjectMapper mapper=newObjectMapper(newMessagePackFactory());
registerModule(新的JavaTimeModule());
configure(反序列化功能。读取\u日期\u时间戳\u为\u纳秒,false);
返回新的JsonSerde(InstrumentsRes.class,mapper);
}
@豆子
公共Serde仪器Serde(){
ObjectMapper mapper=newObjectMapper(newMessagePackFactory());
registerModule(新的JavaTimeModule());
configure(反序列化功能。读取\u日期\u时间戳\u为\u纳秒,false);
configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_为_纳秒,false);
返回新的JsonSerde(Instrument.class,mapper);
}
@豆子
@KafkaStreamsStateStore(name=“activeInstruments”,
type=KafkaStreamsStateStoreProperties.StoreType.KEYVALUE)
公共消费者过程(){
返回仪器->仪器.flatTransform(
新的变压器供应商(){
公共变压器get(){
返回新变压器(){
私有处理器上下文上下文;
私钥存储状态;
@抑制警告(“未选中”)
@凌驾
公共void init(ProcessorContext上下文){
this.context=上下文;
this.state=(KeyValueStore)上下文
.getStateStore(“activeInstruments”);
}
@凌驾
公共Iterable转换(字符串键,
仪表(S值){
列表结果=新建ArrayList();
用于(仪器:值。结果){
添加(KeyValue.pair(instrument.instrumentName,instrument));
}
InstrumentsRes prevValue=state.get(键);
if(prevValue!=null){
HashSet-prevInstrumentNames=value.getInstrumentNames();
HashSet newInstrumentNames=value.getInstrumentNames();
prevInstrumentNames.removeAll(newInstrumentNames);
对于(字符串instrumentName:PrevInstrumentName){
add(KeyValue.pair(instrumentName,null));
}
}
state.put(键、值);
返回结果;
}
公众假期结束(){
}
};
}
}“有效工具”);
}
}
}
为了回答我自己的问题,我认为kafkastreamssstatestore
注释现在已被弃用:
现在我已经创建了一个类型为StoreBuilder
的bean,正如注释中所建议的那样,一切都按照预期工作