我有传入的汽车数据,想创建一个新的旅程事件。我收到来自车辆事件主题的以下json消息:
{ asset_id: ‘123’, location: [11.00, 12.00], journey_start: true }
{ asset_id: ‘123’, location: [12.00, 12.00] }
{ asset_id: ‘123’, location: [13.00, 12.00], journey_end: true }
从旅程事件开始到旅程事件结束,它应该收集位置,如果旅程结束,则应该将其发送到旅程事件主题。对于上一个示例,消息应为
{ asset_id: ‘123’, locations: [[11.00, 12.00], [12.00, 12.00], [13.00, 12.00]] }
一旦发生新的旅程开始事件,它应该从本地商店中丢弃先前的旅程事件。
这是我到目前为止所拥有的。我不知道如何进行汇总,添加条件以推送至“旅途事件”主题以及删除旧的位置数据:
public class Stream {
public static void main(String[] args) {
Properties config = new Properties();
config.put(StreamsConfig.APPLICATION_ID_CONFIG, "stream");
config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
config.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, StreamsConfig.EXACTLY_ONCE);
final Serializer<JsonNode> jsonSerializer = new JsonSerializer();
final Deserializer<JsonNode> jsonDeserializer = new JsonDeserializer();
final Serde<JsonNode> jsonSerde = Serdes.serdeFrom(jsonSerializer, jsonDeserializer);
StreamsBuilder builder = new StreamsBuilder();
KStream<String, JsonNode> vehicleEvent = builder.stream(
"vehicle-event",
Consumed.with(
Serdes.String(),
jsonSerde
)
);
KStream<String, JsonNode> journeyEvent = vehicleEvent
.groupBy((key, value) -> {
JSONObject jsonObj = new JSONObject(value);
return jsonObj.getString("asset_id");
})
.aggregate()
Topology topology = builder.build();
KafkaStreams streams = new KafkaStreams(topology, config);
streams.start();
}
}