2013-07-20 2 views
0

Я использую Netty 4 в своем проекте. Я обнаружил, что он назначает один поток каждому каналу (подключению) и использует его для приема и отправки данных.
В моем приложении я получаю запросы с канала, обрабатываю их в разных потоках (мои собственные потоки), а затем отправляю ответы обратно через один и тот же канал. Из-за использования одного потока для входящего и исходящего, обработка полученных пакетов ожидает, когда поток отправляет пакеты.
Есть ли способ использовать 2 потока для каждого канала, один для приема (обработка входящих данных) и один для отправки (обработка исходящих данных)?Netty 4 - Используйте разные темы для отправки и получения

+0

Всегда использовать одну нить ... Я не понимаю, почему это «ждать» будет для приема пакетов. Это потому, что вы «блокируете»? –

+0

спасибо. Когда приложение отправляет некоторые данные, поток ввода-вывода занят для отправки данных и в это время (при отправке данных) обрабатываются не входящие данные (означает, что MessageReceived (..) не вызывается) – hyda

+0

Нет способа ... netty всегда использовать тот же поток для приема и отправки. Я просто удивляюсь, почему он «займет так много времени» для отправки. Можете ли вы дать больше информации –

ответ

0

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

2

С помощью другой EventExecutorGroup вы можете поместить логику отправителя и получателя в разные потоки, то есть отправить обработчик в одну EventExecutorGroup и обработчик записи в другой.

Но обычно для отправки достаточно быстро, и вам не нужно использовать свою собственную нить. Для получения и последовательной длительной обработки вам, вероятно, понадобится использовать собственный поток, поместив логику в группу DefaultEventExecutorGroup, которая предоставляет пул потоков, которые будут использоваться всеми подключенными каналами, и давая один поток только для одного такого канала.

Пример кода ниже:

final EventExecutorGroup bizEventLoopGroup = new  DefaultEventExecutorGroup(50); 

public void initChannel(Channel ch) throws Exception { 
     ChannelPipeline p = ch.pipeline(); 
//other code... 

p.addLast(bizEventLoopGroup, LOGIN_HANDLER, new LoginHandler()); 
//LoginHandler is time-consuming since it will need to ensure sending back all previously cached message. 
Смежные вопросы