Какую лучшую архитектуру мы можем использовать для клиентского приложения Netty? - PullRequest
0 голосов
/ 21 марта 2012

Мне нужно разработать Netty-клиент, который принимает сообщения с Notification Server и помещает эти сообщения как запросы Http на другой сервер в режиме реального времени. Я уже написал работающее приложение, которое делает это, но мне нужно добавить многопоточность. На данный момент, я запутался в том, как обрабатывать Netty Channels в многопоточной программе, так как все я загружен традиционным подходом сокетов и потоков.

Когда я пытался разделить запрашивающую часть Netty на метод, он жалуется, что каналы не закрыты. Кто-нибудь может подсказать мне, как справиться с этим? Я хотел бы использовать ExecutionHandler и OrderedMemoryAwareThreadPoolExecutor, но я действительно новичок в этом.

В настоящее время помощь с некоторыми примерами будет очень кстати.

Заранее спасибо.

Ответы [ 2 ]

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

Просто добавьте ExecutionHandler в ChannelPipeline.Это гарантирует, что каждый ChannelUpstreamHandler, добавленный за ExecutionHandler, будет выполняться в дополнительном потоке и поэтому не блокирует рабочий поток.

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

Вы смотрели пример кода на сайте Netty ? TelnetServer , похоже, делает то, о чем вы говорите. Фабрика создает новые обработчики всякий раз, когда получает соединение. Потоки из Executors будут использоваться при каждом новом подключении. Вы можете использовать любой пул потоков и исполнитель там, я подозреваю:

// Configure the server.
ServerBootstrap bootstrap = new ServerBootstrap(
        new NioServerSocketChannelFactory(
                Executors.newCachedThreadPool(),       << change
                Executors.newCachedThreadPool()));     << change

// Configure the pipeline factory.
bootstrap.setPipelineFactory(new TelnetServerPipelineFactory());

// Bind and start to accept incoming connections.
bootstrap.bind(new InetSocketAddress(8080));

TelnetServerHandler затем обрабатывает отдельные результаты.

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

    // Cast to a String first.
    // We know it is a String because we put some codec in TelnetPipelineFactory.
    String request = (String) e.getMessage();

    // Generate and write a response.
    String response;
    boolean close = false;
    if (request.length() == 0) {
        response = "Please type something.\r\n";

Когда телнет готов закрыть соединение, он делает это:

ChannelFuture future = e.getChannel().write(response);
if (close) {
    future.addListener(ChannelFutureListener.CLOSE);
}
...