Async boundary for Spring MVC reactive type streaming

Issue: SPR-15365
This commit is contained in:
Rossen Stoyanchev
2017-04-04 10:12:02 -04:00
parent af6f688196
commit d9221fb87d
8 changed files with 156 additions and 37 deletions

View File

@@ -34,6 +34,7 @@ import rx.SingleEmitter;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.core.ResolvableType;
import org.springframework.core.task.SyncTaskExecutor;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.http.server.ServletServerHttpResponse;
@@ -75,7 +76,7 @@ public class ReactiveTypeHandlerTests {
ContentNegotiationManagerFactoryBean factoryBean = new ContentNegotiationManagerFactoryBean();
factoryBean.afterPropertiesSet();
ContentNegotiationManager manager = factoryBean.getObject();
this.handler = new ReactiveTypeHandler(new ReactiveAdapterRegistry(), manager);
this.handler = new ReactiveTypeHandler(new ReactiveAdapterRegistry(), new SyncTaskExecutor(), manager);
resetRequest();
}

View File

@@ -26,6 +26,8 @@ import org.junit.Test;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.core.task.SyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
@@ -66,8 +68,9 @@ public class ResponseBodyEmitterReturnValueHandlerTests {
new StringHttpMessageConverter(), new MappingJackson2HttpMessageConverter());
ReactiveAdapterRegistry registry = new ReactiveAdapterRegistry();
TaskExecutor executor = new SyncTaskExecutor();
ContentNegotiationManager manager = new ContentNegotiationManager();
this.handler = new ResponseBodyEmitterReturnValueHandler(converters, registry, manager);
this.handler = new ResponseBodyEmitterReturnValueHandler(converters, registry, executor, manager);
this.request = new MockHttpServletRequest();
this.response = new MockHttpServletResponse();
this.webRequest = new ServletWebRequest(this.request, this.response);

View File

@@ -30,6 +30,7 @@ import reactor.core.publisher.Flux;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.core.annotation.AliasFor;
import org.springframework.core.task.SyncTaskExecutor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
@@ -254,9 +255,11 @@ public class ServletInvocableHandlerMethodTests {
@Test
public void wrapConcurrentResult_ResponseBodyEmitter() throws Exception {
ReactiveAdapterRegistry registry = new ReactiveAdapterRegistry();
ContentNegotiationManager manager = new ContentNegotiationManager();
this.returnValueHandlers.addHandler(new ResponseBodyEmitterReturnValueHandler(this.converters, registry, manager));
this.returnValueHandlers.addHandler(
new ResponseBodyEmitterReturnValueHandler(this.converters,
new ReactiveAdapterRegistry(), new SyncTaskExecutor(), new ContentNegotiationManager()));
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new StreamingHandler(), "handleEmitter");
handlerMethod = handlerMethod.wrapConcurrentResult(null);
handlerMethod.invokeAndHandle(this.webRequest, this.mavContainer);