Browse Source

AbstractListenerServerHttpResponse improvements

This commit changes writeWithInternal(Publisher<DataBuffer> body).
It is implemented as writeAndFlushWith(Mono.just(body)).
pull/1124/head
Violeta Georgieva 10 years ago committed by Rossen Stoyanchev
parent
commit
16939b7bc7
  1. 19
      spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerServerHttpResponse.java
  2. 43
      spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java
  3. 3
      spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java

19
spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerServerHttpResponse.java

@ -40,17 +40,7 @@ public abstract class AbstractListenerServerHttpResponse extends AbstractServerH
@Override @Override
protected final Mono<Void> writeWithInternal(Publisher<DataBuffer> body) { protected final Mono<Void> writeWithInternal(Publisher<DataBuffer> body) {
if (this.writeCalled.compareAndSet(false, true)) { return writeAndFlushWithInternal(Mono.just(body));
Processor<DataBuffer, Void> bodyProcessor = createBodyProcessor();
return Mono.from(subscriber -> {
body.subscribe(bodyProcessor);
bodyProcessor.subscribe(subscriber);
});
} else {
return Mono.error(new IllegalStateException(
"writeWith() or writeAndFlushWith() has already been called"));
}
} }
@Override @Override
@ -68,13 +58,6 @@ public abstract class AbstractListenerServerHttpResponse extends AbstractServerH
} }
} }
/**
* Abstract template method to create a {@code Processor<DataBuffer, Void>} that
* will write the response body to the underlying output. Called from
* {@link #writeWithInternal(Publisher)}.
*/
protected abstract Processor<DataBuffer, Void> createBodyProcessor();
/** /**
* Abstract template method to create a {@code Processor<Publisher<DataBuffer>, Void>} * Abstract template method to create a {@code Processor<Publisher<DataBuffer>, Void>}
* that will write the response body with flushes to the underlying output. Called from * that will write the response body with flushes to the underlying output. Called from

43
spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java

@ -22,13 +22,13 @@ import java.io.UncheckedIOException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener; import javax.servlet.WriteListener;
import javax.servlet.http.Cookie; import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.reactivestreams.Processor; import org.reactivestreams.Processor;
import org.reactivestreams.Publisher;
import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DataBufferFactory;
@ -44,7 +44,7 @@ import org.springframework.util.Assert;
*/ */
public class ServletServerHttpResponse extends AbstractListenerServerHttpResponse { public class ServletServerHttpResponse extends AbstractListenerServerHttpResponse {
private final AtomicBoolean listenerRegistered = new AtomicBoolean(); private final ResponseBodyWriteListener writeListener = new ResponseBodyWriteListener();
private volatile ResponseBodyProcessor bodyProcessor; private volatile ResponseBodyProcessor bodyProcessor;
@ -112,15 +112,17 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
} }
} }
private void registerListener() throws IOException { private void registerListener() {
if (this.listenerRegistered.compareAndSet(false, true)) { try {
ResponseBodyWriteListener writeListener = new ResponseBodyWriteListener(); outputStream().setWriteListener(writeListener);
this.response.getOutputStream().setWriteListener(writeListener); }
catch (IOException e) {
throw new UncheckedIOException(e);
} }
} }
private void flush() throws IOException { private void flush() throws IOException {
ServletOutputStream outputStream = this.response.getOutputStream(); ServletOutputStream outputStream = outputStream();
if (outputStream.isReady()) { if (outputStream.isReady()) {
try { try {
outputStream.flush(); outputStream.flush();
@ -136,22 +138,15 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
} }
} }
@Override private ServletOutputStream outputStream() throws IOException {
protected ResponseBodyProcessor createBodyProcessor() { return this.response.getOutputStream();
try {
registerListener();
this.bodyProcessor = new ResponseBodyProcessor(this.response.getOutputStream(),
this.bufferSize);
return this.bodyProcessor;
}
catch (IOException ex) {
throw new UncheckedIOException(ex);
}
} }
@Override @Override
protected AbstractResponseBodyFlushProcessor createBodyFlushProcessor() { protected Processor<Publisher<DataBuffer>, Void> createBodyFlushProcessor() {
return new ResponseBodyFlushProcessor(); Processor<Publisher<DataBuffer>, Void> processor = new ResponseBodyFlushProcessor();
registerListener();
return processor;
} }
private class ResponseBodyProcessor extends AbstractResponseBodyProcessor { private class ResponseBodyProcessor extends AbstractResponseBodyProcessor {
@ -238,7 +233,13 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
@Override @Override
protected Processor<DataBuffer, Void> createBodyProcessor() { protected Processor<DataBuffer, Void> createBodyProcessor() {
return ServletServerHttpResponse.this.createBodyProcessor(); try {
bodyProcessor = new ResponseBodyProcessor(outputStream(), bufferSize);
return bodyProcessor;
}
catch (IOException ex) {
throw new UncheckedIOException(ex);
}
} }
@Override @Override

3
spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java

@ -123,8 +123,7 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
} }
} }
@Override private ResponseBodyProcessor createBodyProcessor() {
protected ResponseBodyProcessor createBodyProcessor() {
if (this.responseChannel == null) { if (this.responseChannel == null) {
this.responseChannel = this.exchange.getResponseChannel(); this.responseChannel = this.exchange.getResponseChannel();
} }

Loading…
Cancel
Save