Как настроить Netty с помощью Spring Boot 2.1 Webflux?

Я хотел бы настроить Netty в моем проекте Spring Boot Webflux. В моем POM я добавил зависимости Spring Boot Webflux и Spring Boot Actuator. Затем я перезаписал метод customize () WebServerFactoryCustomizer, как описано в Документация Spring.

@Component
public class NettyConfiguration implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

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

Затем я реализовал загрузку Netty в моем NettyCustomizer:

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

Таким образом, кажется, что нет способа переопределить загрузку Netty при использовании Webflux. К сожалению, изменение метода addServerCustomizers () на setServerCustomizers () в методе customize () приводит к тем же исключениям. Кто-нибудь знает, как настроить Netty вместе с Spring Boot?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
4 861
2

Ответы 2

Как упоминалось в справочная документация по Spring Boot, вы можете настроить ресурсы, на которых работают сервер и клиент Netty, указав свой собственный ReactorResourceFactory, например:

@Bean
public ReactorResourceFactory resourceFactory() {
    ReactorResourceFactory reactorResourceFactory = new ReactorResourceFactory();
    reactorResourceFactory.setLoopResourcesSupplier(() -> LoopResources.create("custom-prefix"));
    return reactorResourceFactory;
} 

Обратите внимание, что для этого мы используем Абстракция LoopResources, предоставленная Reactor Netty. Это позволяет распределять ресурсы между клиентом и сервером для повышения эффективности.

Не стесняйтесь открывать запросы на улучшения в Reactor Netty или Spring Boot, если вы не можете достичь того, чего хотите.

Хм ... это не то, что я хочу делать. Итак, нет возможности настроить свойства начальной загрузки Netty с помощью Spring Boot Webflux?

mwalter 02.01.2019 16:32

привет просто интересно, имеет ли значение имя метода "resourceFactory ()"? Могу ли я использовать другое имя, чтобы добиться того же?

user1955934 16.09.2019 07:09

Да, вы можете использовать другое имя

Brian Clozel 16.09.2019 07:46

Если вы хотите заменить его своим собственным сервером, вам необходимо удалить некоторые зависимости netty из pom.xml. Однако, если вы хотите настроить конвейер или что-то подобное, я думаю, вы можете управлять конфигурацией веб-сервера при весенней загрузке следующим образом:

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

Другие вопросы по теме