diff --git a/spring-web-reactive/build.gradle b/spring-web-reactive/build.gradle index 3cb153e31c..c657c13445 100644 --- a/spring-web-reactive/build.gradle +++ b/spring-web-reactive/build.gradle @@ -23,6 +23,7 @@ dependencies { compile "org.springframework:spring-web:4.2.0.RELEASE" compile "org.reactivestreams:reactive-streams:1.0.0" compile "io.projectreactor:reactor-core:2.0.5.RELEASE" + compile "io.projectreactor:reactor-net:2.0.5.RELEASE" compile "org.slf4j:slf4j-api:1.7.6" compile "ch.qos.logback:logback-classic:1.1.2" diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/DispatcherHttpHandler.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/DispatcherHttpHandler.java index 5093586451..1d5d0da3b0 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/DispatcherHttpHandler.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/DispatcherHttpHandler.java @@ -19,10 +19,10 @@ import java.util.ArrayList; import java.util.List; import org.reactivestreams.Publisher; -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; import reactor.core.reactivestreams.PublisherFactory; import reactor.core.reactivestreams.SubscriberWithContext; +import reactor.rx.Promises; +import reactor.rx.Streams; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.context.ApplicationContext; @@ -64,64 +64,17 @@ public class DispatcherHttpHandler implements HttpHandler { } HandlerAdapter handlerAdapter = getHandlerAdapter(handler); - final Publisher resultPublisher = handlerAdapter.handle(request, response, handler); + Publisher resultPublisher = handlerAdapter.handle(request, response, handler); - return new Publisher() { - - @Override - public void subscribe(final Subscriber subscriber) { - - resultPublisher.subscribe(new Subscriber() { - - @Override - public void onSubscribe(Subscription subscription) { - subscription.request(Long.MAX_VALUE); - } - - @Override - public void onNext(HandlerResult result) { - for (HandlerResultHandler resultHandler : resultHandlers) { - if (resultHandler.supports(result)) { - Publisher publisher = resultHandler.handleResult(request, response, result); - publisher.subscribe(new Subscriber() { - @Override - public void onSubscribe(Subscription subscription) { - subscription.request(Long.MAX_VALUE); - } - - @Override - public void onNext(Void aVoid) { - // no op - } - - @Override - public void onError(Throwable error) { - // Result handling error (no exception handling mechanism yet) - subscriber.onError(error); - } - - @Override - public void onComplete() { - subscriber.onComplete(); - } - }); - } - } - } - - @Override - public void onError(Throwable error) { - // Application handler error (no exception handling mechanism yet) - subscriber.onError(error); - } - - @Override - public void onComplete() { - // do nothing - } - }); + return Streams.wrap(resultPublisher).concatMap((HandlerResult result) -> { + for (HandlerResultHandler resultHandler : resultHandlers) { + if (resultHandler.supports(result)) { + return resultHandler.handleResult(request, response, result); + } } - }; + String error = "No HandlerResultHandler for " + result.getReturnValue(); + return Promises.error(new IllegalStateException(error)); + }); } protected Object getHandler(ServerHttpRequest request) { diff --git a/spring-web-reactive/src/test/java/org/springframework/reactive/web/DispatcherApp.java b/spring-web-reactive/src/test/java/org/springframework/reactive/web/DispatcherApp.java index 1707908b17..138051c1ed 100644 --- a/spring-web-reactive/src/test/java/org/springframework/reactive/web/DispatcherApp.java +++ b/spring-web-reactive/src/test/java/org/springframework/reactive/web/DispatcherApp.java @@ -22,9 +22,8 @@ import java.util.Map; import io.netty.buffer.ByteBuf; import io.reactivex.netty.protocol.http.server.HttpServer; import org.reactivestreams.Publisher; -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; -import reactor.core.reactivestreams.PublisherFactory; +import reactor.rx.Stream; +import reactor.rx.Streams; import org.springframework.http.MediaType; import org.springframework.reactive.web.rxnetty.RequestHandlerAdapter; @@ -81,12 +80,8 @@ public class DispatcherApp { @Override public Publisher handle(ServerHttpRequest request, ServerHttpResponse response) { - return PublisherFactory.forEach((subscriber) -> { - subscriber.onNext("Hello world."); - subscriber.onComplete(); - }); + return Streams.just("Hello world."); } - } private static class PlainTextHandlerAdapter implements HandlerAdapter { @@ -97,36 +92,10 @@ public class DispatcherApp { } @Override - public Publisher handle(ServerHttpRequest request, ServerHttpResponse response, - Object handler) { - - PlainTextHandler textHandler = (PlainTextHandler) handler; - final Publisher resultPublisher = textHandler.handle(request, response); - - return PublisherFactory.forEach((subscriber) -> { - resultPublisher.subscribe(new Subscriber() { - - @Override - public void onSubscribe(Subscription subscription) { - subscription.request(Long.MAX_VALUE); - } - - @Override - public void onNext(Object result) { - subscriber.onNext(new HandlerResult(result)); - } - - @Override - public void onError(Throwable error) { - subscriber.onError(error); - } - - @Override - public void onComplete() { - subscriber.onComplete(); - } - }); - }); + public Publisher handle(ServerHttpRequest request, ServerHttpResponse response, Object handler) { + Publisher resultPublisher = ((PlainTextHandler) handler).handle(request, response); + Stream stream = Streams.wrap(resultPublisher); + return stream.concatMap((returnValue) -> Streams.just(new HandlerResult(returnValue))); } } @@ -141,11 +110,8 @@ public class DispatcherApp { @Override public Publisher handleResult(ServerHttpRequest request, ServerHttpResponse response, HandlerResult result) { response.getHeaders().setContentType(MediaType.TEXT_PLAIN); - return response.writeWith(PublisherFactory.forEach((writeSubscriber) -> { - Charset charset = Charset.forName("UTF-8"); - writeSubscriber.onNext(((String) result.getReturnValue()).getBytes(charset)); - writeSubscriber.onComplete(); - })); + byte[] bytes = ((String) result.getReturnValue()).getBytes(Charset.forName("UTF-8")); + return response.writeWith(Streams.just(bytes)); } }