Spring 春天的卡夫卡河没有';我没法写信
我正在编写一个SpringBoot(2.1.4)应用程序,试图为卡夫卡使用SpringCloudStreams 我想做的是维护一个主题(“传感器”)上的传感器列表。OTOH,我收到了关于另一个主题的数据(“数据”)。我试图实现的是,当我为一个我还没有的传感器获取数据时,我想将其添加到传感器列表中 为此,我从传感器主题创建了一个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进行外部连接,如果存在传感器,则保留传感器,否则使用读数的传感器。然后,我将结
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是的,我想出来了;如果你感兴趣的话,看看我给你的答案。