From 7763391e8430e3091be560f490d20aeb22db21fb Mon Sep 17 00:00:00 2001 From: Violeta Georgieva Date: Wed, 6 Jul 2016 10:14:05 +0300 Subject: [PATCH] AbstractResponseBodySubscriber improvements When the thread is writing to the response in RECEIVED.onWritePossible(), the execution may stop because isReady() returned false. In this case the buffer is partially written. When there is partially written case: 1. The state will be changed from WRITING to RECEIVED 2. A check for "write possible" will be performed: - If onWritePossible event has been already called by the web container while in WRITING state then this check will trigger RECEIVED.onWritePossible() because isReady() will be true and the writing will continue. - Otherwise the writing will be resumed when the web container sends onWritePossible event. --- .../reactive/AbstractResponseBodySubscriber.java | 11 +++++++++++ .../server/reactive/ServletHttpHandlerAdapter.java | 4 +--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractResponseBodySubscriber.java b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractResponseBodySubscriber.java index 049d74b205..ea8e28db06 100644 --- a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractResponseBodySubscriber.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractResponseBodySubscriber.java @@ -101,6 +101,16 @@ abstract class AbstractResponseBodySubscriber implements Subscriber protected void receiveBuffer(DataBuffer dataBuffer) { Assert.state(this.currentBuffer == null); this.currentBuffer = dataBuffer; + + checkOnWritePossible(); + } + + /** + * Called when a {@link DataBuffer} is received via {@link Subscriber#onNext(Object)} + * or when only partial data from the {@link DataBuffer} was written. + */ + protected void checkOnWritePossible() { + // no-op } /** @@ -238,6 +248,7 @@ abstract class AbstractResponseBodySubscriber implements Subscriber } else { subscriber.changeState(WRITING, RECEIVED); + subscriber.checkOnWritePossible(); } } catch (IOException ex) { 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 4314ec221e..0416445ffa 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 @@ -233,9 +233,7 @@ public class ServletHttpHandlerAdapter extends HttpServlet { } @Override - protected void receiveBuffer(DataBuffer dataBuffer) { - super.receiveBuffer(dataBuffer); - + protected void checkOnWritePossible() { try { if (outputStream().isReady()) { onWritePossible();