From 81496624a9cb718d330a3e72f01006951735188c Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 16 Jun 2016 08:52:50 +0200 Subject: [PATCH] Fixed Servlet flush Servlet flush will now occur on the next possible write if it cannot be done immediately. --- .../server/reactive/ServletHttpHandlerAdapter.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java index 3b06bd2776a..6f8bcf8ce51 100644 --- a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java @@ -247,8 +247,11 @@ public class ServletHttpHandlerAdapter extends HttpServlet { private volatile boolean completed = false; + private volatile boolean flushOnNext = false; + private Subscription subscription; + public ResponseBodySubscriber(ServletAsyncContextSynchronizer synchronizer, int bufferSize) { this.synchronizer = synchronizer; @@ -321,6 +324,12 @@ public class ServletHttpHandlerAdapter extends HttpServlet { ServletOutputStream output = synchronizer.getResponse().getOutputStream(); boolean ready = output.isReady(); + + if (flushOnNext) { + flush(output); + ready = output.isReady(); + } + logger.trace("ready: " + ready + " buffer: " + dataBuffer); if (ready) { @@ -370,9 +379,12 @@ public class ServletHttpHandlerAdapter extends HttpServlet { logger.trace("Flushing"); try { output.flush(); + flushOnNext = false; } catch (IOException ignored) { } + } else { + flushOnNext = true; } }