Netty只处理一个线程中的消息

时间:2014-02-20 13:14:53

标签: java multithreading netty

我在netty方面遇到了一些问题。

几年前我使用了smartfox服务器1.6x,它的多线程模型让我在不同的线程中为我的连接处理消息。而且这个功能迫使我编写了一些线程同步代码,以便正确处理所有消息。

现在我使用netty,因为它对我的目标来说是非常有用的产品。

所以,我实现了一些基于服务器的逻辑。我的测试是以下

  • 服务器将消息添加到队列,处理每条消息,当前线程休眠3秒
  • 客户端每秒发送大约10封邮件

我看到在第一封邮件(前十位)未处理之前(通常约为30秒),第二包邮件未在并行线程中处理。


所以主要问题是:

netty是否仅在一个线程中处理一个连接的所有消息? 如果是这样,我应该在不同的线程中实现一些额外的代码来实现,或者单线程的单连接模型是否运行良好?


Netty配置:

    _boss = new NioEventLoopGroup(1);
    _worker = new NioEventLoopGroup(8);

    _bootstrap = new ServerBootstrap();
    _bootstrap.group(_boss, _worker)
        .channel(NioServerSocketChannel.class)
        .childHandler(new NettyChannelInitializer())
        .option(ChannelOption.SO_BACKLOG, 128)
        .childOption(ChannelOption.SO_KEEPALIVE, true);
    _bootstrap.bind(_port).sync();

NettyChannelInitializer:

private static final ExtentionHandler SharedExtentionHandler = new ExtentionHandler();
private static final EventExecutorGroup ExtentionEventThreadPool = new DefaultEventExecutorGroup(20);

public void initChannel(SocketChannel channel) throws Exception 
{
    ChannelPipeline pipeline = channel.pipeline();
    pipeline.addLast(ExtentionEventThreadPool, "extention", SharedExtentionHandler);
}

1 个答案:

答案 0 :(得分:1)

Netty确保以有序方式处理同一频道的事件。即你从来没有订购问题,但是当你处理的连接数量只有一个时,你就不会利用并行性。如果你对无序执行没问题,你可以简单地将你的任务委托给你可以从JDK获得的普通ExecutorService