net netty handler方法总是从单个excutor中调用吗?

时间:2016-02-21 07:49:27

标签: java netty

我正在使用DefaultEventExecutorGroup来执行业务处理程序方法。我的理解是,IO事件循环线程会将事件排入DefaultEventExecutorGroup以便执行。来自DefaultEventExecutorGroup的任何线程都将轮询这些事件,并在发生此类事件时执行处理程序方法。如果是,则DefaultEventExecutorGroup的不同线程可以执行相同的通道处理程序方法。因此,我需要同步channelRead() write()方法。这是真的吗?或者是,始终只有来自DefaultEventExecutorGroup的线程中的一个将始终执行处理程序方法,就像IO事件循环线程中的一个总是处理通道操作一样,即通道处理程序始终仅绑定到单个相同的线程,即使管道中有多个事件执行者组?

1 个答案:

答案 0 :(得分:1)

通过Netty 4发布指南,我看到了自4.0发布以来引入的线程模型的一些信息。根据我对它的理解,下面是我的观点:

  来自DefaultEventExecutorGroup的不同线程可以执行相同的操作   渠道处理方法。

将线程分配给处理程序后,此线程处理程序链接将继续,直到取消注册。处理程序方法将始终由同一个线程调用。

  

通道处理程序始终只绑定到同一个线程,即使是   管道中有多个事件执行器组?

如果同一管道中的两个处理程序分配了不同的EventExecutors,则会同时调用它们。如果多个处理程序访问共享数据,则用户必须注意线程安全,即使共享数据仅由同一管道中的处理程序访问。

为了测试这种情况,我尝试了NettyServer two handlers,每个DefaultEventExecutorGroup都有自己的EventLoopGroup group = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(group).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(port)) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new DefaultEventExecutorGroup(10), new EchoServerHandler("Hello")); ch.pipeline().addLast(new DefaultEventExecutorGroup(10), new EchoServerHandler(" WORLD !!!")); } }); 。这些处理程序逐字符地写入和刷新底层通道,延迟为100 ms。第一个处理程序写入&#34; Hello&#34;第二个做一个&#34; WORLD !!!&#34;。

服务器代码:

for(int i = 0; i < message.length(); i++) {
    ctx.write(Unpooled.copiedBuffer(new byte[] {message.getBytes()[i]}));
    ctx.flush();
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {}

服务器处理程序代码:

HeWlOlRoLD !!!

在客户端,一旦建立连接,我看到输出像H eWlORlLoD !!!Well-defined thread model等混乱。我相信这是你要问的情景。

有关详情,请参阅以下链接中有关Netty 4.0 threading modelWrite Ordering - Mix EventLoop thread and other threadsVar wrd, sentence : string; begin wrd := inputbox('Word input', ' Enter any word to build a sentence (press "xxx" to stop)',''); redOut.Clear; while (wrd <> 'xxx') do begin sentence := sentence + wrd + ' '; wrd := inputbox('Word input', ' Enter any word to build a sentence (press"xxx" to stop)',''); end; redOut.Lines.Add(sentence); 部分。