Search code examples
javaspringhttpnettyhttpserver

Which is the equivalent of the old method startAndAwait in reactor.netty.http.server package?


I start learning Spring and in the tutorial from which I learn the lecturer uses the method: startAndAwait, which was in the reactor.ipc.netty.http.server.HttpServer package. Now there is no method, and the package is reactor.netty.http.server.HttpServer.

I would like to learn a solution based on the latest package, therefore my question is what will be the current equivalent of the following code:

import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.ipc.netty.http.server.HttpServer;


import static org.springframework.web.reactive.function.BodyInserters.fromObject;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;

public class HelloServerApplication {

    public static void main(String[] args)
    {
        RouterFunction route = route( GET("/"),
                request -> ServerResponse.ok().body(fromObject("Hello")));
        HttpHandler httpHandler = RouterFunctions.toHttpHandler(route);

        HttpServer server = HttpServer.create("localhost",8080);
        server.startAndAwait(new ReactorHttpHandler(httpHandler));
    }

}

I was looking for a solution, but my knowledge is so low that I can not cope alone with this problem. So far I wrote I changed the code to the place "server.startAndAwait" still can not replace this method:

package pl.javasurvival.helloServer;

import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.netty.http.server.HttpServer;


import static org.springframework.web.reactive.function.BodyInserters.fromObject;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;

public class HelloServerApplication {

    public static void main(String[] args)
    {
        RouterFunction route = route( GET("/"),
                request -> ServerResponse.ok().body(fromObject("Hello")));
        HttpHandler httpHandler = RouterFunctions.toHttpHandler(route);

        HttpServer server = HttpServer
                .create()
                .host("localhost")
                .port(8080);

        //what is a new method which is equals to startAndAwait

    }

}

PS: I forgot to add that I use gradle. This is the build.gradle file:

plugins {
    id 'org.springframework.boot' version '2.2.0.M4'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'pl.javasurvival'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/snapshot' }
    maven { url 'https://repo.spring.io/milestone' }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux:2.2.0.M4'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        exclude group: 'junit', module: 'junit'
    }
    testImplementation 'io.projectreactor:reactor-test'
}

test {
    useJUnitPlatform()
}

Solution

  • it has been a while, but I've found this question 1 hour ago and now I have solution, so it could be helpful for others.

    Without importing old version of reactor.netty, you could try this (scanner is added only for waiting for action)

    import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
    import org.springframework.web.reactive.function.server.RouterFunction;
    import org.springframework.web.reactive.function.server.RouterFunctions;
    import org.springframework.web.reactive.function.server.ServerResponse;
    import reactor.netty.http.server.HttpServer;
    
    import java.util.Scanner;
    
    import static org.springframework.web.reactive.function.BodyInserters.fromObject;
    import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
    import static org.springframework.web.reactive.function.server.RouterFunctions.route;
    
    
    public class HelloServerApplication {
    
        public static void main(String[] args) {
            RouterFunction route = route(GET("/"),
                    request -> ServerResponse.ok().body(fromObject("Hello")));
    
            var httpHandler = RouterFunctions.toHttpHandler(route);
    
            var adapter = new ReactorHttpHandlerAdapter(httpHandler);
    
            var server = HttpServer.create().host("localhost").port(8080).handle(adapter).bindNow();
    
            System.out.println("press enter");
    
            Scanner sc = new Scanner(System.in);
            sc.next();
            server.disposeNow();
        }
    }