2016-11-27 4 views
0

Netty Server Instanziierung in Arjen Poutsma's blog post und Josh Long's video example durch die Schaffung eines reactor.ipc.netty.http.HttpServer Instanz durchgeführt wird und dann ruft es start oder startAndAwait Methode mit einem ReactorHttpHandlerAdapter Instanz als Argument.Netty Httpserver api geändert/unterscheidet sich von verfügbaren Beispiele

Allerdings scheint die API wie jetzt start und startAndAwait Methoden nun eine Lambda mit der folgenden Signatur erwartet geändert zu haben:

java.util.function.Function<? super reactor.ipc.netty.http.HttpChannel,? extends org.reactivestreams.Publisher<java.lang.Void>> 

Projektabhängigkeiten und die Versionen die gleichen wie in Arjen Poutsma des Beispielprojekt sind

<dependency> 
     <groupId>org.reactivestreams</groupId> 
     <artifactId>reactive-streams</artifactId> 
     <version>1.0.0</version> 
    </dependency> 
    <dependency> 
     <groupId>io.projectreactor</groupId> 
     <artifactId>reactor-core</artifactId> 
     <version>3.0.3.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>io.projectreactor.ipc</groupId> 
     <artifactId>reactor-netty</artifactId> 
     <version>0.5.2.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat.embed</groupId> 
     <artifactId>tomcat-embed-core</artifactId> 
     <version>8.5.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web-reactive</artifactId> 
     <version>5.0.0.BUILD-SNAPSHOT</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.2</version> 
    </dependency> 

Was ist die neue/richtige Art, einen Netty-Server mit Federreaktorunterstützung zu instantiieren?

Antwort

1

Die empfohlene Methode, um ein Projekt einzurichten, ist die Verwendung von , wie Josh Long in seinem Video vorschlägt. Dies liegt daran, Feder reaktiv nur Release Candidate jetzt, und wir müssen kompatible Versionen über das Hinzufügen dieses Stück Code samples.This erreicht auszuführen:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot.experimental</groupId> 
      <artifactId>spring-boot-dependencies-web-reactive</artifactId> 
      <version>0.1.0.BUILD-SNAPSHOT</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Nach Ihre Frage zu Httpserver-Schnittstelle ändern, die minimale Arbeitsbeispiel ist die folgende:

import org.reactivestreams.Publisher; 
import org.springframework.http.server.reactive.HttpHandler; 
import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; 
import org.springframework.web.reactive.function.RouterFunction; 
import org.springframework.web.reactive.function.ServerRequest; 
import org.springframework.web.reactive.function.ServerResponse; 
import reactor.core.publisher.Mono; 
import reactor.ipc.netty.http.server.HttpServer; 

import java.io.IOException; 

import static org.springframework.web.reactive.function.RequestPredicates.GET; 
import static org.springframework.web.reactive.function.RouterFunctions.route; 
import static org.springframework.web.reactive.function.RouterFunctions.toHttpHandler; 

public class FunctionalReactiveServer { 

    public static final String HOST = "localhost"; 
    public static final int PORT = 8080; 

    public static void main(String[] args) throws InterruptedException, IOException { 
     RouterFunction<?> route = route(GET("/sayHello"), FunctionalReactiveServer::sayHelloHandler); 
     HttpHandler httpHandler = toHttpHandler(route); 

     ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler); 
     HttpServer server = HttpServer.create(HOST, PORT); 
     server.newHandler(adapter).block(); 

     System.out.println("Press ENTER to exit."); 
     System.in.read(); 
    } 

    public static ServerResponse<Publisher<String>> sayHelloHandler(ServerRequest request) { 
     return ServerResponse.ok().body(Mono.just("Hello!"), String.class); 
    } 

}