[1] has the following code to demonstrate the usage of suppress method. KGroupedStream<UserId, Event> grouped = ...; grouped .windowedBy(TimeWindows.of(Duration.ofHours(1)).grace(ofMinutes(10))) .count() .suppress(Suppressed.untilWindowCloses(unbounded())) .filter((windowedUserId, count) -> count < 3) .toStream() .foreach((windowedUserId, count) -> sendAlert(windowedUserId.window(), windowedUserId.key(), count));
If I remove the grace method invocation, I will have a one day retention period. The following code in org.apache.kafka.streams.kstream.TimeWindows causes this hehaviour: @SuppressWarnings("deprecation") // continuing to support Windows#maintainMs/segmentInterval in fallback mode @Override public long gracePeriodMs() { // NOTE: in the future, when we remove maintainMs, // we should default the grace period to 24h to maintain the default behavior, // or we can default to (24h - size) if you want to be super accurate. return grace != null ? grace.toMillis() : maintainMs() - size(); } I think that it is better to use 0 grace period if "suppress(Suppressed.untilWindowCloses(unbounded()))" exists. With the suppress method invocation, people are expecting to see the final window result when the window closes instead of wait to see the result after the one-day period. Even if we have some reasons similar to ones mentioned in the code comment, it is better to mention this hehaviour somewhere in Kafka streams documentation. [1] http://kafka.apache.org/21/documentation/streams/developer-guide/dsl-api.html#window-final-resu -- Jingguo