java - 如何使用 Spring Boot 2.1 Webflux 定制 Netty?

标签 java spring-boot spring-webflux reactor-netty

我想在我的 Spring Boot Webflux 项目中自定义 Netty。在我的 POM 中,我添加了 Spring Boot Webflux 和 Spring Boot Actuator 依赖项。接下来,我重写了 WebServerFactoryCustomizer 的customize() 方法,如 Spring documentation 中所述。 .

@Component
public class NettyConfiguration implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

    @Override
    public void customize(NettyReactiveWebServerFactory factory) {
        factory.addServerCustomizers(new NettyCustomizer());
    }
}

然后我在 NettyCustomizer 中实现了 Netty 引导:

public class NettyCustomizer implements NettyServerCustomizer {

    private final EventLoopGroup bossGroup = new NioEventLoopGroup(22);
    private final EventLoopGroup workerGroup = new NioEventLoopGroup();

    @Override
    public HttpServer apply(HttpServer httpServer) {
        return httpServer.tcpConfiguration(tcpServer ->
                tcpServer.bootstrap(serverBootstrap ->
                        serverBootstrap
                                .group(bossGroup, workerGroup)
                                .channel(NioServerSocketChannel.class)
                                .handler(new LoggingHandler(LogLevel.DEBUG))
                                .childHandler(new ChannelInitializer<SocketChannel>() {
                                    @Override
                                    public void initChannel(final SocketChannel socketChannel) {
                                        socketChannel.pipeline().addLast(new BufferingInboundHandler());
                                    }
                                })
                                .option(ChannelOption.SO_BACKLOG, 128)
                                .childOption(ChannelOption.SO_KEEPALIVE, true))
                        .port(8899)
        );
    }
}

现在,如果我启动 Spring Boot 应用程序,我会收到“无法启动 Netty”错误。

org.springframework.boot.web.server.WebServerException: Unable to start Netty
Caused by: java.lang.IllegalStateException: group set already

因此,如果使用 Webflux,似乎无法覆盖 Netty 引导。不幸的是,将customize() 方法中的addServerCustomizers() 方法更改为setServerCustomizers() 会导致相同的异常。有人知道如何与 Spring Boot 一起定制 Netty 吗?

最佳答案

如果想替换成自己的服务器,需要从pom.xml中删除一些netty的依赖。但是,如果你想配置管道或类似的东西,我想你可以在 Spring Boot 中操作 Web 服务器配置,如下所示;

@Override
public void customize(WebServerFactory factory) {
    NettyReactiveWebServerFactory nettyReactiveWebServerFactory = (NettyReactiveWebServerFactory) factory;
    nettyReactiveWebServerFactory.addServerCustomizers(builder -> builder
            .tcpConfiguration(tcpServer -> tcpServer.bootstrap(i -> i.handler(new ObjectEchoServerHandler("1")))));
}

关于java - 如何使用 Spring Boot 2.1 Webflux 定制 Netty?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53948033/

相关文章:

java - 静态嵌套类线程安全 - java

Java:如果可以与两种或多种类型的对象进行比较,则可以与泛型进行比较

java - 热衷于从 spring 响应式(Reactive) ClientRequest 获取字符串形式的正文?

Spring-Boot WebClient block() 方法返回错误 java.lang.IllegalStateException

java - Spring+hibernate java.lang.StackOverflowError

java - 应用程序需要 JRE 版本

spring - 在 Oracle Timestamp 列中以 UTC 格式保存日期

spring - spring starter 项目中的服务 url 是什么?默认服务 url https ://start. spring.io 的替代方案

java - 如何传递信息,反对thymeleaf

java - webflux如何将当前登录Mono字符串传递给flux