Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 春天的卡夫卡河没有';我没法写信_Spring_Spring Boot_Apache Kafka_Spring Cloud Stream - Fatal编程技术网

Spring 春天的卡夫卡河没有';我没法写信

Spring 春天的卡夫卡河没有';我没法写信,spring,spring-boot,apache-kafka,spring-cloud-stream,Spring,Spring Boot,Apache Kafka,Spring Cloud Stream,我正在编写一个SpringBoot(2.1.4)应用程序,试图为卡夫卡使用SpringCloudStreams 我想做的是维护一个主题(“传感器”)上的传感器列表。OTOH,我收到了关于另一个主题的数据(“数据”)。我试图实现的是,当我为一个我还没有的传感器获取数据时,我想将其添加到传感器列表中 为此,我从传感器主题创建了一个KTable,将温度主题映射到纯传感器的数据(在本例中为其名称),并使用ValueJoiner进行外部连接,如果存在传感器,则保留传感器,否则使用读数的传感器。然后,我将结

我正在编写一个SpringBoot(2.1.4)应用程序,试图为卡夫卡使用SpringCloudStreams

我想做的是维护一个主题(“传感器”)上的传感器列表。OTOH,我收到了关于另一个主题的数据(“数据”)。我试图实现的是,当我为一个我还没有的传感器获取数据时,我想将其添加到传感器列表中

为此,我从传感器主题创建了一个
KTable
,将温度主题映射到纯传感器的数据(在本例中为其名称),并使用
ValueJoiner
进行外部连接,如果存在传感器,则保留传感器,否则使用读数的传感器。然后,我将结果写回传感器主题

KTable<String, Sensor> sensorTable = ...;
KStream<String, SensorData> sensorDataStream = ...;

// get sensors providing measurements
KTable<String, Sensor> sensorsFromData =
        sensorDataStream.groupByKey()
                .aggregate(
                        Sensor::new,
                        (k, v, s) -> {
                            s.setName(k);
                            return s;
                        },
                        Materialized.with(Serdes.String(), SensorSerde.SERDE));

// join both sensor tables, preferring the existing ones
KTable<String, Sensor> joinedSensorTable =
        sensorTable.outerJoin(
                sensorsFromData,
                // only use sensors from measurements if sensor not already present
                (ex, ft) -> (ex != null) ? ex : ft,
                Materialized.<String, Sensor, KeyValueStore<Bytes, byte[]>>as(SENSORS_TABLE)
                        .withKeySerde(Serdes.String()).withValueSerde(SensorSerde.SERDE));

// write to new topic for downstream services
joinedSensorTable.toStream();
带着

interface SensorTableBinding {
    @Input("sensors")
    KTable<String, Sensor> sensorStream();

    @Output("sensorsOut")
    KStream<String, Sensor> sensorOutput();

    @Input("data")
    KStream<String, SensorData> sensorDataStream();
}
流被很好地初始化,并执行连接(键值存储被正确填充),但是,结果流从未写入“传感器”主题

为什么??我错过什么了吗


另外:我确信有更好的方法可以使用现有的Serde将我的对象从JSON反序列化到JSON,而不必声明我自己的类来添加到处理中(
SensorSerde
/
SensorDataSerde
ObjectMapper
的瘦委托包装器)?

结果表明数据毕竟是编写的,但是到了错误的主题,即
sensorOut

原因是配置问题。而不是

spring.cloud.stream.kafka.binder.bindings.sensors.destination: sensors
spring.cloud.stream.kafka.binder.bindings.sensorsOut.destination: sensors
主题配置如下:

spring.cloud.stream.bindings.sensors.destination: sensors
spring.cloud.stream.bindings.sensorsOut.destination: sensors
对于传感器和数据主题,这无关紧要,因为绑定的名称与主题相同;但是由于Spring无法为输出找到合适的目的地,因此它使用绑定的名称
sensorOut
,并将数据写入其中

需要注意的是,围绕这些设置的整个配置设置非常混乱。各个项目都有文档记录,但很难区分它们属于哪个配置前缀。查看源代码也无济于事,因为在这个级别上传递的是
Map
s,在运行时去掉了前缀键,因此很难判断数据来自何处以及它将包含什么


在我看来,将acual
@ConfigurationProperties
-类数据类传递出去确实会有帮助,这会使它更容易理解。

结果表明,数据毕竟是编写的,但主题是错误的,即
sensorOut

原因是配置问题。而不是

spring.cloud.stream.kafka.binder.bindings.sensors.destination: sensors
spring.cloud.stream.kafka.binder.bindings.sensorsOut.destination: sensors
主题配置如下:

spring.cloud.stream.bindings.sensors.destination: sensors
spring.cloud.stream.bindings.sensorsOut.destination: sensors
对于传感器和数据主题,这无关紧要,因为绑定的名称与主题相同;但是由于Spring无法为输出找到合适的目的地,因此它使用绑定的名称
sensorOut
,并将数据写入其中

需要注意的是,围绕这些设置的整个配置设置非常混乱。各个项目都有文档记录,但很难区分它们属于哪个配置前缀。查看源代码也无济于事,因为在这个级别上传递的是
Map
s,在运行时去掉了前缀键,因此很难判断数据来自何处以及它将包含什么


在我看来,像acual
@ConfigurationProperties
-这样的数据类的传递确实会有帮助,这会使理解变得更容易。

不确定问题出在哪里。如果你能把这些放在一个小样本中,它可以独立运行,我们可以看得更远。看起来和配置有关。@sobychacko是的,我想出来了;如果你感兴趣的话,看看我给出的答案。不确定问题出在哪里。如果你能把这些放在一个小样本中,它可以独立运行,我们可以看得更远。看起来和配置有关。@sobychacko是的,我想出来了;如果你感兴趣的话,看看我给你的答案。