Apache kafka 无法使用Spring Cloud Streaming在Kafka Ktable中查看任何消息

Apache kafka 无法使用Spring Cloud Streaming在Kafka Ktable中查看任何消息,apache-kafka,spring-kafka,spring-cloud-stream,Apache Kafka,Spring Kafka,Spring Cloud Stream,我使用SpringCloudStreamingAPI编写了一个Kafka streams应用程序,但在KTable中看不到任何消息。我无法追踪这个问题。任何指点或帮助都将不胜感激 下面是代码 import java.util.function.Function; import org.apache.kafka.common.utils.Bytes; import org.apache.kafka.streams.kstream.KStream; import org.apache.kafka.s

我使用SpringCloudStreamingAPI编写了一个Kafka streams应用程序,但在KTable中看不到任何消息。我无法追踪这个问题。任何指点或帮助都将不胜感激

下面是代码

import java.util.function.Function;
import org.apache.kafka.common.utils.Bytes;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KTable;
import org.apache.kafka.streams.kstream.Materialized;
import org.apache.kafka.streams.state.KeyValueStore;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class KafkaStreamsSample {

    public static void main(String[] args) {
        SpringApplication.run(KafkaStreamsSample.class, args);
    }

        //bin/confluent local produce user -- --property parse.key=true --property key.separator=~
        //2~{"id": "2", "name": "john", "age": 43}
        //1~{"id": "1", "name": "bob", "age": 44}
        //3~{"id": "3", "name": "peter", "age": 45}
        //4~{"id": "4", "name": "mark", "age": 46}
        //2~{"id": "2", "name": "john", "age": 99}
        //3~{"id": "3", "name": "paul", "age": 98}

    public static class KStreamToTableJoinApplication {

        @Bean
        public Function<KStream<String, User>, KTable<String, User>> process() {


                return input -> input
                .groupByKey()
                .reduce((aggValue, newValue) -> newValue, Materialized.as ("allusers"));
        }
    }
}

使用Spring Cloud Stream Kafka Streams活页夹,您不能将出站作为
KTable
。它必须是
KStream
。将您的签名更改为:
公共功能
。然后,在
reduce
调用中调用
toStream()。这将为您返回一个
KStream
。这将允许您在出站主题中查看输出。
reduce
操作的结果通过
KTable
具体化到状态存储中。因此,如果您愿意,可以通过交互式查询直接查询该状态存储

使用Spring Cloud Stream Kafka Streams活页夹,您不能将出站作为
KTable
。它必须是
KStream
。将您的签名更改为:
公共功能
。然后,在
reduce
调用中调用
toStream()。这将为您返回一个
KStream
。这将允许您在出站主题中查看输出。
reduce
操作的结果通过
KTable
具体化到状态存储中。因此,如果您愿意,可以通过交互式查询直接查询该状态存储

谢谢你@sobychacko。是的,作为流,我能够看到输出。我怀疑状态存储的配置可能是错误的。这是创建db更改缓存的正确方法吗?在不知道实际用例的情况下,不确定这里的db更改是什么意思,但是当您调用
reduce
方法并具体化到指定的状态存储时,这些更改将作为键/值对持久化到状态存储中。对于提供的有限信息,我深表歉意。基本上,我试图模拟一个用例,其中输入事件是一个数据库更改,它按键分组,并作为更改数据的缓存存储在状态存储中。但是当输入事件是部分的时,上面的代码不起作用。ktable是否支持部分更新?如有任何建议,我们将不胜感激。谢谢你说的部分是什么意思?我建议开始一个新的话题,因为原来的问题已经解决了。谢谢,我在这里开始了另一个问题谢谢@sobychacko。是的,作为流,我能够看到输出。我怀疑状态存储的配置可能是错误的。这是创建db更改缓存的正确方法吗?在不知道实际用例的情况下,不确定这里的db更改是什么意思,但是当您调用
reduce
方法并具体化到指定的状态存储时,这些更改将作为键/值对持久化到状态存储中。对于提供的有限信息,我深表歉意。基本上,我试图模拟一个用例,其中输入事件是一个数据库更改,它按键分组,并作为更改数据的缓存存储在状态存储中。但是当输入事件是部分的时,上面的代码不起作用。ktable是否支持部分更新?如有任何建议,我们将不胜感激。谢谢你说的部分是什么意思?我建议开始一个新的线程,因为原来的问题已经解决了。谢谢,我在这里开始了另一个问题
spring.application.name: stream-global-sample
spring.cloud.stream.bindings.process-in-0:
  destination: user
spring.cloud.stream.bindings.process-out-0:
  destination: usertable
spring.cloud.stream.kafka.streams.bindings.process-out-0:
  producer:
    materializedAs: allusers