Не удается запустить сервер Netty в Spring Webflux 2.1.0.RELEASE - PullRequest
0 голосов
/ 22 ноября 2018

В моем Java-приложении я использую Spring Webflux в качестве зависимости, например:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
</dependencies>

С версией 2.0.6.RELEASE я могу запустить сервер Netty с этим кодом:

public static void main(String[] args) {
    RouterFunction<?> route;
    route = route(GET("/hello"),
            request -> {
                Mono<String> hi = Mono.just("hi");
                return ServerResponse.ok().contentType(TEXT_PLAIN).body(hi, String.class);
            });
    HttpHandler httpHandler = RouterFunctions.toHttpHandler(route);
    ReactorHttpHandlerAdapter adapter =
            new ReactorHttpHandlerAdapter(httpHandler);
    HttpServer server = HttpServer.create("localhost", 8080);
    server.startAndAwait(adapter);
}

, нов 2.1.0 он не компилируется.Я также попробовал что-то подобное, но все еще не могу заставить его работать.

    HttpServer
            .create()
            .host("localhost")
            .port(8080)
            .handle(adapter)
            .bind()
            .block();

Как запустить сервер Netty?

https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-httphandler https://projectreactor.io/docs/netty/release/api/

1 Ответ

0 голосов
/ 22 ноября 2018

Вам не нужно вручную запускать сервер в приложении Spring Boot, вы можете просто объявить свой RouterFunction как @Bean следующим образом:

@Bean
public RouterFunction<ServerResponse> hello() {
    return route(GET("/hello"),
            request -> {
                Mono<String> hi = Mono.just("hi");
                return ServerResponse.ok().contentType(TEXT_PLAIN).body(hi, String.class);
            });
}

Spring Boot защищает вас отбазовые изменения API на поддерживаемых серверах.

Основной метод здесь не похож на типичный основной метод Spring Boot, поэтому я не думаю, что вы на самом деле используете Spring Boot здесь.В любом случае, вот фрагмент кода, который решает вашу проблему;начиная с Reactor Netty 0.8, часть bind() отделена от фактической ожидающей части:

RouterFunction<?> route = RouterFunctions.route(RequestPredicates.GET("/hello"),
                request -> {
                    Mono<String> hi = Mono.just("hi");
                    return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).body(hi, String.class);
                });
HttpHandler httpHandler = RouterFunctions.toHttpHandler(route);
ReactorHttpHandlerAdapter adapter =
        new ReactorHttpHandlerAdapter(httpHandler);
HttpServer server = HttpServer.create().host("localhost").port(8080);
DisposableServer disposableServer = server.handle(adapter).bind().block();
disposableServer.onDispose().block();
...