为什么channel.pipeline()。get()在Netty4中返回一个空句柄?

时间:2014-10-15 19:54:51

标签: java netty

按照此示例 Netty4 confusion with simple example ,我试图从管道中的特定处理程序获取服务器的响应,如下所示:

ChannelFuture future = CLIENT.start();
CLIENT.sendCmd(MyServerHandler.STATUS_CMD);
future.channel().closeFuture().awaitUninterruptibly();
MyClientHandler handler = future.channel().pipeline().get(MyClientHandler.class);
String response = handler.getResponse();

getResponse()方法只是一个属性字段getter,它从channelRead0()方法获取服务器的响应,如下所示:

public class MyClientHandler extends SimpleChannelInboundHandler<String> {
    private String _response;

    public String getResponse()
    {
        return( _response );
    }

    protected void channelRead0(ChannelHandlerContext ctx, String input)
        throws Exception
    {
        _response = input;
    }

    // blah...
}

在循环中创建许多客户端时,几乎有一半会抛出NullPointerException,因为出于某种原因, handler 对象为NULL!

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

经过长时间的调试,我发现必须在 closeFuture()。awaitUninterruptibly()之前调用 pipeline()。get()。我猜这个处理程序已经在我的原始代码中被丢弃了。但为什么? 频道对象尚未关闭!

MyClientHandler handler = future.channel().pipeline().get(MyClientHandler.class);
future.channel().closeFuture().awaitUninterruptibly();
String response = handler.getResponse();

我希望有些“netty4 nerd”可以验证这个......?