簡體   English   中英

無法在Spring Webflux 2.1.0中啟動Netty服務器

[英]Can't start Netty server in Spring Webflux 2.1.0.RELEASE

在我的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/

您無需在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更改的影響。

這里的main方法看起來並不像典型的Spring Boot main方法,所以我認為您實際上並不是在這里使用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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM