Java 使用自定义时间戳提取器的Kafka流窗口
我正在尝试创建一个Kafka Streams应用程序,在该应用程序中,我试图在一个时间窗口内计算每个平台的唯一设备 事件类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
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