我已经在Kafka Streams中使用SessionWindows测试了简单的代码。
(Spring Cloud Stream版本:Elmhurst.SR1,kafka版本:1.0.1。)
@EnableBinding(StreamTestChanel.class)
public class MyKafkaStreamsTest {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Value("${window.session.gapSeconds:5}")
private long gapSeconds;
@Value("${window.session.durationSeconds:20}")
private long durationSeconds;
private SessionWindows sessionWindows = SessionWindows.with(TimeUnit.SECONDS.toMillis(gapSeconds)).until(TimeUnit.SECONDS.toMillis(durationSeconds));
@StreamListener(StreamTestChanel.CHANEL_INPUT)
public void process(KStream<String, MyLog> input) {
input
.groupByKey()
.windowedBy(sessionWindows)
.count() // aggregation
.toStream() // KTable to KStream
.foreach((key, count) -> {
logger.debug("## start --> window time : [{}] - [{}], key : {}({})", DateFormatUtils.format(key.window().start(), "yyyy-MM-dd HH:mm:ss.SSS"), DateFormatUtils.format(key.window().end(), "yyyy-MM-dd HH:mm:ss.SSS"), key.key(), count);
});
}
}
测试后,日志如下所示。
2018-11-14 17:22:29 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.396] - [2018-11-14 17:22:28.866], key : test15(75)
2018-11-14 17:22:34 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.396] - [2018-11-14 17:22:28.866], key : test15(null)
2018-11-14 17:22:44 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.421] - [2018-11-14 17:22:38.979], key : test06(null)
2018-11-14 17:22:44 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.421] - [2018-11-14 17:22:40.103], key : test06(165)
2018-11-14 17:22:44 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.438] - [2018-11-14 17:22:38.992], key : test01(null)
2018-11-14 17:22:45 [DEBUG](MyKafkaStreamsTest.java:52) ## start --> window time : [2018-11-14 17:22:24.438] - [2018-11-14 17:22:42.256], key : test01(165)
https://kafka.apache.org/10/documentation/streams/developer-guide/dsl-api.html#session-windows
我读过这篇文章,但我不知道为什么计数值为null,并且窗口的开始时间和结束时间重叠。 我做错了什么吗?
请帮助我。
答案 0 :(得分:0)
如果两个会话窗口合并,则首先创建一个新的合并窗口,然后删除旧的两个窗口。您看到的null
是这些删除。