According to AWS support, cancelling the CompletableFuture with a timeout doesn't cancel the underline reactive stream. The solution is to rely on an AtomicBoolean to stop delivering the pages to the consumer when desired.
CompletableFuture
AtomicBoolean