Java 使用自定义时间戳提取器的Kafka流窗口

Java 使用自定义时间戳提取器的Kafka流窗口,java,apache-kafka,apache-kafka-streams,stream-processing,Java,Apache Kafka,Apache Kafka Streams,Stream Processing,我正在尝试创建一个Kafka Streams应用程序,在该应用程序中,我试图在一个时间窗口内计算每个平台的唯一设备 事件类 public class Event { private String eventId; private String deviceId; private String platform; private ZonedDateTime createdAt; } 我需要时间窗口尊重事件的createdAt,因此我编写了一个TimestampEx

我正在尝试创建一个Kafka Streams应用程序,在该应用程序中,我试图在一个时间窗口内计算每个平台的唯一设备

事件类

public class Event {
    private String eventId;
    private String deviceId;
    private String platform;
    private ZonedDateTime createdAt;
}
我需要时间窗口尊重事件的createdAt,因此我编写了一个
TimestampExtractor
实现,如下所示:

public class EventTimestampExtractor implements TimestampExtractor {
    @Override
    public long extract(final ConsumerRecord<Object, Object> record, final long previousTimestamp) {
        final Event event = (Event) record.value();
        final ZonedDateTime eventCreationTime = event.getCreatedAt();
        final long timestamp = eventCreationTime.toEpochSecond();

        log.trace("Event ({}) yielded timestamp: {}", event.getEventId(), timestamp);

        return timestamp;
    }
}
虽然我的时间窗口是15分钟,但关键是10天。如果我从stream config中删除TimestampExtractor实现(因此返回到处理时间),则密钥将如预期的那样跨越15分钟:

Key: [ANDROID::1@1539256500000/1539257400000], Value: 1

我做错了什么?有什么想法吗?

TimestampExtractor使用历元毫秒值进行窗口设置。您正在计算“秒”,这会将消息放入错误的时间窗口。

TimestampExtractor使用历元毫秒值进行窗口设置。您正在计算“秒”,这会将消息放入错误的时间窗口

Key: [ANDROID::1@1539000000/1539900000], Value: 2
Key: [ANDROID::1@1539256500000/1539257400000], Value: 1