Browse Source

Early registration of WriteListener

At present Tomcat expects a WriteListener to be registered immediately
on the initial thread so for the time being this commit ensures the
WriteListener is registered unconditionally for every request.

Issue: SPR-14772, SPR-14803
pull/1215/head
Rossen Stoyanchev 9 years ago
parent
commit
5c9c5e0b45
  1. 1
      spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java
  2. 10
      spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java

1
spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java

@ -69,6 +69,7 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest { @@ -69,6 +69,7 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest {
Assert.notNull(bufferFactory, "'bufferFactory' must not be null");
Assert.isTrue(bufferSize > 0, "'bufferSize' must be higher than 0");
this.request = request;
this.dataBufferFactory = bufferFactory;
this.bufferSize = bufferSize;

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

@ -61,11 +61,16 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons @@ -61,11 +61,16 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
DataBufferFactory dataBufferFactory, int bufferSize) throws IOException {
super(dataBufferFactory);
Assert.notNull(response, "HttpServletResponse must not be null");
Assert.notNull(dataBufferFactory, "DataBufferFactory must not be null");
Assert.isTrue(bufferSize > 0, "Buffer size must be higher than 0");
this.response = response;
this.bufferSize = bufferSize;
// Tomcat expects WriteListener registration on initial thread
registerListener();
}
@ -119,14 +124,13 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons @@ -119,14 +124,13 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
@Override
protected Processor<Publisher<DataBuffer>, Void> createBodyFlushProcessor() {
ResponseBodyFlushProcessor processor = new ResponseBodyFlushProcessor();
registerListener();
bodyFlushProcessor = processor;
this.bodyFlushProcessor = processor;
return processor;
}
private void registerListener() {
try {
outputStream().setWriteListener(writeListener);
outputStream().setWriteListener(this.writeListener);
}
catch (IOException ex) {
throw new UncheckedIOException(ex);

Loading…
Cancel
Save