почему 3-й писатель соединения TCP был заблокирован пулом рабочих потоков netty с размером 2 - PullRequest
0 голосов
/ 07 марта 2012

все.Я тестирую несколько простых примеров, но обнаружив, что если я установлю размер пула рабочих потоков с фиксированным 2 при запуске NIOServer, а затем попытаюсь подключить netty-сервер с помощью еще 2 соединений tcp (подключение и не закрытие), я обнаружу, что 3-е и 3-е подключение + могутподключите сервер, но операция записи будет заблокирована, отметив переход в мой обработчик.Только если я закрою 1-е или 2-е соединение, 3-й запрос на запись может попасть в мой обработчик, и мой хандер ничего не сделает, просто напечатает helloworld.

Основной код:

ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newSingleThreadExecutor(),
                Executors.newFixedThreadPool(2)));

bootstrap.setPipelineFactory(new DispatchServerPipeLineFactory());

bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);

bootstrap.bind(new InetSocketAddress(8080));

только один код обработчика:

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

    System.out.println("hello");

    super.messageReceived(ctx, e);

}

Кто-нибудь может мне помочь?я должен использовать Executors.newCachedThreadPool ()?

Ответы [ 3 ]

2 голосов
/ 07 марта 2012

Используйте Executors.newChachedThreadPool () и укажите рабочую команду в конструкторе NioServerSocketChannelFactory, и все будет работать.

0 голосов
/ 27 мая 2019

На самом деле при использовании Netty вы можете назначить задачу обработки данных на ServerHandler.Требуется, чтобы NioEventLoopGroup прослушивал клиентские соединения, а EventExecutorGroup выполнял манипуляции (получал данные и управлял тем, что с ними делать).Таким образом, входящие соединения не будут заблокированы;но может быть ограничен приведенным ниже фрагментом.

ServerBootstrap (). childOption (ChannelOption.SO_BACKLOG, 10)

Для получения дополнительной информации вы можете посетить эту ссылку: Рабочая группа против обработчика Потокв нетто

0 голосов
/ 07 марта 2012

Вы настроили фиксированный пул потоков с двумя потоками, так что все отправленные задания после 2-го будут ждать, пока поток не станет свободным. Затем вы создаете два соединения, которые потребляют эти два потока. Затем вы создаете третье соединение. Так что это ждет. Это то, что вы сказали, чтобы сделать это. Если вы этого не хотите, выделите больше потоков или используйте другой пул потоков, в зависимости от того, что вы на самом деле хотите сделать, чего вы нам не сказали.

...