Kafka Streams聚合有状态的物联网数据

时间:2019-10-01 01:24:25

标签: java apache-kafka apache-kafka-streams

我有传入的汽车数据,想创建一个新的旅程事件。我收到来自车辆事件主题的以下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();
}

}

0 个答案:

没有答案